Passed
Push — master ( 4bc53c...b6fdd8 )
by Yohann
01:16
created

game.Game.pause_screen()   B

Complexity

Conditions 5

Size

Total Lines 39
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 31
nop 1
dl 0
loc 39
rs 8.6693
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 update(self):
68
        self.screen.fill((121, 201, 249), ((0, 0), (1280, 360)))
69
        self.screen.fill((127, 173, 113), ((0, 593), (1280, 720)))
70
        for background in self.backgrounds:
71
            background.update()
72
            self.screen.blit(
73
                background.texture,
74
                (background.rect.x, 350),
75
                (0, 0, 1280, 360)
76
            )
77
78
        for platform in self.platforms:
79
            platform.check_hit_box(self)
80
            platform.move(self)
81
            self.screen.blit(platform.texture, platform.rect)
82
83
        self.player.move()
84
        self.player.apply_gravity()
85
86
        if self.player.above(720):
87
            self.over = True
88
89
        self.screen.blit(self.player.texture, self.player.rect)
90
91
        for bullet in self.bullets:
92
            bullet.move(self)
93
            self.screen.blit(bullet.texture, bullet.rect)
94
95
            if bullet.check_hit_box(self.player):
96
                self.over = True
97
                break
98
99
        if len(self.bullets) < 3:
100
            self.bullets.append(Bullet())
101
102
        pygame.draw.rect(
103
            self.screen, (255, 255, 255), ((5, 5), (1270, 710)), 3
104
        )
105
106
    def handle_events(self):
107
        for event in pygame.event.get():
108
            if event.type == pygame.QUIT:
109
                self.run = False
110
                return
111
112
            if event.type == pygame.KEYDOWN:
113
                if event.key in self.events:
114
                    self.events[event.key]()
115
116
            elif event.type == pygame.KEYUP:
117
                if event.key == pygame.K_SPACE:
118
                    self.player.jump_available = True
119
120
                elif event.key in [pygame.K_a, pygame.K_d]:
121
                    self.player.walk()
122
123
    def main(self):
124
        self.setup()
125
126
        while self.run:
127
            self.update()
128
            self.handle_events()
129
130
            if self.over:
131
                self.over_screen()
132
133
            else:
134
                self.draw()
135
136
    def draw(self):
137
        pygame.display.set_caption(
138
            f"Duck Jump 2 | score : {self.score}"
139
            + f" | {self.clock.get_fps()} " * self.show_fps
140
        )
141
142
        pygame.display.update()
143
        self.score += int(self.player.ax)
144
        self.clock.tick(self.cap_fps)
145
146
    def pause_screen(self):
147
        pygame.mixer.music.pause()
148
        self.fade((0, 128, 255, 1), 64)
149
        pygame.display.set_caption(
150
            "Duck Jump 2 | score : %i | Paused" % self.score
151
        )
152
153
        self.screen.blit(
154
            *get_text(
155
                "Paused",
156
                self.font[96],
157
                (255, 255, 255),
158
                (640, 300),
159
                centered=True)
160
        )
161
162
        self.screen.blit(
163
            *get_text(
164
                "press escape to unpause",
165
                self.font[48],
166
                (255, 255, 255),
167
                (640, 400),
168
                centered=True
169
            )
170
        )
171
        pygame.display.update()
172
173
        self.pause = True
174
        while self.pause:
175
            event = pygame.event.wait()
176
            if event.type == pygame.KEYDOWN:
177
                if event.key == pygame.K_ESCAPE:
178
                    pygame.mixer.music.unpause()
179
                    pygame.event.clear()
180
                    self.pause = False
181
182
            elif event.type == pygame.QUIT:
183
                self.pause = False
184
                self.run = False
185
186
    def over_screen(self):
187
        pygame.mixer.music.pause()
188
        self.fade((255, 32, 32, 1), 128)
189
        pygame.display.set_caption(
190
            "Duck Jump 2 | score : %i | GameOver" % self.score
191
        )
192
193
        self.screen.blit(
194
            *get_text(
195
                "Game Over",
196
                self.font[96],
197
                (255, 255, 255),
198
                (640, 300),
199
                centered=True
200
            )
201
        )
202
203
        self.screen.blit(
204
            *get_text(
205
                "press space to retry",
206
                self.font[48],
207
                (255, 255, 255),
208
                (640, 400),
209
                centered=True
210
            )
211
        )
212
213
        pygame.display.update()
214
215
        self.pause = True
216
        while self.pause:
217
            event = pygame.event.wait()
218
            if event.type == pygame.KEYDOWN:
219
                if event.key == pygame.K_SPACE:
220
                    self.setup()
221
                    self.pause = False
222
223
            elif event.type == pygame.QUIT:
224
                self.pause = False
225
                self.run = False
226
227
    def fade(self, c, iterations):
228
        alpha_layer = pygame.Surface((1280, 720), pygame.SRCALPHA)
229
        alpha_layer.fill(c)
230
231
        for _ in range(iterations):
232
            self.screen.blit(alpha_layer, (0, 0))
233
234
            pygame.draw.rect(
235
                self.screen, (255, 255, 255), ((5, 5), (1270, 710)), 3
236
            )
237
238
            for e in pygame.event.get():
239
                if e.type == pygame.QUIT:
240
                    break
241
242
            pygame.display.update()
243