-
Notifications
You must be signed in to change notification settings - Fork 0
/
projectile.py
104 lines (82 loc) · 3.82 KB
/
projectile.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import math
import pygame
class Projectile(pygame.sprite.Sprite):
def __init__(self, game, nom, vitesse, degat, posDepartX, posDepartY, cible, origine=None, cibleCoordonnee=None, dureeMax=1500):
super().__init__()
#affichage et information
self.game = game
self.velocity = vitesse
self.cibleCoordonnee=cibleCoordonnee
if not self.cibleCoordonnee:
self.cibleRect = cible.rect
self.cibleX = cible.rect.x
self.cibleY = cible.rect.y
self.cible=cible
self.img=game.images.loadImgProjectile(nom)
self.imgOriginal = self.img
self.nom = nom
self.rect = self.img.get_rect()
self.rect.x = posDepartX
self.rect.y = posDepartY
self.degat = degat
if self.nom =="mage" or self.nom=="yeti":
self.angle=False
else:
self.angle = self.genererAngle()
self.img = game.images.loadImgProjectile(nom, self.angle)
self.rect = self.img.get_rect()
self.rect.x = posDepartX
self.rect.y = posDepartY
self.lancement=self.game.tempsJeu()
self.dureeMax = dureeMax
if not self.cibleCoordonnee:
self.dx, self.dy = self.cibleX - self.rect.x, self.cibleY - self.rect.y
else :
self.dx, self.dy = self.cibleCoordonnee[0] - self.rect.x, self.cibleCoordonnee[1] - self.rect.y
self.origine=origine
def genererAngle(self):
if not self.cibleCoordonnee:
dx, dy = self.cibleX-self.rect.x , self.rect.y-self.cibleY
else:
dx, dy = self.cibleCoordonnee[0]-self.rect.x , self.rect.y-self.cibleCoordonnee[1]
angledegre= 180/math.pi*angle([1,0],[dx,dy])
if dy<0: ## calcul du determinant de la matrice associé aux 2 vecteurs colonne
angledegre = 360-angledegre
return angledegre
def rotate(self, neg = False, angle = 8):
if not neg :
self.angle+=angle
else :
self.angle-=angle
self.img = pygame.transform.rotozoom(self.imgOriginal, self.angle, 1)
self.rect = self.img.get_rect(center=self.rect.center)
def moveProjectile(self):
dist = math.hypot(self.dx, self.dy) #Norme euclidienne
if dist!=0:
self.dx, self.dy = self.dx / dist, self.dy / dist # normalisation du vecteur
# bouger en direction du vecteur
self.rect.x += round(self.dx * self.velocity)
self.rect.y += round(self.dy * self.velocity)
if self.nom!="tour":
self.rotate()
if not self.cibleCoordonnee:
if self.rect.colliderect(self.cible.rect):
self.cible.takeDamage(self.degat, self.game.moveX, self.game.moveY)
if type(self.cible) == type(self.game.joueur) and not self.origine.name=="Boss":
self.cible.dictioDegatMob[self.origine.name]+=self.origine.damageDistance
self.kill()
#detruire le projo
elif self.game.tempsJeu()-self.lancement>self.dureeMax:
self.kill()
else:
if self.rect.colliderect(self.game.joueur.rect):
self.game.joueur.takeDamage(self.degat, self.game.moveX, self.game.moveY)
self.kill()
elif self.game.tempsJeu()-self.lancement>self.dureeMax:
self.kill()
def produit(v1, v2):
return sum((a*b) for a, b in zip(v1, v2))
def longueur(v):
return math.sqrt(produit(v, v))
def angle(v1, v2):
return math.acos(produit(v1, v2) / (longueur(v1) * longueur(v2)))