mirror of
https://forge.apps.education.fr/phroy/codetower.git
synced 2024-01-27 11:35:17 +01:00
bullet et cast en 3D
This commit is contained in:
parent
e7b75b267d
commit
b0c8dc5629
Binary file not shown.
6
ct.py
6
ct.py
@ -295,8 +295,6 @@ def terrain_init ():
|
||||
scene.addOverlayCollection(scene.cameras['Camera-Hud'], bpy.data.collections['Hud'])
|
||||
|
||||
# Pile des draws
|
||||
scene.objects['Terrain']['draw2d_process']=False
|
||||
scene.objects['Terrain']['draw2d_list']=[]
|
||||
scene.objects['Terrain']['draw3d_process']=False
|
||||
scene.objects['Terrain']['draw3d_list']=[]
|
||||
|
||||
@ -376,6 +374,10 @@ def terrain_run ():
|
||||
obj_i.endObject()
|
||||
if "type_towerminion" in obj_i.getPropertyNames() :
|
||||
obj_i.endObject()
|
||||
if "type_bullet" in obj_i.getPropertyNames() :
|
||||
obj_i.endObject()
|
||||
if "type_cast" in obj_i.getPropertyNames() :
|
||||
obj_i.endObject()
|
||||
scene.objects['Terrain']['scene_tile_tower']= []
|
||||
|
||||
# Scripts utilisateur et vagues
|
||||
|
104
ct_lib.py
104
ct_lib.py
@ -94,12 +94,12 @@ class thread_with_trace(threading.Thread):
|
||||
self.__run_backup = self.run
|
||||
self.run = self.__run
|
||||
threading.Thread.start(self)
|
||||
|
||||
|
||||
def __run(self):
|
||||
sys.settrace(self.globaltrace)
|
||||
self.__run_backup()
|
||||
self.run = self.__run_backup
|
||||
|
||||
|
||||
def globaltrace(self, frame, event, arg):
|
||||
if event == 'call':
|
||||
return self.localtrace
|
||||
@ -334,7 +334,7 @@ def ct_build_details(x,y, cat='Archer tower', tower_name="Tower", color=tower_pu
|
||||
# Vérification de la place
|
||||
if [x,y] in scene.objects['Terrain']['scene_tile_noncontruct'] or [x,y] in scene.objects['Terrain']['scene_tile_tower']:
|
||||
return False
|
||||
|
||||
|
||||
# Vérification du niveau
|
||||
scene.objects['Points']['level']= scene.objects['Points']['level'] + 1
|
||||
if scene.objects['Points']['level'] > scene.objects['Points']['level_max'] :
|
||||
@ -364,9 +364,11 @@ def ct_build_details(x,y, cat='Archer tower', tower_name="Tower", color=tower_pu
|
||||
tower_minion.worldScale=[0.25,0.25,0.25]
|
||||
|
||||
# Draw3d
|
||||
if cat=='Archer tower':
|
||||
if cat=="Archer tower":
|
||||
for i in range (3):
|
||||
ct_add_bullet(x,y,i)
|
||||
ct_add_tower_bullet(x,y,i, "Arrow")
|
||||
if cat=="Mage tower":
|
||||
ct_add_tower_cast(x,y)
|
||||
|
||||
# Sounds
|
||||
sound_play(sndbuff_build)
|
||||
@ -413,15 +415,31 @@ def ct_remove(x,y):
|
||||
# Création d'un projectile
|
||||
##
|
||||
|
||||
def ct_add_bullet(x,y,num):
|
||||
bullet= scene.addObject("Bullet", scene.objects['Terrain'])
|
||||
def ct_add_tower_bullet(x, y, num, cat="Ball"):
|
||||
if cat=="Ball":
|
||||
bullet= scene.addObject("Bullet", scene.objects['Terrain'])
|
||||
if cat=="Arrow":
|
||||
bullet= scene.addObject("Arrow", scene.objects['Terrain'])
|
||||
bullet.name="tower("+str(x)+','+str(y)+")-bullet"+str(num)
|
||||
bullet.worldPosition=[x,y,1.5]
|
||||
bullet.worldScale=[0.75,0.75,0.75]
|
||||
bullet.suspendPhysics (True)
|
||||
bullet.setVisible(False)
|
||||
bullet['activated']=False
|
||||
# print ("Création : "+bullet.name)
|
||||
|
||||
##
|
||||
# Création des sort
|
||||
##
|
||||
|
||||
def ct_add_tower_cast(x, y):
|
||||
cast= scene.addObject("Cast-slow", scene.objects['Terrain'])
|
||||
cast.name="tower("+str(x)+','+str(y)+")-cast"
|
||||
cast.worldPosition=[x,y,1.5]
|
||||
cast.worldScale=[0.75,0.75,0.75]
|
||||
cast.suspendPhysics (True)
|
||||
cast.setVisible(False)
|
||||
cast['activated']=False
|
||||
|
||||
|
||||
##
|
||||
# Réaction d'une tour
|
||||
@ -482,7 +500,7 @@ def scn_tower_near(cont):
|
||||
# obj['target_past']=[]
|
||||
# for obj_i in sensor.hitObjectList:
|
||||
# obj['target_past'].append([obj_i.name, obj.getDistanceTo(obj_i)])
|
||||
|
||||
|
||||
# Orientation du tower minion
|
||||
towerminion="tm("+str(round(obj.worldPosition.x))+','+str(round(obj.worldPosition.y))+")"
|
||||
angle =math.atan((target.worldPosition.y-obj.worldPosition.y)/(target.worldPosition.x-obj.worldPosition.x))
|
||||
@ -501,13 +519,11 @@ def scn_tower_near(cont):
|
||||
sound_play(sndbuff_mage)
|
||||
|
||||
# Ligne (drawLine) (vitesse rapide)
|
||||
if scene.objects['Terrain']['speed']<10: # Pas d'animation à 10 -> plantage
|
||||
if scene.objects['Terrain']['speed']<10: # Pas d'animation à 10 -> plantage
|
||||
|
||||
# Archer (tir de flêche)
|
||||
if obj['cat']=="Archer tower":
|
||||
if target.name in scene.objects:
|
||||
# scene.objects['Terrain']['draw2d_process']=True
|
||||
# scene.objects['Terrain']['draw2d_list'].append([5, "arrow", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8], target.name, angle3, ray_black, 5])
|
||||
for i in range (3):
|
||||
bullet = scene.objects[obj.name+"-bullet"+str(i)]
|
||||
if bullet['activated']==False:
|
||||
@ -515,23 +531,32 @@ def scn_tower_near(cont):
|
||||
bullet['activated']=True
|
||||
bullet.setVisible(True)
|
||||
scene.objects['Terrain']['draw3d_process']=True
|
||||
scene.objects['Terrain']['draw3d_list'].append([20, "arrow", obj.name, bullet.name, target.name, angle3, ray_black, 20])
|
||||
scene.objects['Terrain']['draw3d_list'].append([20, "arrow", obj.name, bullet.name, target.name, "normal", 20])
|
||||
break
|
||||
if i ==3 :
|
||||
print ("Plus de bullet de disponible pour la tour : "+obj.name)
|
||||
|
||||
# Cast zone
|
||||
# FIXME : ne marche plus (zoom et pan)
|
||||
if obj['cat']=="Mage tower": # Mage (cast)
|
||||
scene.objects['Terrain']['draw2d_process']=True
|
||||
scene.objects['Terrain']['draw2d_list'].append([30, "cast", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],ray_blue,30])
|
||||
cast = scene.objects[obj.name+"-cast"]
|
||||
cast.worldPosition=[obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8]
|
||||
cast.worldScale=[0.01,0.01,0.01]
|
||||
cast.setVisible(True)
|
||||
scene.objects['Terrain']['draw3d_process']=True
|
||||
scene.objects['Terrain']['draw3d_list'].append([60, "cast", obj.name, cast.name, "slow", 60])
|
||||
|
||||
# Rayon
|
||||
# FIXME : ne marche plus (zoom et pan)
|
||||
if obj['cat']=="Test":
|
||||
if target.name in scene.objects:
|
||||
scene.objects['Terrain']['draw2d_process']=True
|
||||
scene.objects['Terrain']['draw2d_list'].append([5, "ray", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8], target.name, angle3, ray_yellow,5]) # Suivi du minion
|
||||
# if obj['cat']=="Test":
|
||||
# if target.name in scene.objects:
|
||||
# scene.objects['Terrain']['draw2d_process']=True
|
||||
# scene.objects['Terrain']['draw2d_list'].append([5, "ray", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8], target.name, angle3, ray_yellow,5]) # Suivi du minion
|
||||
|
||||
# Dégats : pas d'animation à 10
|
||||
if scene.objects['Terrain']['speed']==10:
|
||||
target['hp'] = target['hp'] - obj['damage']
|
||||
if target['hp']<=0:
|
||||
target['dead']=True
|
||||
|
||||
# Cast (buff and debuff)
|
||||
if obj['cat']=="Mage tower":
|
||||
@ -661,8 +686,6 @@ def ct_print (text):
|
||||
# Dessin 3d
|
||||
###############################################################################
|
||||
|
||||
# scene.objects['Terrain']['draw3d_list'].append([5, "arrow", obj.name, bullet.name, target.name, angle3, ray_black, 5])
|
||||
|
||||
def scn_draw3d(cont):
|
||||
obj = cont.owner
|
||||
if obj.sensors['Draw3d'].positive==False:
|
||||
@ -670,11 +693,12 @@ def scn_draw3d(cont):
|
||||
if len(scene.objects['Terrain']['draw3d_list'])==0:
|
||||
scene.objects['Terrain']['draw3d_process']=False
|
||||
return
|
||||
|
||||
|
||||
# Dépilage des draws à executer
|
||||
for draw_cmd in scene.objects['Terrain']['draw3d_list']:
|
||||
|
||||
# Archer (tir de flêche)
|
||||
# scene.objects['Terrain']['draw3d_list'].append([20, "arrow", obj.name, bullet.name, target.name, "normal", 20])
|
||||
if draw_cmd[1]=="arrow":
|
||||
if draw_cmd[4] in scene.objects:
|
||||
tower= scene.objects[draw_cmd[2]]
|
||||
@ -682,15 +706,22 @@ def scn_draw3d(cont):
|
||||
target = scene.objects[draw_cmd[4]]
|
||||
x0 = tower.worldPosition.x
|
||||
y0 = tower.worldPosition.y
|
||||
z0 = tower.worldPosition.z+0.8 # ajustement +0.8
|
||||
x1 = target.worldPosition.x
|
||||
# z0 = tower.worldPosition.z+0.8 # ajustement +0.8
|
||||
z0 = tower.worldPosition.z+1 # ajustement +1
|
||||
x1 = target.worldPosition.x
|
||||
y1 = target.worldPosition.y
|
||||
z1 = target.worldPosition.z+0.5 # ajustement +0.5
|
||||
step_x=(x1-x0)/draw_cmd[7]
|
||||
step_y=(y1-y0)/draw_cmd[7]
|
||||
step_z=(z1-z0)/draw_cmd[7]
|
||||
step = draw_cmd[7]-draw_cmd[0]
|
||||
if x1>x0:
|
||||
angle_z =math.atan((y1-y0)/(x1-x0))+math.pi/2
|
||||
else:
|
||||
angle_z =math.pi+math.atan((y1-y0)/(x1-x0))+math.pi/2
|
||||
angle_y =math.atan((z1-z0)/(math.sqrt((x1-x0)**2+(y1-y0)**2)))
|
||||
step_x=(x1-x0)/draw_cmd[6]
|
||||
step_y=(y1-y0)/draw_cmd[6]
|
||||
step_z=(z1-z0)/draw_cmd[6]
|
||||
step = draw_cmd[6]-draw_cmd[0]
|
||||
bullet.worldPosition=[x0+step_x*step, y0+step_y*step, z0+step_z*step]
|
||||
bullet.worldOrientation=[0, angle_y, angle_z]
|
||||
draw_cmd[0] = draw_cmd[0]-scene.objects['Terrain']['speed']
|
||||
|
||||
# Dégats
|
||||
@ -701,6 +732,19 @@ def scn_draw3d(cont):
|
||||
if target['hp']<=0: # Mort
|
||||
target['dead']=True
|
||||
|
||||
# Mage (cast)
|
||||
# scene.objects['Terrain']['draw3d_list'].append([60, "cast", obj.name, cast.name, "slow", 60])
|
||||
if draw_cmd[1]=="cast":
|
||||
cast = scene.objects[draw_cmd[3]]
|
||||
step = draw_cmd[5]-draw_cmd[0]
|
||||
cast.worldScale=[0.05*step,0.05*step,0.05*step]
|
||||
# cast.worldScale=[0.75*step,0.75*step,0.75*step]
|
||||
draw_cmd[0] = draw_cmd[0]-scene.objects['Terrain']['speed']
|
||||
|
||||
# Fin
|
||||
if draw_cmd[0]<=0:
|
||||
cast.setVisible(False)
|
||||
|
||||
# Suppression des draws finis
|
||||
i=0
|
||||
for draw_cmd in scene.objects['Terrain']['draw3d_list']:
|
||||
@ -743,7 +787,7 @@ def scn_draw2d(cont):
|
||||
if len(scene.objects['Terrain']['draw2d_list'])==0:
|
||||
scene.objects['Terrain']['draw2d_process']=False
|
||||
return
|
||||
|
||||
|
||||
# Dépilage des draws à executer
|
||||
for draw_cmd in scene.objects['Terrain']['draw2d_list']:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user