mirror of
https://forge.apps.education.fr/phroy/codetower.git
synced 2024-01-27 11:35:17 +01:00
ajout de la bannière de fin
This commit is contained in:
parent
2b52c653e9
commit
51b423a0cb
BIN
asset/sounds/archer.wav
Normal file
BIN
asset/sounds/archer.wav
Normal file
Binary file not shown.
BIN
asset/sounds/build.wav
Normal file
BIN
asset/sounds/build.wav
Normal file
Binary file not shown.
BIN
asset/sounds/click.ogg
Normal file
BIN
asset/sounds/click.ogg
Normal file
Binary file not shown.
BIN
asset/sounds/click_construct.ogg
Normal file
BIN
asset/sounds/click_construct.ogg
Normal file
Binary file not shown.
27
asset/sounds/glest/LICENCES.txt
Normal file
27
asset/sounds/glest/LICENCES.txt
Normal 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
|
||||||
|
|
BIN
asset/sounds/glest/arrow_hit5.wav
Normal file
BIN
asset/sounds/glest/arrow_hit5.wav
Normal file
Binary file not shown.
BIN
asset/sounds/glest/battlemage_hit4.wav
Normal file
BIN
asset/sounds/glest/battlemage_hit4.wav
Normal file
Binary file not shown.
BIN
asset/sounds/glest/machine_attack2.wav
Normal file
BIN
asset/sounds/glest/machine_attack2.wav
Normal file
Binary file not shown.
BIN
asset/sounds/life.ogg
Normal file
BIN
asset/sounds/life.ogg
Normal file
Binary file not shown.
BIN
asset/sounds/mage.wav
Normal file
BIN
asset/sounds/mage.wav
Normal file
Binary file not shown.
BIN
codetower-14.blend
Normal file
BIN
codetower-14.blend
Normal file
Binary file not shown.
389
ct.py
389
ct.py
@ -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
|
||||||
|
@ -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 >>
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<data>
|
<data>
|
||||||
<config>
|
<config>
|
||||||
<speed>1</speed>
|
<speed>4.0</speed>
|
||||||
</config>
|
</config>
|
||||||
</data>
|
</data>
|
||||||
|
|
||||||
|
49
ct_lib.py
49
ct_lib.py
@ -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:
|
||||||
|
14
ct_map.py
14
ct_map.py
@ -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
|
||||||
|
|
||||||
|
20
ct_waves.py
20
ct_waves.py
@ -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 >>
|
||||||
|
Loading…
Reference in New Issue
Block a user