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'])
# 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
View File

@ -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']: