View difference between Paste ID: KP4h2XHs and z7VjUFj0
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