ajout de la bannière de fin

This commit is contained in:
Philippe Roy 2022-03-29 14:12:58 +02:00
parent 2b52c653e9
commit 51b423a0cb
17 changed files with 324 additions and 202 deletions

BIN
asset/sounds/archer.wav Normal file

Binary file not shown.

BIN
asset/sounds/build.wav Normal file

Binary file not shown.

BIN
asset/sounds/click.ogg Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,27 @@
==============================
Glest Game 3.2.1 License
==============================
Except where otherwise noted, all of the documentation, multimedia and software included in the Glest Game setup package is copyrighted by The Glest Team.
Copyright (C) 2001-2009 The Glest Team. All rights reserved.
This software is provided without any express or implied warranty. In no event shall the author be held liable for any damages arising from the use of this software.
This software may be redistributed freely, but all redistributions must retain all occurences of the above copyright notice and web site addresses that are currently in place.
email: contact_game@glest.org
web: http://glest.org/
The Glest Team:
Programmer: Martiño Figueroa
Sound artist: Jose Luis González
2D and 3D artist: Tucho Fernández
2D artist and web: José Zanni
SDL port: Matze Braun
Animation: Félix Menéndez
3D artist: Marcos Caruncho

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
asset/sounds/life.ogg Normal file

Binary file not shown.

BIN
asset/sounds/mage.wav Normal file

Binary file not shown.

BIN
codetower-14.blend Normal file

Binary file not shown.

389
ct.py
View File

@ -1,5 +1,7 @@
import importlib import importlib
import bge # Bibliothèque Blender Game Engine (UPBGE) import bge # Blender Game Engine (UPBGE)
import bpy # Blender
import aud # Sounds
import math import math
import time import time
import sys import sys
@ -24,26 +26,30 @@ import ct_map
# #
############################################################################### ###############################################################################
# Import dynamique des fichiers Python élève et vagues # Dynamic import user file
sys.setrecursionlimit(10**5) # Limite sur la récursivité (valeur par défaut : 1000) -> segfault de Blender sys.setrecursionlimit(10**5) # Limite sur la récursivité (valeur par défaut : 1000) -> segfault de Blender
importlib.invalidate_caches() importlib.invalidate_caches()
ct_wv = importlib.import_module('ct_waves') # waves script ct_wv = importlib.import_module('ct_waves') # waves script
ct_cmd = importlib.import_module('ct_cmd') # user script (commands) ct_cmd = importlib.import_module('ct_cmd') # user script (commands)
# Récupérer la scène UPBGE # UPBGE scene
scene = bge.logic.getCurrentScene() scene = bge.logic.getCurrentScene()
eevee = bpy.context.scene.eevee
# Récupérer le fichier de config # Config file
# print (os.getcwd()) # print (os.getcwd())
ct_config = ET.parse('ct_config.xml') ct_config = ET.parse('ct_config.xml')
ct_config_tree = ct_config.getroot() ct_config_tree = ct_config.getroot()
# Couleurs # Colors
color_magenta = [0.800, 0.005, 0.315,1]
color_orange = [0.799, 0.130, 0.063,1]
color_white = [0.8, 0.8, 0.8, 1]
color_yellow = [0.8, 0.619, 0.021, 1]
color_black = [0, 0, 0, 1]
color_magenta = [0.800, 0.005, 0.315,1] # bouton non activable : magenta color_endbanner_bluelight = [0.361, 0.527, 0.716, 1]
color_orange = [0.799, 0.130, 0.063,1] # bouton activable : orange color_endbanner_bluedark = [0.130, 0.254, 0.407, 1]
color_white = [0.8, 0.8, 0.8, 1] # bouton focus : blanc
color_yellow = [0.8, 0.619, 0.021, 1] # bouton activé : jaune
color_text = [0, 0, 0, 1] # Noir color_text = [0, 0, 0, 1] # Noir
color_text_red = [0.799, 0.031, 0.038, 1] color_text_red = [0.799, 0.031, 0.038, 1]
@ -53,8 +59,14 @@ color_cmd_hl = [0.8, 0.619, 0.021, 1] # jaune
color_link = [0.024, 0.006, 0.8, 1] # bleu color_link = [0.024, 0.006, 0.8, 1] # bleu
color_link_hl = [0.8, 0.005, 0.315, 1] # majenta color_link_hl = [0.8, 0.005, 0.315, 1] # majenta
# Constantes UPBGE # Sounds
audiodev = aud.Device()
snd_click = aud.Sound('asset/sounds/click.ogg')
sndbuff_click = aud.Sound.cache(snd_click)
snd_construct = aud.Sound('asset/sounds/click_construct.ogg')
sndbuff_construct = aud.Sound.cache(snd_construct)
# UPBGE constants
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED JUST_RELEASED = bge.logic.KX_INPUT_JUST_RELEASED
ACTIVATE = bge.logic.KX_INPUT_ACTIVE ACTIVATE = bge.logic.KX_INPUT_ACTIVE
@ -69,6 +81,7 @@ def cmd_tower_construct(cont):
obj = cont.owner obj = cont.owner
obj_Hl= scene.objects[obj.name+"-Hl"] obj_Hl= scene.objects[obj.name+"-Hl"]
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Terrain']['manip_mode']==0: if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Terrain']['manip_mode']==0:
audiodev.play(sndbuff_construct)
if scene.objects['Terrain']['construct_mode']==True: if scene.objects['Terrain']['construct_mode']==True:
scene.objects['Terrain']['construct_mode']=False scene.objects['Terrain']['construct_mode']=False
obj.worldScale=[1, 1, 1] obj.worldScale=[1, 1, 1]
@ -112,6 +125,7 @@ def points_maj (cont):
scene.objects['Coins_text']['Text']=str(scene.objects['Points']['coins']) scene.objects['Coins_text']['Text']=str(scene.objects['Points']['coins'])
scene.objects['Level_text']['Text']=str(scene.objects['Points']['level'])+"/"+str(scene.objects['Points']['level_max']) scene.objects['Level_text']['Text']=str(scene.objects['Points']['level'])+"/"+str(scene.objects['Points']['level_max'])
scene.objects['Minions_text']['Text']=str(scene.objects['Points']['minions']) scene.objects['Minions_text']['Text']=str(scene.objects['Points']['minions'])
scene.objects['Points']['tics'] +=1
# Level trop élevé # Level trop élevé
if scene.objects['Points']['level'] > scene.objects['Points']['level_max'] : if scene.objects['Points']['level'] > scene.objects['Points']['level_max'] :
@ -119,10 +133,10 @@ def points_maj (cont):
if scene.objects['Level_text'].color == color_text_red and scene.objects['Points']['level'] <= scene.objects['Points']['level_max']: if scene.objects['Level_text'].color == color_text_red and scene.objects['Points']['level'] <= scene.objects['Points']['level_max']:
scene.objects['Level_text'].color = color_text scene.objects['Level_text'].color = color_text
# Fin de la vague # Fin de la vague
if scene.objects['Terrain']['thread_wave']==False: if scene.objects['Terrain']['thread_wave']==False and scene.objects['Terrain']['map_run'] == True :
if scene.objects['Points']['minions']==0: if scene.objects['Points']['minions_run']==0 :
terrain_fin () terrain_end ()
############################################################################### ###############################################################################
# Terrain # Terrain
@ -163,18 +177,19 @@ def scn_terrain_mo(cont):
# Initialisation lors du chargement du terrain # Initialisation lors du chargement du terrain
def terrain_init (cont): def terrain_init (cont):
# Cacher la bannière de fin
scene.objects['End'].setVisible(False,True)
scene.objects['End']['timer']=0
# Pile des draws # Pile des draws
scene.objects['Terrain']['draw_process']=False scene.objects['Terrain']['draw_process']=False
scene.objects['Terrain']['draw_list']=[] scene.objects['Terrain']['draw_list']=[]
# Mise à zéro des compteurs # Configuration du moteur de rendu
scene.objects['Points']['lifes']=10 if scene.objects['Terrain']['speed']<4:
scene.objects['Points']['lifes_max']=10 eevee.use_eevee_smaa = True
scene.objects['Points']['coins']=0 else:
scene.objects['Points']['level']=0 eevee.use_eevee_smaa = False
scene.objects['Points']['level_max']=1
scene.objects['Points']['minions']=0
scene.objects['Level_text'].color = color_text
# Recherche les tuiles non constructibles (chemin) # Recherche les tuiles non constructibles (chemin)
scene.objects['Terrain']['scene_tile_noncontruct'] = [] scene.objects['Terrain']['scene_tile_noncontruct'] = []
@ -187,108 +202,91 @@ def terrain_init (cont):
obj_i.collisionGroup=2 obj_i.collisionGroup=2
if "tile_hill" in obj_i.name: if "tile_hill" in obj_i.name:
obj_i.collisionGroup=2 obj_i.collisionGroup=2
scene.objects['Terrain']['scene_tile_tower']= []
# Init de la carte 1 # Init de la carte 1
ct_map.map1_init() ct_map.map1_init()
ct_map.map1_reset()
# scene.objects['Level_text'].color = color_text
# Mise en route et pause du cycle # Mise en route et pause du cycle
def terrain_run (cont): def terrain_run ():
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Terrain']['manip_mode']==0: audiodev.play(sndbuff_click)
# Pause # Pause
if scene.objects['Terrain']['run'] == True: if scene.objects['Terrain']['run'] == True:
scene.objects['Terrain']['run']=False
scene.objects['Pause'].setVisible(False,False)
scene.objects['Pause-Hl'].setVisible(False,False)
scene.objects['Run-Hl'].setVisible(True,False)
for obj_i in scene.objects: # Pause des Steerings
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
obj_i.actuators['Steering'].velocity=0
else:
# Run
scene.objects['Terrain']['run']=True
scene.objects['Run'].setVisible(False,False)
scene.objects['Run-Hl'].setVisible(False,False)
scene.objects['Pause-Hl'].setVisible(True,False)
# Démarrage de la map
if scene.objects['Terrain']['thread_run']==False:
for obj_i in scene.objects: # Supprimer les tours
if "type_tower" in obj_i.getPropertyNames() :
obj_i.endObject()
scene.objects['Points']['level']= scene.objects['Points']['level'] - 1
if "type_towerminion" in obj_i.getPropertyNames() :
obj_i.endObject()
scene.objects['Terrain']['scene_tile_tower']= []
scene.objects['Stop'].setVisible(True,False)
scene.objects['Terrain']['thread_run']=True
# importlib.reload(ct_cmd) # Lecture dynamique du script python (risque de Segfault de Blender)
# importlib.reload(ct_vg) # Lecture dynamique du script python (risque de Segfault de Blender)
ct_cmd.start() # Execution des commandes
ct_wv.start() # Lancement des vagues
# Arrêt de la pause
else:
for obj_i in scene.objects: # Relance des Steerings
if "type_minion" in obj_i.getPropertyNames():
obj_i.actuators['Steering'].velocity=obj_i.components['Minion'].args['speed']*scene.objects['Terrain']['speed']
# Vitesse du jeu
def terrain_runspeed (cont):
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Terrain']['manip_mode']==0:
obj = cont.owner
speed_mode=[0.25, 0.5, 1,2,4,10]
speed_mode_txt=["1/4", "1/2", "1", "2","4","10"]
i=speed_mode.index(scene.objects['Terrain']['speed'])
# Affichage
if obj.name=="Speed_up" and i<5:
scene.objects['Terrain']['speed']=speed_mode[i+1]
scene.objects['Text_speed']['Text']=speed_mode_txt[i+1]
if obj.name=="Speed_down" and i>0:
scene.objects['Terrain']['speed']=speed_mode[i-1]
scene.objects['Text_speed']['Text']=speed_mode_txt[i-1]
# Maj des Nears (Towers) et des Steerings (Minions)
for obj_i in scene.objects:
if "type_tower" in obj_i.getPropertyNames() and "Near" in obj_i.sensors :
obj_i.sensors['Near'].skippedTicks =round(1/(obj_i.components['Tower'].args['speed']*scene.objects['Terrain']['speed']))
print (obj_i.sensors['Near'].skippedTicks)
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
obj_i.actuators['Steering'].velocity=obj_i.components['Minion'].args['speed']*scene.objects['Terrain']['speed']
# Maj du fichier de config (vitesse du jeu : data/config/speed)
ct_config_tree[0][0].text=str(scene.objects['Terrain']['speed'])
buffer_xml = ET.tostring(ct_config_tree)
with open("ct_config.xml", "wb") as f:
f.write(buffer_xml)
# Arrêt et réinitialisation du cycle
def terrain_stop (cont):
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Terrain']['manip_mode']==0:
# Arrêt des threads utilisateurs
scene.objects['Terrain']['run']=False scene.objects['Terrain']['run']=False
scene.objects['Terrain']['thread_run']=False
ct_cmd.stop() # Stop des commandes
ct_wv.stop() # Stop des vagues
# Supprimer les enemis
for obj_i in scene.objects:
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
obj_i.endObject()
scene.objects['Points']['minions']=0
# Commandes
scene.objects['Pause'].setVisible(False,False) scene.objects['Pause'].setVisible(False,False)
scene.objects['Pause-Hl'].setVisible(False,False) scene.objects['Pause-Hl'].setVisible(False,False)
scene.objects['Run'].setVisible(True,False) scene.objects['Run-Hl'].setVisible(True,False)
scene.objects['Stop'].setVisible(False,False) for obj_i in scene.objects: # Pause des Steerings
scene.objects['Stop-Hl'].setVisible(False,False) if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
obj_i.actuators['Steering'].velocity=0
# Run
else :
scene.objects['Terrain']['run']=True
scene.objects['Run'].setVisible(False,False)
scene.objects['Run-Hl'].setVisible(False,False)
scene.objects['Pause-Hl'].setVisible(True,False)
# Démarrage de la map
if scene.objects['Terrain']['thread_run']==False:
scene.objects['Stop'].setVisible(True,False)
# Mise à zéro des compteurs
ct_map.map1_reset()
# Supprimer les tours
for obj_i in scene.objects:
if "type_tower" in obj_i.getPropertyNames() :
obj_i.endObject()
if "type_towerminion" in obj_i.getPropertyNames() :
obj_i.endObject()
scene.objects['Terrain']['scene_tile_tower']= []
# Scripts utilisateur et vagues
scene.objects['Terrain']['map_run'] = True
scene.objects['Terrain']['thread_run']=True
scene.objects['Points']['time_begin']=time.localtime()
# importlib.reload(ct_cmd) # Lecture dynamique du script python (risque de Segfault de Blender)
# importlib.reload(ct_vg) # Lecture dynamique du script python (risque de Segfault de Blender)
ct_cmd.start() # Execution du script utilisateur
ct_wv.start() # Lancement du script des vagues
# Arrêt de la pause
else:
for obj_i in scene.objects: # Relance des Steerings
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
obj_i.actuators['Steering'].velocity=obj_i.components['Minion'].args['speed']*scene.objects['Terrain']['speed']
# Arrêt et réinitialisation du cycle
def terrain_stop ():
audiodev.play(sndbuff_click)
# Arrêt des threads utilisateurs
scene.objects['Terrain']['run']=False
scene.objects['Terrain']['thread_run']=False
scene.objects['Terrain']['map_run'] = False # Ne pas afficher la bannière de fin
ct_cmd.stop() # Stop du script utilisateur
ct_wv.stop() # Stop du script des vagues
# Supprimer les enemis
for obj_i in scene.objects:
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
obj_i.endObject()
scene.objects['Points']['minions']=0
scene.objects['Points']['minions_run']=0
# Commandes
scene.objects['Pause'].setVisible(False,False)
scene.objects['Pause-Hl'].setVisible(False,False)
scene.objects['Run'].setVisible(True,False)
scene.objects['Stop'].setVisible(False,False)
scene.objects['Stop-Hl'].setVisible(False,False)
# Fin naturelle du cycle # Fin naturelle du cycle
def terrain_fin (): def terrain_end ():
scene.objects['Terrain']['run']=False scene.objects['Terrain']['run']=False
scene.objects['Terrain']['thread_run']=False scene.objects['Terrain']['thread_run']=False
@ -299,6 +297,92 @@ def terrain_fin ():
scene.objects['Stop'].setVisible(False,False) scene.objects['Stop'].setVisible(False,False)
scene.objects['Stop-Hl'].setVisible(False,False) scene.objects['Stop-Hl'].setVisible(False,False)
# Affichage des résultats
if scene.objects['End']['timer']== 0:
scene.objects['Terrain']['manip_mode']=9 # Fenêtre modale
maptime_mn=time.localtime().tm_min-scene.objects['Points']['time_begin'].tm_min
maptime_sec=time.localtime().tm_sec-scene.objects['Points']['time_begin'].tm_sec
if maptime_sec<0:
maptime_mn-=1
maptime_sec+=60
scene.objects['Endbanner_wave_text']['Text']="Wave \n"+str(scene.objects['Points']['wave'])
if maptime_mn<=99:
scene.objects['Endbanner_points_text']['Text']="Level "+str(scene.objects['Points']['level_max'])+"\n Time "+ str(maptime_mn)+"'"+ str(maptime_sec)+"\""
else:
scene.objects['Endbanner_points_text']['Text']="Level "+str(scene.objects['Points']['level_max'])+"\n Time "+ str(maptime_mn)+"'"
scene.objects['Endbanner'].color = color_endbanner_bluelight
scene.objects['Endbanner_wave_text'].color = color_black
scene.objects['Endbanner_points_text'].color = color_black
scene.objects['Endbanner_ok_text'].color = color_black
scene.objects['End'].setVisible(True,True)
scene.objects['End']['init_localPosition']= [scene.objects['End'].localPosition.x, scene.objects['End'].localPosition.y, scene.objects['End'].localPosition.z]
pas=0.5
scene.objects['End'].localPosition.y=scene.objects['End'].localPosition.y-1*pas
scene.objects['End'].localPosition.z=scene.objects['End'].localPosition.z+0.85*pas
scene.objects['End']['timer']=scene.objects['End']['timer']+1
if scene.objects['End']['timer']== 40:
scene.objects['Terrain']['map_run'] = False
# Vitesse du jeu
def terrain_speed (obj):
audiodev.play(sndbuff_click)
speed_mode=[0.25, 0.5, 1,2,4,10]
speed_mode_txt=["1/4", "1/2", "1", "2","4","10"]
i=speed_mode.index(scene.objects['Terrain']['speed'])
# Affichage
if obj.name=="Speed_up" and i<5:
scene.objects['Terrain']['speed']=speed_mode[i+1]
scene.objects['Text_speed']['Text']=speed_mode_txt[i+1]
if obj.name=="Speed_down" and i>0:
scene.objects['Terrain']['speed']=speed_mode[i-1]
scene.objects['Text_speed']['Text']=speed_mode_txt[i-1]
# Maj des Nears (Towers) et des Steerings (Minions)
for obj_i in scene.objects:
if "type_tower" in obj_i.getPropertyNames() and "Near" in obj_i.sensors :
obj_i.sensors['Near'].skippedTicks =round(1/(obj_i.components['Tower'].args['speed']*scene.objects['Terrain']['speed']))
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames():
obj_i.actuators['Steering'].velocity=obj_i.components['Minion'].args['speed']*scene.objects['Terrain']['speed']
# Configuration du moteur de rendu
if scene.objects['Terrain']['speed']<4:
eevee.use_eevee_smaa = True
else:
eevee.use_eevee_smaa = False
# Maj du fichier de config (vitesse du jeu : data/config/speed)
ct_config_tree[0][0].text=str(scene.objects['Terrain']['speed'])
buffer_xml = ET.tostring(ct_config_tree)
with open("ct_config.xml", "wb") as f:
f.write(buffer_xml)
# Fermer la page de fin
def endbanner_hl(cont):
if cont.sensors['MO'].status == JUST_ACTIVATED:
scene.objects['Endbanner'].color = color_white
scene.objects['Endbanner_wave_text'].color = color_white
scene.objects['Endbanner_points_text'].color = color_white
scene.objects['Endbanner_ok_text'].color = color_white
if cont.sensors['MO'].status == JUST_RELEASED:
scene.objects['Endbanner'].color = color_endbanner_bluelight
scene.objects['Endbanner_wave_text'].color = color_black
scene.objects['Endbanner_points_text'].color = color_black
scene.objects['Endbanner_ok_text'].color = color_black
def endbanner_close(cont):
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive :
audiodev.play(sndbuff_click)
scene.objects['Terrain']['manip_mode']=0
scene.objects['End'].localPosition.y=scene.objects['End']['init_localPosition'][0]
scene.objects['End'].localPosition.y=scene.objects['End']['init_localPosition'][1]
scene.objects['End'].localPosition.z=scene.objects['End']['init_localPosition'][2]
scene.objects['End'].setVisible(False,True)
scene.objects['Endbanner'].color = [0.592, 0.68, 0.407, 1]
scene.objects['Endbanner_wave_text'].color = color_black
scene.objects['Endbanner_points_text'].color = color_black
scene.objects['End']['timer']= 0
############################################################################### ###############################################################################
# Commandes # Commandes
############################################################################### ###############################################################################
@ -314,9 +398,10 @@ def cmd_init():
scene.objects['Construc-Hl'].setVisible(False,False) scene.objects['Construc-Hl'].setVisible(False,False)
scene.objects['Map_text'].setVisible(False,False) scene.objects['Map_text'].setVisible(False,False)
scene.objects['Tower_construc_mode'].setVisible(False,False)
scene.objects['Text_info-1'].setVisible(False,False) scene.objects['Text_info-1'].setVisible(False,False)
scene.objects['Text_info-2'].setVisible(False,False) scene.objects['Text_info-2'].setVisible(False,False)
scene.objects['Tower_construc_mode'].setVisible(False,False)
scene.objects['Terrain']['map_run'] = False
# scene.objects['Raz-vue-Hl'].setVisible(False,False) # scene.objects['Raz-vue-Hl'].setVisible(False,False)
# scene.objects['Aide-cmd-Hl'].setVisible(False,False) # scene.objects['Aide-cmd-Hl'].setVisible(False,False)
@ -374,11 +459,27 @@ def cmd_hl(cont):
scene.objects['Stop-Hl'].setVisible(False,False) scene.objects['Stop-Hl'].setVisible(False,False)
scene.objects['Stop'].setVisible(True,False) scene.objects['Stop'].setVisible(True,False)
# Click sur les commandes
def cmd_click (cont):
obj = cont.owner
if cont.sensors['Click'].status == JUST_ACTIVATED and cont.sensors['MO'].positive and scene.objects['Terrain']['manip_mode']==0:
if obj.name=="Pause" or obj.name=="Run":
terrain_run ()
if obj.name=="Stop":
terrain_stop ()
if obj.name=="Speed_up" or obj.name=="Speed_down":
terrain_speed (obj)
############################################################################### ###############################################################################
# Gestion du clavier # Gestion du clavier
############################################################################### ###############################################################################
# Mode : Pan(1) avec Shift, Zoom (2) avec Ctrl # Mode :
# 0 : rien (par défaut)
# 1 : Pan avec Shift
# 2 : Zoom avec Ctrl
# 9 : Fenêtre modale
def mode(cont): def mode(cont):
obj = cont.owner obj = cont.owner
keyboard = bge.logic.keyboard keyboard = bge.logic.keyboard
@ -414,66 +515,12 @@ def mode(cont):
# Touche F5 -> Run et Pause # Touche F5 -> Run et Pause
if JUST_ACTIVATED in keyboard.inputs[bge.events.F5KEY].queue: if JUST_ACTIVATED in keyboard.inputs[bge.events.F5KEY].queue:
terrain_run ()
# Pause
if scene.objects['Terrain']['run'] == True:
scene.objects['Terrain']['run']=False
scene.objects['Pause'].setVisible(False,False)
scene.objects['Run'].setVisible(True,False)
for obj_i in scene.objects: # Pause des Steerings
if "type_minion" in obj_i.getPropertyNames() and "type_towerminion" not in obj_i.getPropertyNames() :
obj_i.actuators['Steering'].velocity=0
# Run
else:
scene.objects['Terrain']['run']=True
scene.objects['Run'].setVisible(False,False)
scene.objects['Pause'].setVisible(True,False)
# Démarrage de la map
if scene.objects['Terrain']['thread_run']==False:
for obj_i in scene.objects: # Supprimer les tours
if "type_tower" in obj_i.getPropertyNames() :
obj_i.endObject()
scene.objects['Points']['level']= scene.objects['Points']['level'] - 1
if "type_towerminion" in obj_i.getPropertyNames() :
obj_i.endObject()
scene.objects['Terrain']['scene_tile_tower']= []
scene.objects['Stop'].setVisible(True,False)
scene.objects['Terrain']['thread_run']=True
# importlib.reload(ct_cmd) # Lecture dynamique du script python (risque de Segfault de Blender)
# importlib.reload(ct_vg) # Lecture dynamique du script python (risque de Segfault de Blender)
ct_cmd.start() # Execution des commandes
ct_wv.start() # Lancement des vagues
# Arrêt de la pause
else:
for obj_i in scene.objects: # Relance des Steerings
if "type_minion" in obj_i.getPropertyNames():
obj_i.actuators['Steering'].velocity=obj_i.components['Minion'].args['speed']*scene.objects['Terrain']['speed']
# Touche F6 -> Stop / Init # Touche F6 -> Stop / Init
if JUST_ACTIVATED in keyboard.inputs[bge.events.F6KEY].queue: if JUST_ACTIVATED in keyboard.inputs[bge.events.F6KEY].queue:
if scene.objects['Terrain']['thread_run']==True: if scene.objects['Terrain']['thread_run']==True:
terrain_stop ()
# Arrêt des threads utilisateurs
scene.objects['Terrain']['run']=False
scene.objects['Terrain']['thread_run']=False
ct_cmd.stop() # Stop des commandes
ct_wv.stop() # Stop des vagues
# Supprimer les enemis
for obj_i in scene.objects:
if "type_minion" in obj_i.getPropertyNames():
obj_i.endObject()
scene.objects['Points']['minions']=0
# Commandes
scene.objects['Pause'].setVisible(False,False)
scene.objects['Run'].setVisible(True,False)
scene.objects['Stop'].setVisible(False,False)
scene.objects['Stop-Hl'].setVisible(False,False)
############################################################################### ###############################################################################
# Manipulation 3D de la scène # Manipulation 3D de la scène

View File

@ -37,7 +37,9 @@ def start():
thread_start(threads, "commands", commands) thread_start(threads, "commands", commands)
def stop(): def stop():
thread_stop(threads, "commands") if thread_stop(threads, "commands"):
if len(threads)==1:
threads.pop()
############################################################################### ###############################################################################
# En: Tower commands # En: Tower commands
@ -69,8 +71,8 @@ def commands():
# Code your commands here ... # Code your commands here ...
ct_build(4,5, "Archer tower", "Tower #1", blue, "square-A") # ct_build(4,5, "Archer tower", "Tower #1", blue, "square-A")
# ct_build_details(4,5, "Mage tower", "Tower #1", blue, "square-A", "Mage_A_common") ct_build_details(4,5, "Mage tower", "Tower #1", blue, "square-A", "Mage_A_common")
# ct_build(4,5, "Mage tower", "Tower #1", yellow, "square-A") # ct_build(4,5, "Mage tower", "Tower #1", yellow, "square-A")
# ct_build(5,5) # ct_build(5,5)
# ct_build(5,4, "Tower #3") # ct_build(5,4, "Tower #3")
@ -84,4 +86,5 @@ def commands():
ct_sleep(2) ct_sleep(2)
print ("Threads commands #", len(threads)-1, "are arrived -> close them.") # Thread closed << DONT CHANGE THIS LINE >> print ("Threads commands #", len(threads)-1, "are arrived -> close them.") # Thread closed << DONT CHANGE THIS LINE >>
threads.pop()
scene.objects['Terrain']['thread_cmd']=False # End of cycle << DONT CHANGE THIS LINE >> scene.objects['Terrain']['thread_cmd']=False # End of cycle << DONT CHANGE THIS LINE >>

View File

@ -1,7 +1,5 @@
<?xml version="1.0"?>
<data> <data>
<config> <config>
<speed>1</speed> <speed>4.0</speed>
</config> </config>
</data> </data>

View File

@ -1,4 +1,5 @@
import bge # Bibliothèque Blender Game Engine (UPBGE) import bge # Blender Game Engine (UPBGE)
import aud # Sounds
import threading # Multithreading import threading # Multithreading
import trace import trace
import sys import sys
@ -27,7 +28,6 @@ import random
scene = bge.logic.getCurrentScene() scene = bge.logic.getCurrentScene()
# Colors # Colors
tower_purple = [0.202, 0.114, 0.521,1] tower_purple = [0.202, 0.114, 0.521,1]
tower_turquoise = [0.051, 0.270, 0.279,1] tower_turquoise = [0.051, 0.270, 0.279,1]
tower_magenta = [0.799, 0.005, 0.314,1] tower_magenta = [0.799, 0.005, 0.314,1]
@ -40,6 +40,20 @@ tower_blue = [0.127, 0.456, 1.000, 1]
ray_yellow = [0.799, 0.617, 0.021, 1] # [0.8, 0.619, 0.021]) ray_yellow = [0.799, 0.617, 0.021, 1] # [0.8, 0.619, 0.021])
ray_blue = [0.127, 0.456, 1.000, 1] ray_blue = [0.127, 0.456, 1.000, 1]
# Sounds
audiodev = aud.Device()
snd_build = aud.Sound('asset/sounds/build.wav')
sndbuff_build = aud.Sound.cache(snd_build)
snd_archer = aud.Sound('asset/sounds/archer.wav')
sndbuff_archer = aud.Sound.cache(snd_archer)
snd_mage = aud.Sound('asset/sounds/mage.wav')
sndbuff_mage = aud.Sound.cache(snd_mage)
snd_life = aud.Sound('asset/sounds/life.ogg')
sndbuff_life = aud.Sound.cache(snd_life)
# handle_buffered = device.play(sound_buffered)
# handle_buffered.stop()
############################################################################### ###############################################################################
# Méthode kill pour les tâches (threads) # Méthode kill pour les tâches (threads)
############################################################################### ###############################################################################
@ -101,8 +115,10 @@ def thread_stop(threads, type_txt):
i +=1 i +=1
if zombie_flag==False: if zombie_flag==False:
print ("All threads",type_txt, "are closed.") print ("All threads",type_txt, "are closed.")
return True
else: else:
print ("There are zombies threads",type_txt, ".") print ("There are zombies threads",type_txt, ".")
return False
############################################################################### ###############################################################################
@ -135,11 +151,11 @@ def ct_minion(x,y,cat,level):
body = random.choice(minion_3d[category][0])+"_"+random.choice(minion_3d[category][1])+"_"+random.choice(minion_3d[category][2]) body = random.choice(minion_3d[category][0])+"_"+random.choice(minion_3d[category][1])+"_"+random.choice(minion_3d[category][2])
ct_minion_details(x,y,cat,level,body) ct_minion_details(x,y,cat,level,body)
# Création d'un minion détaillée
def ct_minion_details(x,y,cat,level,body="Knight_m_A_common"): def ct_minion_details(x,y,cat,level,body="Knight_m_A_common"):
category=cat+"-lv"+str(level) category=cat+"-lv"+str(level)
# Pause # Pause
# FIXME : buggé
while scene.objects['Terrain']['run'] == False: while scene.objects['Terrain']['run'] == False:
time.sleep(0.01) time.sleep(0.01)
@ -151,7 +167,9 @@ def ct_minion_details(x,y,cat,level,body="Knight_m_A_common"):
minion.name="wm("+str(scene.objects['Terrain']['idm'])+")" # Wave minion (wm), identifier minion (idm) minion.name="wm("+str(scene.objects['Terrain']['idm'])+")" # Wave minion (wm), identifier minion (idm)
# minion.worldPosition=mathutils.Vector((x,y,0.3)) # minion.worldPosition=mathutils.Vector((x,y,0.3))
# minion.worldPosition=mathutils.Vector((x,y,0.37)) # old 2 # minion.worldPosition=mathutils.Vector((x,y,0.37)) # old 2
scene.objects['Points']['minions']= scene.objects['Points']['minions']+1 scene.objects['Points']['minions'] +=1
scene.objects['Points']['minions_run'] +=1
# print(bge.render.getVsync)
# Caracteristics # Caracteristics
minion.components['Minion'].args['cat']=minion_carac[category][0] minion.components['Minion'].args['cat']=minion_carac[category][0]
@ -173,7 +191,9 @@ def ct_minion_details(x,y,cat,level,body="Knight_m_A_common"):
# Destruction d'un minion # Destruction d'un minion
def scn_minion_dead(cont): def scn_minion_dead(cont):
obj = cont.owner obj = cont.owner
scene.objects['Points']['minions']= scene.objects['Points']['minions']-1 scene.objects['Points']['minions'] -=1
scene.objects['Points']['minions_run'] -=1
scene.objects['Points']['kills'] +=1
scene.objects['Points']['coins']= scene.objects['Points']['coins']+obj.components['Minion'].args['bounty'] scene.objects['Points']['coins']= scene.objects['Points']['coins']+obj.components['Minion'].args['bounty']
obj.endObject() obj.endObject()
@ -205,6 +225,7 @@ def ct_build(x,y, cat='Archer tower', tower_name="Tower", color=tower_purple, to
body = random.choice(tower_minion_3d[category][0])+"_"+random.choice(tower_minion_3d[category][1])+"_"+random.choice(tower_minion_3d[category][2]) body = random.choice(tower_minion_3d[category][0])+"_"+random.choice(tower_minion_3d[category][1])+"_"+random.choice(tower_minion_3d[category][2])
ct_build_details(x,y, cat, tower_name, color, tower_3d, body) ct_build_details(x,y, cat, tower_name, color, tower_3d, body)
# Création d'une tour détaillée
def ct_build_details(x,y, cat='Archer tower', tower_name="Tower", color=tower_purple, tower_3d="square-A", body="Archer_m_A_common"): def ct_build_details(x,y, cat='Archer tower', tower_name="Tower", color=tower_purple, tower_3d="square-A", body="Archer_m_A_common"):
# Vérification de la place # Vérification de la place
@ -232,6 +253,10 @@ def ct_build_details(x,y, cat='Archer tower', tower_name="Tower", color=tower_pu
tower_minion.worldPosition=[x,y,1] tower_minion.worldPosition=[x,y,1]
tower_minion.worldScale=[0.25,0.25,0.25] tower_minion.worldScale=[0.25,0.25,0.25]
# Sounds
audiodev.play(sndbuff_build)
# sndhdl_build.stop()
# Caractéristiques (composant python et propriétés de l'objet 3D) # Caractéristiques (composant python et propriétés de l'objet 3D)
tour.components['Tower'].args['cat']=tower_carac[cat][0] tour.components['Tower'].args['cat']=tower_carac[cat][0]
tour.components['Tower'].args['lvl']=1 tour.components['Tower'].args['lvl']=1
@ -311,11 +336,13 @@ def scn_tower_near(cont):
if target.name in scene.objects: if target.name in scene.objects:
scene.objects['Terrain']['draw_process']=True scene.objects['Terrain']['draw_process']=True
scene.objects['Terrain']['draw_list'].append([5, "arrow", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],target.name, angle3, ray_yellow, 5]) scene.objects['Terrain']['draw_list'].append([5, "arrow", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],target.name, angle3, ray_yellow, 5])
audiodev.play(sndbuff_archer)
# Cast zone # Cast zone
if obj['cat']=="Mage tower": # Mage (cast) if obj['cat']=="Mage tower": # Mage (cast)
scene.objects['Terrain']['draw_process']=True scene.objects['Terrain']['draw_process']=True
scene.objects['Terrain']['draw_list'].append([30, "cast", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],ray_blue,30]) scene.objects['Terrain']['draw_list'].append([30, "cast", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],ray_blue,30])
audiodev.play(sndbuff_mage)
# Rayon # Rayon
if obj['cat']=="Test": if obj['cat']=="Test":
@ -345,8 +372,10 @@ def scn_map_end_near(cont):
sensor = obj.sensors['Near'] sensor = obj.sensors['Near']
for i in range (len(sensor.hitObjectList)) : for i in range (len(sensor.hitObjectList)) :
sensor.hitObjectList[i].endObject() sensor.hitObjectList[i].endObject()
scene.objects['Points']['lifes']= scene.objects['Points']['lifes']-sensor.hitObjectList[0].components['Minion'].args['lifes_damage'] audiodev.play(sndbuff_life)
scene.objects['Points']['minions']= scene.objects['Points']['minions']-1 if scene.objects['Points']['lifes']>0:
scene.objects['Points']['lifes']= scene.objects['Points']['lifes']-sensor.hitObjectList[0].components['Minion'].args['lifes_damage']
scene.objects['Points']['minions_run'] -=1
# Drapeau de fin # Drapeau de fin
def ct_map_endflag(x,y): def ct_map_endflag(x,y):
@ -423,7 +452,8 @@ def ct_map_text(text):
def circle (center, radius, color): def circle (center, radius, color):
ang = 0.0 ang = 0.0
ang_step = 0.1 # ang_step = 0.1
ang_step = 0.2
while ang< 2 * math.pi: while ang< 2 * math.pi:
x0 = center[0]+float(radius*math.cos(ang)) x0 = center[0]+float(radius*math.cos(ang))
y0 = center[1]+float(radius*math.sin(ang)) y0 = center[1]+float(radius*math.sin(ang))
@ -444,15 +474,12 @@ def circle (center, radius, color):
# Affiche les draws en cours # Affiche les draws en cours
# FIXME: tir sur le plus avancé # FIXME: tir sur le plus avancé
# FIXME : remplacer le rayon par un projectile
# FIXME : remplacer le cercle par un cercle progressif
# #
# Type de draw : # Type de draw :
# arrow : [5, "arrow", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],target.name, angle3, ray_yellow,5] # arrow : [5, "arrow", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],target.name, angle3, ray_yellow,5]
# cast : [30, "cast", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8], ray_blue,30] # cast : [30, "cast", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8], ray_blue,30]
# ray : [5, "ray", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],[target.worldPosition.x, target.worldPosition.y, target.worldPosition.z], angle3, ray_yellow,5] # ray : [5, "ray", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],[target.worldPosition.x, target.worldPosition.y, target.worldPosition.z], angle3, ray_yellow,5]
# #
def scn_draw(cont): def scn_draw(cont):
obj = cont.owner obj = cont.owner
if obj.sensors['Property'].positive==False: if obj.sensors['Property'].positive==False:

View File

@ -16,10 +16,13 @@ from ct_lib import * # Bibliothèque CodeTower
# #
############################################################################### ###############################################################################
scene = bge.logic.getCurrentScene()
############################################################################### ###############################################################################
# Carte 1 # Carte 1
############################################################################### ###############################################################################
# Loading the map
def map1_init(): def map1_init():
# Taille de la carte # Taille de la carte
@ -33,3 +36,14 @@ def map1_init():
ct_map_end(1,-10) ct_map_end(1,-10)
ct_map_endflag(0.5,-10) ct_map_endflag(0.5,-10)
ct_map_endflag(1.5,-10) ct_map_endflag(1.5,-10)
# Reset counters
def map1_reset():
scene.objects['Points']['lifes']=10
scene.objects['Points']['lifes_max']=10
scene.objects['Points']['coins']=0
scene.objects['Points']['level']=0
scene.objects['Points']['level_max']=1
scene.objects['Points']['minions']=0
scene.objects['Points']['minions_run']=0

View File

@ -29,7 +29,9 @@ def start():
thread_start(threads, "waves", waves) thread_start(threads, "waves", waves)
def stop(): def stop():
thread_stop(threads, "waves") if thread_stop(threads, "waves"):
if len(threads)==1:
threads.pop()
############################################################################### ###############################################################################
# En: Waves commands # En: Waves commands
@ -78,20 +80,24 @@ def stop():
def waves(): def waves():
# Wave 1 # Wave 1
scene.objects['Points']['wave']= 1
ct_map_text("Wave 1") ct_map_text("Wave 1")
for i in range (15): for i in range (15):
ct_minion(14,3,"Orc",1) ct_minion(14,3,"Orc",1)
ct_sleep (1) ct_sleep (1)
ct_sleep (20) # ct_sleep (20)
# Wave 2 # Wave 2
ct_map_text("Wave 2") # scene.objects['Points']['wave']= 2
for i in range (20): # ct_map_text("Wave 2")
# ct_minion(14,3,"Knight",1) # for i in range (20):
ct_minion_details(14,3,"Knight",1, "OldKnight_m_A_common") # # ct_minion(14,3,"Knight",1)
ct_sleep (1) # # ct_minion(14,3,"Orc",1)
# ct_minion_details(14,3,"Knight",1, "OldKnight_m_A_common")
# ct_sleep (1)
ct_sleep (2) ct_sleep (2)
print ("Threads waves #", len(threads)-1, "are arrived -> close them.") # Thread closed << DONT CHANGE THIS LINE >> print ("Threads waves #", len(threads)-1, "are arrived -> close them.") # Thread closed << DONT CHANGE THIS LINE >>
threads.pop()
scene.objects['Terrain']['thread_wave']=False # End of cycle << DONT CHANGE THIS LINE >> scene.objects['Terrain']['thread_wave']=False # End of cycle << DONT CHANGE THIS LINE >>