You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.6 KiB
89 lines
3.6 KiB
import pygame
|
|
import settings
|
|
from player import Player
|
|
from obstacle import Obstacle
|
|
import random
|
|
from item import Item
|
|
|
|
class World:
|
|
def __init__(self, screen):
|
|
# Hindernisse
|
|
self.obstacles = []
|
|
|
|
while len(self.obstacles) < settings.world.obstacle.amount:
|
|
x = random.randint(500, 12500)
|
|
# Prüfen, ob der neue x weit genug entfernt ist von bestehenden Hindernissen
|
|
if all(abs(x - obs.rect.x) > 800 for obs in self.obstacles):
|
|
self.obstacles.append(Obstacle(x, 500, settings.world.obstacle.box))
|
|
|
|
|
|
# ITEMS
|
|
self.items = []
|
|
|
|
while len(self.items) < settings.world.items.amount:
|
|
x = random.randint(200, 12800)
|
|
y = random.randint(100, 500)
|
|
# Prüfen, ob der neue x weit genug entfernt ist von bestehenden Hindernissen
|
|
if all(abs(x - item.rect.x) > 200 for item in self.items):
|
|
self.items.append(Item(x, y))
|
|
|
|
# Welt Generierung
|
|
self.screen = screen
|
|
self.background = pygame.image.load(settings.BACKGROUND_IMG).convert()
|
|
self.bg_width = self.background.get_width()
|
|
|
|
# Boden
|
|
self.ground_rect = pygame.Rect(0, 650, 5000 * 2.7, 80) # Boden
|
|
full_image = pygame.image.load(settings.world.ground.img).convert_alpha()
|
|
# --- Ausschneiden des Bereichs
|
|
cropped = pygame.Surface((settings.world.ground.crop_scale_right, settings.world.ground.crop_height), pygame.SRCALPHA)
|
|
cropped.blit(full_image, (0, 0), (0, settings.world.ground.crop_top, settings.world.ground.crop_scale_right, settings.world.ground.crop_height))
|
|
# --- Skalieren für Anzeige
|
|
self.ground_image = pygame.transform.scale(cropped, (settings.world.ground.scale_width, settings.world.ground.scale_height))
|
|
self.tile_width = self.ground_image.get_width()
|
|
|
|
# Spieler
|
|
self.player = Player(200, 500) # Spieler
|
|
|
|
# SCORE
|
|
self.save_score = 0
|
|
|
|
def draw(self):
|
|
self.screen.fill((0, 0, 0)) # Bildschirm löschen, bevor gezeichnet wird
|
|
camera_offset = self.player.rect.centerx - settings.SCREEN_WIDTH // 2
|
|
world_width = max(self.bg_width, max([obs.rect.right for obs in self.obstacles] + [self.ground_rect.right]))
|
|
camera_offset = max(0, min(camera_offset, world_width - settings.SCREEN_WIDTH))
|
|
score = self.player.update(self.ground_rect.top, self.obstacles, self.items)
|
|
# print(score)
|
|
if score != 0:
|
|
self.save_score += 10
|
|
print(self.save_score) if settings.DEBUG else None
|
|
|
|
bg_offset = int(camera_offset * 0.3) # Parallax: langsamer bewegen
|
|
self.screen.blit(self.background, (-bg_offset, 0))
|
|
# Boden kacheln ohne Parallax
|
|
start_tile = (camera_offset // self.tile_width) * self.tile_width
|
|
end_x = camera_offset + settings.SCREEN_WIDTH
|
|
x = start_tile
|
|
while x < end_x:
|
|
screen_x = x - camera_offset
|
|
self.screen.blit(self.ground_image, (screen_x, self.ground_rect.top))
|
|
x += self.tile_width
|
|
|
|
for obs in self.obstacles:
|
|
obs.draw(self.screen, camera_offset)
|
|
|
|
for items in self.items:
|
|
items.draw(self.screen, camera_offset)
|
|
|
|
player_screen_x = self.player.rect.x - camera_offset
|
|
self.screen.blit(self.player.image, (player_screen_x, self.player.rect.y))
|
|
|
|
def handle_event(self, event):
|
|
if event.type == pygame.KEYDOWN:
|
|
if event.key == pygame.K_ESCAPE:
|
|
if settings.DEBUG:
|
|
print("ESC-Pressed")
|
|
return "menu"
|
|
# self.player.handle_event(event)
|
|
return None |