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 | bonus_images = [ | |
| 20 | 'bonus_1.png', | |
| 21 | 'bonus_2.png', | |
| 22 | 'bonus_3.png' | |
| 23 | ] | |
| 24 | ||
| 25 | FRAMES_PER_SECOND = 60 | |
| 26 | frames_cnt = 0 | |
| 27 | ||
| 28 | ||
| 29 | def load_image(img_path: str, position): | |
| 30 | image = pygame.image.load(img_path) | |
| 31 | surface = image.convert() | |
| 32 | ||
| 33 | transparent_color = (0, 0, 0) | |
| 34 | surface.set_colorkey(transparent_color) | |
| 35 | ||
| 36 | # Pozycja wyświetlania obiektu zapisana jest w rect | |
| 37 | rect = surface.get_rect(center=position) | |
| 38 | ||
| 39 | return [image, surface, rect] | |
| 40 | ||
| 41 | ||
| 42 | def print_image(img_list) -> None: | |
| 43 | # [image, surface, rect] | |
| 44 | image, surface, rect = img_list | |
| 45 | screen_surface.blit(surface, rect) | |
| 46 | pass | |
| 47 | ||
| 48 | ||
| 49 | def set_position_image(img_list, position): | |
| 50 | image, surface, rect = img_list | |
| 51 | rect = surface.get_rect(center=position) | |
| 52 | return [image, surface, rect] | |
| 53 | ||
| 54 | ||
| 55 | def calculate_player_movement(keys): | |
| 56 | # Poruszanie postacią | |
| 57 | speed = 10 | |
| 58 | delta_x = 0 | |
| 59 | delta_y = 0 | |
| 60 | ||
| 61 | if keys[pygame.K_w]: | |
| 62 | delta_y -= speed | |
| 63 | if keys[pygame.K_s]: | |
| 64 | delta_y += speed | |
| 65 | if keys[pygame.K_d]: | |
| 66 | delta_x += speed | |
| 67 | if keys[pygame.K_a]: | |
| 68 | delta_x -= speed | |
| 69 | ||
| 70 | return [delta_x, delta_y] | |
| 71 | ||
| 72 | ||
| 73 | def limit_position(position): | |
| 74 | x, y = position | |
| 75 | x = max(0, min(x, SCREEN_WIDTH)) | |
| 76 | y = max(0, min(y, SCREEN_HEIGHT)) | |
| 77 | return [x, y] | |
| 78 | ||
| 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 | ||
| 95 | def print_bonus_objects(): | |
| 96 | # Iteracja po obiektach bonusowych | |
| 97 | for obj in bonus_objects: | |
| 98 | # Wyświetlenie obiektu na ekranie gry, | |
| 99 | # za pomoca wczesniej przygotowanej funkcji | |
| 100 | print_image(obj) | |
| 101 | pass | |
| 102 | pass | |
| 103 | ||
| 104 | ||
| 105 | def check_collisions(): | |
| 106 | rect_player = player[2] | |
| 107 | ||
| 108 | # Do wyboru sposób indeksowania | |
| 109 | # for i in range(len(bonus_objects)): | |
| 110 | # index = len(bonus_objects) - 1 - i | |
| 111 | ||
| 112 | for index in range(len(bonus_objects) - 1, -1, -1): | |
| 113 | obj = bonus_objects[index] | |
| 114 | rect = obj[2] | |
| 115 | if rect.colliderect(rect_player): | |
| 116 | bonus_objects.pop(index) | |
| 117 | pass | |
| 118 | pass | |
| 119 | pass | |
| 120 | ||
| 121 | ||
| 122 | # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | |
| 123 | player_pos = [SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2] | |
| 124 | player = load_image('player.png', player_pos)
| |
| 125 | background_color = [9, 42, 121] | |
| 126 | # Lista przechowująca obiekty bonusowe | |
| 127 | # Gotowy obiekt to trójelementowa lista uzyskana z load_image | |
| 128 | bonus_objects = [] | |
| 129 | ||
| 130 | # Zmienna określająca, czy należy zamknąć okno | |
| 131 | game_status = True | |
| 132 | # Kod wykonywany póki aplikacja jest uruchomiona | |
| 133 | while game_status: | |
| 134 | ||
| 135 | # Odczytanie zdarzeń zarejestrowanych przez komputer | |
| 136 | events = pygame.event.get() | |
| 137 | ||
| 138 | for event in events: | |
| 139 | # Naciśnięto X - zamykanie aplikacji | |
| 140 | if event.type == pygame.QUIT: | |
| 141 | game_status = False | |
| 142 | pass # for event | |
| 143 | ||
| 144 | pressed_keys = pygame.key.get_pressed() | |
| 145 | ||
| 146 | delta_x, delta_y = calculate_player_movement(pressed_keys) | |
| 147 | ||
| 148 | # Zmiana wartości współrzędnych | |
| 149 | player_pos[0] += delta_x | |
| 150 | player_pos[1] += delta_y | |
| 151 | # Sprawdzenie limitów współrzędnych | |
| 152 | player_pos = limit_position(player_pos) | |
| 153 | ||
| 154 | # Zmiana współrzędnych obrazu | |
| 155 | player = set_position_image(player, player_pos) | |
| 156 | ||
| 157 | # Uzupełnij tło | |
| 158 | screen_surface.fill(background_color) | |
| 159 | # Wyświetl gracza | |
| 160 | print_image(player) | |
| 161 | ||
| 162 | # Dodawanie bonusu - pierwsze dodanie bez warunku ograniczającego ;) | |
| 163 | if frames_cnt % FRAMES_PER_SECOND * 1 == 0: | |
| 164 | generate_bonus_object() | |
| 165 | pass | |
| 166 | ||
| 167 | check_collisions() | |
| 168 | ||
| 169 | print_bonus_objects() | |
| 170 | ||
| 171 | # Odświeżenie wyświetlanego okna | |
| 172 | pygame.display.update() | |
| 173 | ||
| 174 | frames_cnt += 1 | |
| 175 | ||
| 176 | clock.tick(FRAMES_PER_SECOND) | |
| 177 | pass | |
| 178 | ||
| 179 | print("Zamykanie aplikacji")
| |
| 180 | # Zamknięcie aplikacji | |
| 181 | pygame.quit() | |
| 182 | # Zamknięcie skryptu | |
| 183 | quit() | |
| 184 | ||
| 185 |