Advertisement
MCreeper12731

Lesson 7 - Dynamic Camera

Apr 10th, 2025
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.36 KB | None | 0 0
  1. import random
  2. import pygame
  3. pygame.init()
  4. pygame.font.init()
  5.  
  6. font = pygame.font.SysFont("Times New Roman", 30)
  7.  
  8. WIDTH = 1200
  9. HEIGHT = 600
  10. window = pygame.display.set_mode((WIDTH, HEIGHT))
  11. pygame.display.set_caption("Platformer Game")
  12.  
  13. # Spremenljivke, ki jih bomo potrebovali za igralca
  14. # ---
  15.  
  16. class Coin:
  17.     def __init__(self, x, y):
  18.         self.position = pygame.Rect(x, y, 50, 42)
  19.         self.image = pygame.transform.scale(pygame.image.load("images/cheeseburger.png"), (50, 42))
  20.  
  21.     def collect(self, player):
  22.         player.score += 1
  23.  
  24.     def draw(self, player):
  25.         x_relative = self.position.x - (player.position.x - player.x_relative)
  26.         y_relative = self.position.y - (player.position.y - player.y_relative)
  27.  
  28.         window.blit(self.image, (x_relative, y_relative))
  29.  
  30. class Player:
  31.     def __init__(self, x, y):
  32.         self.size = 75
  33.         self.position = pygame.Rect(x, y, self.size, self.size)
  34.         self.image = pygame.image.load("images/scratch-cat.png")
  35.         self.image = pygame.transform.scale(self.image, (self.size, self.size))
  36.         self.speed_x = 0
  37.         self.speed_y = 0
  38.         self.jumps = 3
  39.         self.score = 0
  40.         self.direction = 0
  41.         self.x_relative = (WIDTH - self.size) // 2
  42.         self.y_relative = 3 * (HEIGHT - self.size) // 4
  43.    
  44.     def move(self):
  45.         keys = pygame.key.get_pressed()
  46.         if keys[pygame.K_d]:
  47.             self.speed_x = 5
  48.             self.direction = 1
  49.         elif keys[pygame.K_a]:
  50.             self.speed_x = -5
  51.             self.direction = -1
  52.         else:
  53.             self.speed_x = 0
  54.  
  55.         if keys[pygame.K_SPACE] and self.jumps > 0 and self.speed_y > -5:
  56.             self.jumps -= 1
  57.             self.speed_y = -18
  58.  
  59.         if self.speed_y < 20:
  60.             self.speed_y += 1
  61.  
  62.         self.position.x += self.speed_x
  63.         self.position.y += self.speed_y
  64.  
  65.         # if self.position.x < 0:
  66.         #     self.position.x = 0
  67.         # if self.position.x > WIDTH - self.size:
  68.         #     self.position.x = WIDTH - self.size
  69.         # if self.position.y < 0:
  70.         #     self.position.y = 0
  71.         # if self.position.y > HEIGHT - self.size:
  72.         #     self.position.y = HEIGHT - self.size
  73.        
  74.         for platform in platforms:
  75.             if self.position.colliderect(platform.position):
  76.                 resolve_collision(self.position, platform.position)
  77.  
  78.     def draw(self):
  79.         if (player.direction < 0):
  80.             window.blit(pygame.transform.flip(player.image, True, False), (self.x_relative, self.y_relative))
  81.         else:
  82.             window.blit(self.image, (self.x_relative, self.y_relative))
  83.        
  84.  
  85. class Platform:
  86.     def __init__(self, x, y, width, height):
  87.         self.position = pygame.Rect(x, y, width, height)
  88.  
  89.     def draw(self, player):
  90.         x_relative = self.position.x - (player.position.x - player.x_relative)
  91.         y_relative = self.position.y - (player.position.y - player.y_relative)
  92.        
  93.         pygame.draw.rect(window, (0, 127, 0), pygame.Rect(x_relative, y_relative, self.position.width, self.position.height))
  94.  
  95.        
  96.  
  97. player = Player(100, 100)
  98.  
  99. platforms = [Platform(0, HEIGHT - 50, WIDTH, 50), Platform(300, 500, 200, 20), Platform(600, 350, 200, 20), Platform(900, 400, 200, 20)]
  100.  
  101. coins = [Coin(400, 150), Coin(600, 200), Coin(900, 300)]
  102. # ---
  103.  
  104. def resolve_collision(rect_a, rect_b):
  105.     # Compute overlap distances in x and y
  106.     dx1 = rect_b.right - rect_a.left
  107.     dx2 = rect_a.right - rect_b.left
  108.     dy1 = rect_b.bottom - rect_a.top
  109.     dy2 = rect_a.bottom - rect_b.top
  110.  
  111.     # Find the smallest displacement to separate them
  112.     min_dx = min(dx1, dx2)
  113.     min_dy = min(dy1, dy2)
  114.  
  115.     if min_dx < min_dy:
  116.         # Move rect_a left or right
  117.         if dx1 < dx2:
  118.             rect_a.x += dx1  # Move right
  119.         else:
  120.             rect_a.x -= dx2  # Move left
  121.     else:
  122.         # Move rect_a up or down
  123.         if dy1 < dy2:
  124.             pass
  125.             # player.speed_y = 0
  126.             # rect_a.y += dy1  # Move down
  127.         else:
  128.             player.jumps = 3
  129.             player.speed_y = 0
  130.             rect_a.y -= dy2  # Move up
  131.    
  132.     return True  # Collision was resolved
  133.  
  134. # Glavna zanka igre
  135. clock = pygame.time.Clock()
  136. running = True
  137. while running:
  138.     for event in pygame.event.get():
  139.         if event.type == pygame.QUIT:
  140.             running = False
  141.  
  142.     window.fill((0, 255, 255))
  143.     # background_image = pygame.image.load("images/New Piskel.png")
  144.     # background_image = pygame.transform.scale(background_image, (width, height))
  145.     # window.blit(background_image, (0, 0))
  146.     # Premikanje igralčevega lika
  147.     # ---
  148.  
  149.     # Vsako ponovitev zanke (vsak frame) dobimo pritisnjene tipke
  150.     # in se glede na njih odločimo, kako bomo igralca premaknili
  151.  
  152.     player.move()
  153.  
  154.     for coin in coins:
  155.         if player.position.colliderect(coin.position):
  156.             coin.collect(player)
  157.             coins.remove(coin)
  158.  
  159.     # ---
  160.     # Izris likov
  161.     # ---
  162.  
  163.     player.draw()
  164.  
  165.     font_render = font.render(f"Score: {player.score}", False, (0, 0, 0))
  166.     window.blit(font_render, (0, 0))
  167.    
  168.     for platform in platforms:
  169.         platform.draw(player)
  170.  
  171.     for coin in coins:
  172.         coin.draw(player)
  173.         # window.blit(slika_ovire, platform)
  174.  
  175.     # ---
  176.  
  177.     pygame.display.update()
  178.     clock.tick(60)
  179.  
  180. pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement