def __init__(self, terrain, tank, name): """ constructeur de la classe terrain : le terrain sur lequel évolue l'obus tank : le tank qui a tiré cet obus name : nom de l'agent l_img_name : liste des noms des images devant être dessinées dans l'ordre de la liste pos: position (x,y) du tank (coin haut gauche) nb_rotates: nombre de rotations à pré-générer (rotations par pas de 2pi/nb_rotations) """ self.tank = tank # le tank qui a tiré l'obus # appel au constructeur de la classe mère Agent: vitesse = vitesse max = 30, pas d'accel et pas de frottement Agent.__init__( self, terrain, name, l_img_name=[ 'Media/Tank/Explosion/Light_Shell_128x128.png', # obus 'Media/Tank/Explosion/Sprite_Fire_Shots_Shot_A_000.png' # feux de tir ], pos=tank.pos, nb_rotates=tank.nb_rotates, v=30, vmax=30, accel=0, friction_force=0, bloc_size=32) self.id_shell = 0 # id de l'obus self.id_fire = 1 # id du feux de tir self.countdown = 0 # si compte à rebours obus à 0: le tank peut tirer son obus self.explosion = Explosion( terrain, self, self.name + ' explosion') # agent explosion quand l'obus touche un obstacle self.desactivates_all() #sésactive toutes les images
def bouge(self): """ méthode pour faire bouger le tank """ if self.human: key_pressed = pygame.key.get_pressed() # capture touche pressée if (key_pressed[K_LEFT] or key_pressed[K_RIGHT]): #orientation du tank si touche pressée LEFT(rotation +1) ou RIGTH(rotation-1) self.rotates(key_pressed[K_LEFT] - key_pressed[K_RIGHT]) if (key_pressed[K_s] or key_pressed[K_d]): #rotation du canon uniquement si touches pressée 'S'(rotation +1) ou 'D' (rotation-1) index_angle_wp = ( (key_pressed[K_s] - key_pressed[K_d]) + self.l_rotation[self.id_weapon] ) % self.nb_rotates #nouvel indice d'angle du canon angle_wp_rel = ( (index_angle_wp - self.l_rotation[self.id_hull]) % self.nb_rotates) * 360 / self.nb_rotates if ( angle_wp_rel <= 90 or angle_wp_rel >= 270 ): #le canon ne peut être orienté qu'à 90° par rapport au corps du tank, vers la droite ou vers la gauche self.rotates(key_pressed[K_s] - key_pressed[K_d], self.id_weapon) #accélération du tank selon commande d'accélération UP ou DOWN self.accel = self.new_accel * (key_pressed[K_UP] - key_pressed[K_DOWN]) Agent.bouge(self) # nouvelle position et orientation du tank if self.shell.countdown > 0: # l'obus a été tiré self.shell.countdown -= 1 # décompte le compte à rebours de l'obus self.shell.bouge() # anime l'obus if self.shell.explosion.booom: # l'obus tiré a rencontré un obstacle self.shell.explosion.bouge() # anime l'explosion
def __init__(self, terrain, obus, name): """ constructeur de la classe terrain : le terrain sur lequel évolue l'obus obus : l'obus qui a généré l'explosion name : nom de l'agent """ # appel au constructeur de la classe mère Agent: vitesse et accélération nulle, pas de rotation Agent.__init__( self, terrain, name, l_img_name=[ 'Media/Tank/Explosion/Sprite_Effects_Explosion_000_64x64.png', # motif explosion 1 'Media/Tank/Explosion/Sprite_Effects_Explosion_001_64x64.png', # motif explosion 2 'Media/Tank/Explosion/Sprite_Effects_Explosion_002_64x64.png', # motif explosion 3 'Media/Tank/Explosion/Sprite_Effects_Explosion_003_64x64.png', # motif explosion 4 'Media/Tank/Explosion/Sprite_Effects_Explosion_004_64x64.png', # motif explosion 5 'Media/Tank/Explosion/Sprite_Effects_Explosion_005_64x64.png', # motif explosion 6 'Media/Tank/Explosion/Sprite_Effects_Explosion_006_64x64.png', # motif explosion 7 'Media/Tank/Explosion/Sprite_Effects_Explosion_007_64x64.png', # motif explosion 8 'Media/Tank/Explosion/Sprite_Effects_Explosion_008_64x64.png' # motif explosion 9 ], bloc_size=64) self.desactivates_all() # désactive toutes les images self.booom = False # True: l'explosion est visible
def __init__(self, terrain, name, l_img_name, human=False, pos=(0, 0), nb_rotates=16): """ constructeur de la classe terrain : le terrain sur lequel évolue le tank name : nom du tank l_img_name : liste des noms des images du tank devant être dessinées dans l'ordre de la liste human: True si joué par un humain, False si joué par la machine pos: position (x,y) du tank (coin haut gauche) """ # appel au constructeur de la classe mère Agent Agent.__init__(self, terrain, name, l_img_name, pos, nb_rotates=64, v=0, vmax=10, accel=0, friction_force=-1, bloc_size=64) self.human = human # True: joué par un humain self.id_shield, self.id_hull, self.id_weapon = 0, 1, 2 #id image du bouclier, coprs , canon et tir du tank self.new_accel = 1 #accélération du tank quand la commande Acceleration est activée self.shell = Shell(self.terrain, self, self.name + ' shell') # agent "Obus" qui sera activé si tir. self.shell_countdown_init = 20 # compte à rebours pour retirer un obus: -1 chaque mouvement
def bouge(self): """ méthode pour faire bouger l'obus """ if self.timer > 0: # boule de feux de tir activée au tout début, quand timer = 0 self.l_actif[self.id_fire]=False if self.countdown == 0: # fin du compte à rebourg: arrêt et explosion de l'obus. self.v=0 Agent.bouge(self) if self.v==0: # l'obus a rencontré un obstacle : explosion activée self.explosion.pos = (self.pos[0]-self.explosion.half_size+self.half_size, self.pos[1]-self.explosion.half_size+self.half_size ) # positionne l'explosion centrée sur l'obus self.explosion.booom = True # active l'animation de l'explosion
def bouge(self): """ méthode pour animer l'explosion """ if self.booom: if self.timer>0: self.l_actif[self.timer-1] = False # désactive l'imge précédente self.l_actif[self.timer] = True # active image suivante selon timer interne if self.timer == len(self.l_img_name) -1 : # fin de l'explosion self.booom = False self.desactivates_all() self.timer = 0 Agent.bouge(self)
def bouge(self): """ méthode pour faire bouger l'obus """ self.l_actif[self.id_fire] = ( self.timer == 0 ) # boule de feux de tir activée uniquement au tout début, quand timer = 0 self.l_actif[self.id_shell] = (self.timer > 0) if self.countdown == 0: # fin du compte à rebourg: arrêt et explosion de l'obus. self.v = 0 Agent.bouge(self) if self.v == 0: # l'obus a rencontré un obstacle : explosion activée self.desactivates_all() #sésactive toutes les images self.explosion.pos = ( self.pos[0] - self.explosion.half_size + self.half_size, self.pos[1] - self.explosion.half_size + self.half_size ) # positionne l'explosion centrée sur l'obus self.explosion.booom = True # active l'animation de l'explosion
def bouge(self): """ méthode pour faire bouger le tank """ if self.human: key_pressed = pygame.key.get_pressed() # capture touche pressée #orientation du tank si touche pressée LEFT(rotation +1) ou RIGTH(rotation-1) self.rotates(key_pressed[K_LEFT] - key_pressed[K_RIGHT]) #rotation du canon uniquement si touches pressée 'S'(rotation +1) ou 'D' (rotation-1) self.rotates(key_pressed[K_s] - key_pressed[K_d], self.id_weapon) #accélération du tank selon commande d'accélération UP ou DOWN self.accel = self.new_accel*( key_pressed[K_UP] - key_pressed[K_DOWN] ) Agent.bouge(self) # nouvelle position et orientation du tank if self.shell.countdown > 0: # l'obus a été tiré self.shell.countdown -= 1 # décompte le compte à rebours de l'obus self.shell.bouge() # anime l'obus if self.shell.explosion.booom: # l'obus tiré a rencontré un obstacle self.shell.explosion.bouge() # anime l'explosion