bullet et cast en 3D

This commit is contained in:
Philippe Roy 2022-07-21 04:26:36 +02:00
parent e7b75b267d
commit b0c8dc5629
3 changed files with 78 additions and 32 deletions

Binary file not shown.

6
ct.py
View File

@ -295,8 +295,6 @@ def terrain_init ():
scene.addOverlayCollection(scene.cameras['Camera-Hud'], bpy.data.collections['Hud']) scene.addOverlayCollection(scene.cameras['Camera-Hud'], bpy.data.collections['Hud'])
# Pile des draws # Pile des draws
scene.objects['Terrain']['draw2d_process']=False
scene.objects['Terrain']['draw2d_list']=[]
scene.objects['Terrain']['draw3d_process']=False scene.objects['Terrain']['draw3d_process']=False
scene.objects['Terrain']['draw3d_list']=[] scene.objects['Terrain']['draw3d_list']=[]
@ -376,6 +374,10 @@ def terrain_run ():
obj_i.endObject() obj_i.endObject()
if "type_towerminion" in obj_i.getPropertyNames() : if "type_towerminion" in obj_i.getPropertyNames() :
obj_i.endObject() 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']= [] scene.objects['Terrain']['scene_tile_tower']= []
# Scripts utilisateur et vagues # Scripts utilisateur et vagues

104
ct_lib.py
View File

@ -94,12 +94,12 @@ class thread_with_trace(threading.Thread):
self.__run_backup = self.run self.__run_backup = self.run
self.run = self.__run self.run = self.__run
threading.Thread.start(self) threading.Thread.start(self)
def __run(self): def __run(self):
sys.settrace(self.globaltrace) sys.settrace(self.globaltrace)
self.__run_backup() self.__run_backup()
self.run = self.__run_backup self.run = self.__run_backup
def globaltrace(self, frame, event, arg): def globaltrace(self, frame, event, arg):
if event == 'call': if event == 'call':
return self.localtrace 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 # 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']: if [x,y] in scene.objects['Terrain']['scene_tile_noncontruct'] or [x,y] in scene.objects['Terrain']['scene_tile_tower']:
return False return False
# Vérification du niveau # Vérification du niveau
scene.objects['Points']['level']= scene.objects['Points']['level'] + 1 scene.objects['Points']['level']= scene.objects['Points']['level'] + 1
if scene.objects['Points']['level'] > scene.objects['Points']['level_max'] : 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] tower_minion.worldScale=[0.25,0.25,0.25]
# Draw3d # Draw3d
if cat=='Archer tower': if cat=="Archer tower":
for i in range (3): 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 # Sounds
sound_play(sndbuff_build) sound_play(sndbuff_build)
@ -413,15 +415,31 @@ def ct_remove(x,y):
# Création d'un projectile # Création d'un projectile
## ##
def ct_add_bullet(x,y,num): def ct_add_tower_bullet(x, y, num, cat="Ball"):
bullet= scene.addObject("Bullet", scene.objects['Terrain']) 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.name="tower("+str(x)+','+str(y)+")-bullet"+str(num)
bullet.worldPosition=[x,y,1.5] bullet.worldPosition=[x,y,1.5]
bullet.worldScale=[0.75,0.75,0.75] bullet.worldScale=[0.75,0.75,0.75]
bullet.suspendPhysics (True) bullet.suspendPhysics (True)
bullet.setVisible(False) bullet.setVisible(False)
bullet['activated']=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 # Réaction d'une tour
@ -482,7 +500,7 @@ def scn_tower_near(cont):
# obj['target_past']=[] # obj['target_past']=[]
# for obj_i in sensor.hitObjectList: # for obj_i in sensor.hitObjectList:
# obj['target_past'].append([obj_i.name, obj.getDistanceTo(obj_i)]) # obj['target_past'].append([obj_i.name, obj.getDistanceTo(obj_i)])
# Orientation du tower minion # Orientation du tower minion
towerminion="tm("+str(round(obj.worldPosition.x))+','+str(round(obj.worldPosition.y))+")" 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)) 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) sound_play(sndbuff_mage)
# Ligne (drawLine) (vitesse rapide) # 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) # Archer (tir de flêche)
if obj['cat']=="Archer tower": if obj['cat']=="Archer tower":
if target.name in scene.objects: 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): for i in range (3):
bullet = scene.objects[obj.name+"-bullet"+str(i)] bullet = scene.objects[obj.name+"-bullet"+str(i)]
if bullet['activated']==False: if bullet['activated']==False:
@ -515,23 +531,32 @@ def scn_tower_near(cont):
bullet['activated']=True bullet['activated']=True
bullet.setVisible(True) bullet.setVisible(True)
scene.objects['Terrain']['draw3d_process']=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 break
if i ==3 : if i ==3 :
print ("Plus de bullet de disponible pour la tour : "+obj.name) print ("Plus de bullet de disponible pour la tour : "+obj.name)
# Cast zone # Cast zone
# FIXME : ne marche plus (zoom et pan)
if obj['cat']=="Mage tower": # Mage (cast) if obj['cat']=="Mage tower": # Mage (cast)
scene.objects['Terrain']['draw2d_process']=True cast = scene.objects[obj.name+"-cast"]
scene.objects['Terrain']['draw2d_list'].append([30, "cast", [obj.worldPosition.x, obj.worldPosition.y, obj.worldPosition.z+0.8],ray_blue,30]) 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 # Rayon
# FIXME : ne marche plus (zoom et pan) # FIXME : ne marche plus (zoom et pan)
if obj['cat']=="Test": # if obj['cat']=="Test":
if target.name in scene.objects: # if target.name in scene.objects:
scene.objects['Terrain']['draw2d_process']=True # 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 # 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) # Cast (buff and debuff)
if obj['cat']=="Mage tower": if obj['cat']=="Mage tower":
@ -661,8 +686,6 @@ def ct_print (text):
# Dessin 3d # Dessin 3d
############################################################################### ###############################################################################
# scene.objects['Terrain']['draw3d_list'].append([5, "arrow", obj.name, bullet.name, target.name, angle3, ray_black, 5])
def scn_draw3d(cont): def scn_draw3d(cont):
obj = cont.owner obj = cont.owner
if obj.sensors['Draw3d'].positive==False: if obj.sensors['Draw3d'].positive==False:
@ -670,11 +693,12 @@ def scn_draw3d(cont):
if len(scene.objects['Terrain']['draw3d_list'])==0: if len(scene.objects['Terrain']['draw3d_list'])==0:
scene.objects['Terrain']['draw3d_process']=False scene.objects['Terrain']['draw3d_process']=False
return return
# Dépilage des draws à executer # Dépilage des draws à executer
for draw_cmd in scene.objects['Terrain']['draw3d_list']: for draw_cmd in scene.objects['Terrain']['draw3d_list']:
# Archer (tir de flêche) # 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[1]=="arrow":
if draw_cmd[4] in scene.objects: if draw_cmd[4] in scene.objects:
tower= scene.objects[draw_cmd[2]] tower= scene.objects[draw_cmd[2]]
@ -682,15 +706,22 @@ def scn_draw3d(cont):
target = scene.objects[draw_cmd[4]] target = scene.objects[draw_cmd[4]]
x0 = tower.worldPosition.x x0 = tower.worldPosition.x
y0 = tower.worldPosition.y y0 = tower.worldPosition.y
z0 = tower.worldPosition.z+0.8 # ajustement +0.8 # z0 = tower.worldPosition.z+0.8 # ajustement +0.8
x1 = target.worldPosition.x z0 = tower.worldPosition.z+1 # ajustement +1
x1 = target.worldPosition.x
y1 = target.worldPosition.y y1 = target.worldPosition.y
z1 = target.worldPosition.z+0.5 # ajustement +0.5 z1 = target.worldPosition.z+0.5 # ajustement +0.5
step_x=(x1-x0)/draw_cmd[7] if x1>x0:
step_y=(y1-y0)/draw_cmd[7] angle_z =math.atan((y1-y0)/(x1-x0))+math.pi/2
step_z=(z1-z0)/draw_cmd[7] else:
step = draw_cmd[7]-draw_cmd[0] 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.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'] draw_cmd[0] = draw_cmd[0]-scene.objects['Terrain']['speed']
# Dégats # Dégats
@ -701,6 +732,19 @@ def scn_draw3d(cont):
if target['hp']<=0: # Mort if target['hp']<=0: # Mort
target['dead']=True 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 # Suppression des draws finis
i=0 i=0
for draw_cmd in scene.objects['Terrain']['draw3d_list']: 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: if len(scene.objects['Terrain']['draw2d_list'])==0:
scene.objects['Terrain']['draw2d_process']=False scene.objects['Terrain']['draw2d_process']=False
return return
# Dépilage des draws à executer # Dépilage des draws à executer
for draw_cmd in scene.objects['Terrain']['draw2d_list']: for draw_cmd in scene.objects['Terrain']['draw2d_list']: