2023-09-04 19:24:28 +08:00

88 lines
3.2 KiB
Python

'''
This file contains the Game class which manages the game loop and overall game logic.
'''
import pygame
from player import Player
from obstacle import Obstacle
from powerup import Powerup
import random
class Game:
def __init__(self):
self.screen_width = 800
self.screen_height = 600
self.screen = pygame.display.set_mode((self.screen_width, self.screen_height))
pygame.display.set_caption("Retro Runner")
self.clock = pygame.time.Clock()
self.is_running = True
self.player = Player()
self.obstacles = []
self.powerups = []
self.score = 0
def run(self):
while self.is_running:
self.handle_events()
self.update()
self.render()
self.clock.tick(60)
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.is_running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
self.player.jump()
elif event.key == pygame.K_DOWN:
self.player.slide()
def update(self):
self.player.update()
self.spawn_obstacles()
self.spawn_powerups()
self.check_collisions()
self.score += 1
for obstacle in self.obstacles:
obstacle.update()
if obstacle.x + obstacle.width < 0:
self.obstacles.remove(obstacle)
for powerup in self.powerups:
powerup.update()
if powerup.x + powerup.width < 0:
self.powerups.remove(powerup)
def render(self):
self.screen.fill((0, 0, 0))
self.player.draw(self.screen)
for obstacle in self.obstacles:
obstacle.draw(self.screen)
for powerup in self.powerups:
powerup.draw(self.screen)
self.draw_score()
pygame.display.flip()
def spawn_obstacles(self):
if len(self.obstacles) < 5:
x = self.screen_width
y = random.randint(400, 500)
width = random.randint(50, 100)
height = random.randint(50, 100)
obstacle = Obstacle(x, y, width, height)
self.obstacles.append(obstacle)
def spawn_powerups(self):
if len(self.powerups) < 2:
x = self.screen_width
y = random.randint(300, 400)
width = 50
height = 50
powerup = Powerup(x, y, width, height)
self.powerups.append(powerup)
def check_collisions(self):
player_rect = pygame.Rect(self.player.x, self.player.y, self.player.width, self.player.height)
powerups_to_remove = []
for powerup in self.powerups:
powerup_rect = pygame.Rect(powerup.x, powerup.y, powerup.width, powerup.height)
if player_rect.colliderect(powerup_rect):
powerups_to_remove.append(powerup)
self.score += 10
for powerup in powerups_to_remove:
self.powerups.remove(powerup)
def draw_score(self):
font = pygame.font.Font(None, 36)
score_text = font.render("Score: " + str(self.score), True, (255, 255, 255))
self.screen.blit(score_text, (10, 10))