Passed
Push — master ( 2f29cd...4bc53c )
by Yohann
01:12
created

game.Game.over_screen()   B

Complexity

Conditions 5

Size

Total Lines 40
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 30
nop 1
dl 0
loc 40
rs 8.6933
c 0
b 0
f 0
1
import pygame
2
3
from src.components.bullet import Bullet
4
from src.components.platform import Platform
5
from src.components.player import Player
6
from src.components.scrolling_background import ScrollingBackground
7
from src.utils import load, get_text
8
9
10
class Game:
11
12
    def __init__(self):
13
        pygame.init()
14
        pygame.mixer.init()
15
16
        self.clock = pygame.time.Clock()
17
        self.screen = pygame.display.set_mode((1280, 720))
18
19
        pygame.display.set_icon(load("src/assets/images/icon.png"))
20
        self.font = {
21
            size: pygame.font.Font("src/assets/fonts/setbackt.ttf", size)
22
            for size in (48, 64, 96, 128)
23
        }
24
25
        self.show_fps = True
26
        self.player = Player()
27
28
        self.run = True
29
        self.pause = False
30
        self.over = False
31
32
        self.events = {
33
            pygame.K_ESCAPE: self.pause_screen,
34
            pygame.K_SPACE: self.player.jump,
35
            pygame.K_d: self.player.accelerate,
36
            pygame.K_a: self.player.decelerate,
37
            pygame.K_f: self.toggle_fps
38
        }
39
40
        self.platforms = []
41
        self.bullets = []
42
        self.backgrounds = []
43
        self.limit = 4000
44
        self.score = 0
45
46
        self.cap_fps = 100
47
48
    def setup(self):
49
        pygame.mixer.music.load("src/assets/musics/music.mp3")
50
        pygame.mixer.music.set_volume(0.4)
51
        pygame.mixer.music.play()
52
53
        self.platforms = [
54
            Platform(x, y) for x, y in ((280, 620), (960, 640), (1620, 660))
55
        ]
56
57
        self.bullets = [Bullet() for _ in range(3)]
58
        self.player.reset()
59
        self.backgrounds = [ScrollingBackground(1280), ScrollingBackground(0)]
60
        self.over = False
61
        self.limit = 4000
62
        self.score = 0
63
64
    def toggle_fps(self):
65
        self.show_fps = not self.show_fps
66
67
    def main(self):
68
        self.setup()
69
70
        while self.run:
71
            self.screen.fill((121, 201, 249), ((0, 0), (1280, 360)))
72
            self.screen.fill((127, 173, 113), ((0, 593), (1280, 720)))
73
            for background in self.backgrounds:
74
                background.update()
75
                self.screen.blit(
76
                    background.texture,
77
                    (background.rect.x, 350),
78
                    (0, 0, 1280, 360)
79
                )
80
81
            for platform in self.platforms:
82
                platform.check_hit_box(self)
83
                platform.move(self)
84
                self.screen.blit(platform.texture, platform.rect)
85
86
            self.player.move()
87
88
            self.player.apply_gravity()
89
90
            if self.player.above(720):
91
                self.over = True
92
93
            self.screen.blit(self.player.texture, self.player.rect)
94
95
            for bullet in self.bullets:
96
                bullet.move(self)
97
                self.screen.blit(bullet.texture, bullet.rect)
98
99
                if bullet.check_hit_box(self.player):
100
                    self.over = True
101
                    break
102
103
            if len(self.bullets) < 3:
104
                self.bullets.append(Bullet())
105
106
            pygame.draw.rect(
107
                self.screen, (255, 255, 255), ((5, 5), (1270, 710)), 3
108
            )
109
110
            for event in pygame.event.get():
111
                if event.type == pygame.KEYDOWN:
112
                    if event.key in self.events:
113
                        self.events[event.key]()
114
115
                elif event.type == pygame.KEYUP:
116
                    if event.key == pygame.K_SPACE:
117
                        self.player.jump_available = True
118
119
                    elif event.key in [pygame.K_a, pygame.K_d]:
120
                        self.player.walk()
121
122
                elif event.type == pygame.QUIT:
123
                    self.run = False
124
125
            if self.over:
126
                self.over_screen()
127
128
            else:
129
                pygame.display.set_caption(
130
                    f"Duck Jump 2 | score : {self.score}"
131
                    + f" | {self.clock.get_fps()} " * self.show_fps
132
                )
133
134
                pygame.display.update()
135
                self.score += int(self.player.ax)
136
                self.clock.tick(self.cap_fps)
137
138
    def pause_screen(self):
139
        pygame.mixer.music.pause()
140
        self.fade((0, 128, 255, 1), 64)
141
        pygame.display.set_caption(
142
            "Duck Jump 2 | score : %i | Paused" % self.score
143
        )
144
145
        self.screen.blit(
146
            *get_text(
147
                "Paused",
148
                self.font[96],
149
                (255, 255, 255),
150
                (640, 300),
151
                centered=True)
152
        )
153
154
        self.screen.blit(
155
            *get_text(
156
                "press escape to unpause",
157
                self.font[48],
158
                (255, 255, 255),
159
                (640, 400),
160
                centered=True
161
            )
162
        )
163
        pygame.display.update()
164
165
        self.pause = True
166
        while self.pause:
167
            event = pygame.event.wait()
168
            if event.type == pygame.KEYDOWN:
169
                if event.key == pygame.K_ESCAPE:
170
                    pygame.mixer.music.unpause()
171
                    pygame.event.clear()
172
                    self.pause = False
173
174
            elif event.type == pygame.QUIT:
175
                self.pause = False
176
                self.run = False
177
178
    def over_screen(self):
179
        pygame.mixer.music.pause()
180
        self.fade((255, 32, 32, 1), 128)
181
        pygame.display.set_caption(
182
            "Duck Jump 2 | score : %i | GameOver" % self.score
183
        )
184
185
        self.screen.blit(
186
            *get_text(
187
                "Game Over",
188
                self.font[96],
189
                (255, 255, 255),
190
                (640, 300),
191
                centered=True
192
            )
193
        )
194
195
        self.screen.blit(
196
            *get_text(
197
                "press space to retry",
198
                self.font[48],
199
                (255, 255, 255),
200
                (640, 400),
201
                centered=True
202
            )
203
        )
204
205
        pygame.display.update()
206
207
        self.pause = True
208
        while self.pause:
209
            event = pygame.event.wait()
210
            if event.type == pygame.KEYDOWN:
211
                if event.key == pygame.K_SPACE:
212
                    self.setup()
213
                    self.pause = False
214
215
            elif event.type == pygame.QUIT:
216
                self.pause = False
217
                self.run = False
218
219
    def fade(self, c, iterations):
220
        alpha_layer = pygame.Surface((1280, 720), pygame.SRCALPHA)
221
        alpha_layer.fill(c)
222
223
        for _ in range(iterations):
224
            self.screen.blit(alpha_layer, (0, 0))
225
226
            pygame.draw.rect(
227
                self.screen, (255, 255, 255), ((5, 5), (1270, 710)), 3
228
            )
229
230
            for e in pygame.event.get():
231
                if e.type == pygame.QUIT:
232
                    break
233
234
            pygame.display.update()
235