giganciprogramowania

PyGame_Lekcja13_Bonusy

Jul 5th, 2023
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.  
  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.  
Add Comment
Please, Sign In to add comment