SHOW:
|
|
- or go back to the newest paste.
1 | # Import modulu pygame, dzieki ktoremu tworzymy aplikacje okienkowa | |
2 | import pygame | |
3 | from random import choice, randint | |
4 | ||
5 | ||
6 | # Inicjalizacja modułu | |
7 | pygame.init() | |
8 | # Utworzenie okna o określonych wymiarach | |
9 | SCREEN_WIDTH = 800 | |
10 | SCREEN_HEIGHT = 600 | |
11 | ||
12 | screen_surface = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) | |
13 | # Nadanie nazwy oknu | |
14 | pygame.display.set_caption('Pierwsza Gra') | |
15 | ||
16 | # Utworzenie zegara, który nadzoruje stałe wartości fps | |
17 | clock = pygame.time.Clock() | |
18 | ||
19 | POINTS_FONT = pygame.font.SysFont("verdana", 20) | |
20 | ||
21 | bonus_images = [ | |
22 | 'bonus_1.png', | |
23 | 'bonus_2.png', | |
24 | 'bonus_3.png' | |
25 | ] | |
26 | ||
27 | FRAMES_PER_SECOND = 60 | |
28 | frames_cnt = 0 | |
29 | ||
30 | # Liczba punktów gracza | |
31 | player_points = 0 | |
32 | ||
33 | ||
34 | def load_image(img_path: str, position): | |
35 | image = pygame.image.load(img_path) | |
36 | surface = image.convert() | |
37 | ||
38 | transparent_color = (0, 0, 0) | |
39 | surface.set_colorkey(transparent_color) | |
40 | ||
41 | # Pozycja wyświetlania obiektu zapisana jest w rect | |
42 | rect = surface.get_rect(center=position) | |
43 | ||
44 | return [image, surface, rect] | |
45 | ||
46 | def print_image(img_list) -> None: | |
47 | # [image, surface, rect] | |
48 | image, surface, rect = img_list | |
49 | screen_surface.blit(surface, rect) | |
50 | pass | |
51 | ||
52 | def set_position_image(img_list, position): | |
53 | image, surface, rect = img_list | |
54 | rect = surface.get_rect(center=position) | |
55 | return [image, surface, rect] | |
56 | ||
57 | def calculate_player_movement(keys): | |
58 | # Poruszanie postacią | |
59 | speed = 10 | |
60 | delta_x = 0 | |
61 | delta_y = 0 | |
62 | ||
63 | if keys[pygame.K_w]: | |
64 | delta_y -= speed | |
65 | if keys[pygame.K_s]: | |
66 | delta_y += speed | |
67 | if keys[pygame.K_d]: | |
68 | delta_x += speed | |
69 | if keys[pygame.K_a]: | |
70 | delta_x -= speed | |
71 | ||
72 | return [delta_x, delta_y] | |
73 | ||
74 | def limit_position(position): | |
75 | x, y = position | |
76 | x = max(0, min(x, SCREEN_WIDTH)) | |
77 | y = max(0, min(y, SCREEN_HEIGHT)) | |
78 | return [x, y] | |
79 | ||
80 | def generate_bonus_object(): | |
81 | # Wylosowanie nazwy pliku do wczytania | |
82 | image_name = choice(bonus_images) | |
83 | # Wylosowanie współrzędnych dla nowego obiektu | |
84 | x = randint(0, SCREEN_WIDTH) | |
85 | y = randint(0, SCREEN_HEIGHT) | |
86 | # Utworzenie zmiennej position, która będzie listą dwuelementową | |
87 | position = [x, y] | |
88 | # Utworzenie grafiki za pomocą funkcji load_image | |
89 | new_obj = load_image(image_name, position) | |
90 | # Dodanie gotowego obiektu bonus do listy wszystkich elementów | |
91 | bonus_objects.append(new_obj) | |
92 | pass | |
93 | ||
94 | def print_bonus_objects(): | |
95 | # Iteracja po obiektach bonusowych | |
96 | for obj in bonus_objects: | |
97 | # Wyświetlenie obiektu na ekranie gry, | |
98 | # za pomoca wczesniej przygotowanej funkcji | |
99 | print_image(obj) | |
100 | pass | |
101 | pass | |
102 | ||
103 | def check_collisions(): | |
104 | global player_points | |
105 | rect_player = player[2] | |
106 | ||
107 | # Do wyboru sposób indeksowania | |
108 | # for i in range(len(bonus_objects)): | |
109 | # index = len(bonus_objects) - 1 - i | |
110 | for index in range(len(bonus_objects) - 1, -1, -1): | |
111 | obj = bonus_objects[index] | |
112 | rect = obj[2] | |
113 | if rect.colliderect(rect_player): | |
114 | bonus_objects.pop(index) | |
115 | player_points += 1 | |
116 | print(f"\rPoints: {player_points}", end='') | |
117 | pass | |
118 | pass | |
119 | pass | |
120 | ||
121 | def print_points(points: int) -> None: | |
122 | text = f"Points: {points}" | |
123 | color = [255, 255, 255] | |
124 | position = [0, 0] | |
125 | label = POINTS_FONT.render(text, False, color) | |
126 | screen_surface.blit(label, position) | |
127 | pass | |
128 | ||
129 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | |
130 | player_pos = [SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2] | |
131 | player = load_image('player.png', player_pos) | |
132 | background_color = [9, 42, 121] | |
133 | # Lista przechowująca obiekty bonusowe | |
134 | # Gotowy obiekt to trójelementowa lista uzyskana z load_image | |
135 | bonus_objects = [] | |
136 | ||
137 | # Zmienna określająca, czy należy zamknąć okno | |
138 | game_status = True | |
139 | # Kod wykonywany póki aplikacja jest uruchomiona | |
140 | while game_status: | |
141 | ||
142 | # Odczytanie zdarzeń zarejestrowanych przez komputer | |
143 | events = pygame.event.get() | |
144 | ||
145 | for event in events: | |
146 | # Naciśnięto X - zamykanie aplikacji | |
147 | if event.type == pygame.QUIT: | |
148 | game_status = False | |
149 | pass # for event | |
150 | ||
151 | pressed_keys = pygame.key.get_pressed() | |
152 | ||
153 | delta_x, delta_y = calculate_player_movement(pressed_keys) | |
154 | ||
155 | # Zmiana wartości współrzędnych | |
156 | player_pos[0] += delta_x | |
157 | player_pos[1] += delta_y | |
158 | # Sprawdzenie limitów współrzędnych | |
159 | player_pos = limit_position(player_pos) | |
160 | ||
161 | # Zmiana współrzędnych obrazu | |
162 | player = set_position_image(player, player_pos) | |
163 | - | if frames_cnt % FRAMES_PER_SECOND * 1 == 0: |
163 | + | |
164 | # Uzupełnij tło | |
165 | screen_surface.fill(background_color) | |
166 | # Wyświetl gracza | |
167 | print_image(player) | |
168 | ||
169 | # Dodawanie bonusu - pierwsze dodanie bez warunku ograniczającego ;) | |
170 | if frames_cnt % (FRAMES_PER_SECOND * 1) == 0: | |
171 | generate_bonus_object() | |
172 | pass | |
173 | ||
174 | check_collisions() | |
175 | ||
176 | print_bonus_objects() | |
177 | ||
178 | print_points(player_points) | |
179 | ||
180 | # Odświeżenie wyświetlanego okna | |
181 | pygame.display.update() | |
182 | ||
183 | frames_cnt += 1 | |
184 | ||
185 | clock.tick(FRAMES_PER_SECOND) | |
186 | pass | |
187 | ||
188 | print("Zamykanie aplikacji") | |
189 | # Zamknięcie aplikacji | |
190 | pygame.quit() | |
191 | # Zamknięcie skryptu | |
192 | quit() | |
193 | ||
194 |