diff --git a/codetower-35.blend b/codetower-35.blend index 1a8269f..7a0b33a 100644 Binary files a/codetower-35.blend and b/codetower-35.blend differ diff --git a/ct.py b/ct.py index b09b5b5..116858e 100644 --- a/ct.py +++ b/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 diff --git a/ct_lib.py b/ct_lib.py index 3f3abf1..aa2a844 100644 --- a/ct_lib.py +++ b/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']: