forked from matheusmaldaner/JasonJourney
-
Notifications
You must be signed in to change notification settings - Fork 0
/
weapon.py
136 lines (109 loc) · 5.33 KB
/
weapon.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import pygame
import math
import constants
import random
class Weapon:
def __init__(self, weapon_image, projectile_image):
self.projectile_image = projectile_image
self.original_image = weapon_image
self.angle = 0
self.image = pygame.transform.rotate(self.original_image, self.angle)
self.rect = self.image.get_rect()
self.fired = False
self.last_shot = pygame.time.get_ticks()
self.flip = False
def update(self, player):
shot_cooldown = 300
projectile = None
self.rect.center = player.rect.center
pos = pygame.mouse.get_pos()
x_dist = pos[0] - self.rect.centerx
y_dist = -(pos[1] - self.rect.centery)
self.angle = math.degrees(math.atan2(y_dist, x_dist))
# makes weapon point where mouse cursor is
if x_dist > 0:
self.flip = False
if x_dist < 0:
self.flip = True
# self.fired prevents player from spamming infinite bullets
if pygame.mouse.get_pressed()[0] and self.fired is False and \
(pygame.time.get_ticks() - self.last_shot >= shot_cooldown): # 0 is left mouse button
projectile = Projectile(self.projectile_image, self.rect.centerx, self.rect.centery, self.angle)
self.fired = True
self.last_shot = pygame.time.get_ticks()
# resets shooting cooldown
if not pygame.mouse.get_pressed()[0]:
self.fired = False
return projectile
def draw(self, surface):
# flips image across player vertical axis
flipped_image = pygame.transform.flip(self.original_image, False, self.flip)
# fixes the angle the weapon is facing
self.image = pygame.transform.rotate(flipped_image, self.angle)
surface.blit(self.image, ((self.rect.centerx - int(self.image.get_width()/2)),
(self.rect.centery - int(self.image.get_height()/2))))
class Projectile(pygame.sprite.Sprite):
def __init__(self, image, x, y, angle):
pygame.sprite.Sprite.__init__(self)
self.original_image = image
self.angle = angle
self.image = pygame.transform.rotate(self.original_image, self.angle)
self.rect = self.image.get_rect()
self.rect.center = (x, y)
# gets vertical and horizontal speed based on the angle
self.dx = math.cos(math.radians(self.angle)) * constants.PROJECTILE_SPEED
self.dy = -(math.sin(math.radians(self.angle)) * constants.PROJECTILE_SPEED)
def update(self, screen_scroll, wall_tiles, enemy_list):
# resets variables
damage = 0
damage_pos = None
# makes projectile move in specific direction
self.rect.x += screen_scroll[0] + self.dx
self.rect.y += screen_scroll[1] + self.dy
# checks for collision between arrow and tile walls
for wall in wall_tiles:
if wall[1].colliderect(self.rect):
self.kill()
# deletes projectile if it goes off screen
if self.rect.right < 0 or self.rect.left > constants.SCREEN_WIDTH or self.rect.bottom < 0 or self.rect.top > constants.SCREEN_HEIGHT:
self.kill() # deletes projectile
# checks collision between weapon and enemy !!!
for enemy in enemy_list:
if enemy.rect.colliderect(self.rect) and enemy.alive: # see if weapon hits enemy
damage = 4 + random.randint(-2, 2)
damage_pos = enemy.rect
enemy.health -= damage
enemy.hit = True
self.kill()
break
return damage, damage_pos
def draw(self, surface):
surface.blit(self.image, ((self.rect.centerx - int(self.image.get_width()/2)), (self.rect.centery - int(self.image.get_height()/2))))
class Fireball(pygame.sprite.Sprite):
def __init__(self, image, x, y, target_x, target_y):
pygame.sprite.Sprite.__init__(self)
self.original_image = image
x_dist = target_x - x
y_dist = -(target_y - y)
self.angle = math.degrees(math.atan2(y_dist, x_dist))
self.image = pygame.transform.rotate(self.original_image, self.angle - 90)
self.rect = self.image.get_rect()
self.rect.center = (x, y)
# calculate the horizontal and vertical speeds based on the angle
self.dx = math.cos(math.radians(self.angle)) * constants.FIREBALL_SPEED
self.dy = -(math.sin(math.radians(self.angle)) * constants.FIREBALL_SPEED) # -ve because pygame y coordiate increases down the screen
def update(self, screen_scroll, player):
# reposition fireball based on speed
self.rect.x += screen_scroll[0] + self.dx
self.rect.y += screen_scroll[1] + self.dy
# checks if fireball has gone off the screen
if self.rect.right < 0 or self.rect.left > constants.SCREEN_WIDTH or self.rect.bottom < 0 or self.rect.top > constants.SCREEN_HEIGHT:
self.kill()
# checks collision between self and player
if player.rect.colliderect(self.rect) and player.hit == False:
player.hit = True
player.last_hit = pygame.time.get_ticks()
player.health -= 10
self.kill()
def draw(self, surface):
surface.blit(self.image, ((self.rect.centerx - int(self.image.get_width()/2)), self.rect.centery - int(self.image.get_height()/2)))