-
Notifications
You must be signed in to change notification settings - Fork 0
/
player.py
136 lines (115 loc) · 4.83 KB
/
player.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
from obstacle import PointObstacle
from particles import Particles
from settings import WINDOW_HEIGHT, WINDOW_WIDTH, SCALE_FACTOR
from ui import BlinkSprite
from audio import AudioManager
from spritesheet import SpriteSheet
from utils import read_hiscore
pygame.font.init()
font = pygame.font.Font("assets/Roboto-Black.ttf", 60)
class Player(pygame.sprite.Sprite):
def __init__(self, groups, pos, obstacles) -> None:
super().__init__(groups)
self.sprite_sheet = SpriteSheet("assets/Ghost.png")
self.anims = [
self.sprite_sheet.get_sprite(130, 100, 520, 540, SCALE_FACTOR),
self.sprite_sheet.get_sprite(900, 100, 520, 540, SCALE_FACTOR),
self.sprite_sheet.get_sprite(130, 860, 520, 540, SCALE_FACTOR),
self.sprite_sheet.get_sprite(900, 860, 520, 580, SCALE_FACTOR),
]
self.frame = 0
self.image = self.anims[self.frame]
self.rect = self.image.get_rect(topleft=pos)
self.max_y = 400
self.min_y = 100
self.obstacles = obstacles
self.display_surface = pygame.display.get_surface()
self.lives = 3
self.points = 0
# Sounds
self.point_sound = pygame.mixer.Sound("assets/point.wav")
self.hit_sound = pygame.mixer.Sound("assets/hit.wav")
self.mixer = AudioManager()
self.mute_image = pygame.transform.scale(
pygame.image.load("assets/mute.png"), (64, 64))
# God Mode
self.god_mode = False
self.god_mode_image = pygame.transform.scale(
pygame.image.load("assets/godmode.jpg"),
(50, 50)
)
# UI
self.lives_txt = font.render(f"{self.lives}", True, "white")
self.lives_blink = BlinkSprite(
"",
((WINDOW_WIDTH - self.lives_txt.get_width()) - 30, 10),
self.lives_txt,
500
)
self.hiscore = read_hiscore()
self.hiscore_sound = pygame.mixer.Sound("assets/hiscore.wav")
self.hiscore_beaten = False
def input(self, event):
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_w or event.key == pygame.K_UP:
if not self.rect.topleft[1] == self.min_y:
Particles.create_particle(
self.groups(), self.rect.center, "white", 30)
self.rect.topleft -= pygame.Vector2(0, 150)
self.groups()[0].camera_shake()
if event.key == pygame.K_s or event.key == pygame.K_DOWN:
if not self.rect.topleft[1] == self.max_y:
Particles.create_particle(
self.groups(), self.rect.center, "white", 30)
self.rect.topleft += pygame.Vector2(0, 150)
self.groups()[0].camera_shake()
if event.key == pygame.K_g:
self.god_mode = not self.god_mode
def collison(self):
for sprite in self.obstacles.sprites():
if not self.rect.colliderect(sprite.rect):
continue
sprite.kill()
if isinstance(sprite, PointObstacle):
self.points += 2
if self.points > self.hiscore and not self.hiscore_beaten:
self.mixer.play_fx(self.hiscore_sound)
self.hiscore_beaten = True
elif self.points % 50 == 0:
self.mixer.play_fx(self.point_sound)
else:
Particles.create_particle(
self.groups(), self.rect.center, "black", 50)
self.groups()[0].camera_shake()
self.mixer.play_fx(self.hit_sound)
if not self.god_mode:
self.lives -= 1
self.lives_txt = font.render(
f"{self.lives}", True, "white")
def animate(self):
self.frame += 0.09
if self.frame >= len(self.anims) - 1:
self.frame = 0
self.image = self.anims[int(self.frame)]
def draw_ui(self):
score_txt = font.render(f"{self.points}", True, "white")
self.display_surface.blit(score_txt, (30, 10))
if self.lives == 1:
self.lives_blink.image = self.lives_txt
self.lives_blink.update()
self.lives_blink.draw(self.display_surface)
else:
self.display_surface.blit(
self.lives_txt, ((WINDOW_WIDTH - self.lives_txt.get_width()) - 30, 10))
if self.god_mode:
self.display_surface.blit(
self.god_mode_image,
(WINDOW_WIDTH // 2, 10)
)
if self.mixer.muted:
self.display_surface.blit(
self.mute_image, (30, WINDOW_HEIGHT - (self.mute_image.get_width() + 20)))
def update(self, *args, **kwargs) -> None:
self.animate()
self.collison()