diff --git a/assets/backgrounds/background.png b/assets/backgrounds/background.png new file mode 100644 index 0000000..5edd4e7 Binary files /dev/null and b/assets/backgrounds/background.png differ diff --git a/assets/images/player/fred_back.png b/assets/images/player/fred_back.png new file mode 100644 index 0000000..2bb90c0 Binary files /dev/null and b/assets/images/player/fred_back.png differ diff --git a/assets/images/player/fred_turn.png b/assets/images/player/fred_turn.png new file mode 100644 index 0000000..8ad440f Binary files /dev/null and b/assets/images/player/fred_turn.png differ diff --git a/assets/obstacles/box.png b/assets/obstacles/box.png new file mode 100644 index 0000000..eb6c8fc Binary files /dev/null and b/assets/obstacles/box.png differ diff --git a/assets/obstacles/ramp.png b/assets/obstacles/ramp.png new file mode 100644 index 0000000..e72f183 Binary files /dev/null and b/assets/obstacles/ramp.png differ diff --git a/assets/obstacles/stange.png b/assets/obstacles/stange.png new file mode 100644 index 0000000..e12348f Binary files /dev/null and b/assets/obstacles/stange.png differ diff --git a/src/main.py b/src/main.py index 16f36a8..bee981c 100644 --- a/src/main.py +++ b/src/main.py @@ -8,7 +8,7 @@ from world import World def main(): pygame.init() screen = pygame.display.set_mode((settings.SCREEN_WIDTH, settings.SCREEN_HEIGHT)) - pygame.display.set_caption("The Last Ollie \n A Fred Story") + pygame.display.set_caption("The Last Ollie - A Fred Story") clock = pygame.time.Clock() menu = Menu(screen) @@ -39,7 +39,7 @@ def main(): if current_scene == "menu": menu.draw() elif current_scene == "world": - world.player.update(world.ground_rect.top) + world.player.update(670) world.draw() pygame.display.flip() diff --git a/src/obstacle.py b/src/obstacle.py new file mode 100644 index 0000000..71ebe3e --- /dev/null +++ b/src/obstacle.py @@ -0,0 +1,14 @@ +import pygame +import settings + +class Obstacle: + def __init__(self, x, y, image_path): + self.image = pygame.image.load(image_path).convert_alpha() + self.image = pygame.transform.scale(self.image, (300, 150)) # Größe anpassen + self.rect = self.image.get_rect(topleft=(x, y)) + + def draw(self, screen, camera_offset): + screen.blit(self.image, (self.rect.x - camera_offset, self.rect.y)) + + def get_rect(self): + return self.rect \ No newline at end of file diff --git a/src/player.py b/src/player.py index 900c6ac..7c26c7f 100644 --- a/src/player.py +++ b/src/player.py @@ -11,6 +11,10 @@ class Player: pygame.image.load(settings.player.fred.olli).convert_alpha(), settings.player.size ) + self.image_left = pygame.transform.scale( + pygame.image.load(settings.player.fred.left).convert_alpha(), + settings.player.size + ) self.image = self.image_normal # Anfangszustand self.rect = self.image.get_rect(topleft=(x, y)) self.velocity_y = 0 @@ -19,25 +23,33 @@ class Player: self.jump_strength = settings.player.jump_strength self.on_ground = False - def update(self, ground_y): + def update(self, ground_y, obstacles=[]): keys = pygame.key.get_pressed() - was_on_ground = self.on_ground + + # Bewegung seitlich if keys[pygame.K_LEFT]: self.rect.x -= self.speed if keys[pygame.K_RIGHT]: self.rect.x += self.speed + + # Sprung if keys[pygame.K_SPACE] and self.on_ground: self.velocity_y = self.jump_strength self.on_ground = False - if self.on_ground and self.image != self.image_normal: - self.image = self.image_normal - elif not self.on_ground and self.image != self.image_jump: - self.image = self.image_jump - if not self.on_ground and was_on_ground and settings.DEBUG: - print("Fred springt!") + # Gravitation self.velocity_y += self.gravity self.rect.y += self.velocity_y + self.on_ground = False # zurücksetzen + + # Plattform-Kollision prüfen + for obs in obstacles: + if self.rect.colliderect(obs.get_rect()): + # nur wenn Spieler von oben kommt + if self.velocity_y > 0 and self.rect.bottom <= obs.get_rect().top + 20: + self.rect.bottom = obs.get_rect().top + self.velocity_y = 0 + self.on_ground = True # Boden-Kollision if self.rect.bottom >= ground_y: @@ -45,5 +57,15 @@ class Player: self.velocity_y = 0 self.on_ground = True + # Bildlogik + if not self.on_ground: + self.image = self.image_jump + elif keys[pygame.K_LEFT]: + self.image = self.image_left + elif keys[pygame.K_RIGHT]: + self.image = self.image_normal + else: + self.image = self.image_normal + def draw(self, screen): screen.blit(self.image, self.rect) \ No newline at end of file diff --git a/src/settings.py b/src/settings.py index 75f9330..50241da 100644 --- a/src/settings.py +++ b/src/settings.py @@ -5,20 +5,25 @@ FPS = 60 DEBUG = True Mute = True START_POINT = "world" # world, menu +BACKGROUND_IMG = "../assets/backgrounds/background.png" # Schriftarten class fonts: PressStart2P = '../assets/fonts/PressStart2P-Regular.ttf' class player: - size = (100, 100) - speed = 5 + size = (200, 200) + speed = 10 gravity = 1 jump_strength = -18 class fred: normal = "../assets/images/player/fred.png" olli = "../assets/images/player/fred_olli.png" + left = "../assets/images/player/fred_back.png" + +class obstacles: + box = "../assets/obstacles/box.png" # Farben class MyColors: diff --git a/src/world.py b/src/world.py index 8b07b91..381c0da 100644 --- a/src/world.py +++ b/src/world.py @@ -1,18 +1,38 @@ import pygame import settings from player import Player +from obstacle import Obstacle +import random class World: def __init__(self, screen): + # Hindernisse + self.obstacles = [] + obstacle_count = random.randint(2, 3) + for _ in range(obstacle_count): + x = random.randint(500, 4000) # X-Position irgendwo in der Welt + self.obstacles.append(Obstacle(x, 520, settings.obstacles.box)) + + # Welt Generierung self.screen = screen - self.background_color = (135, 206, 235) # Himmelblau - self.ground_rect = pygame.Rect(0, 600, 1280, 120) # Boden + self.background = pygame.image.load(settings.BACKGROUND_IMG).convert() + self.bg_width = self.background.get_width() + self.ground_rect = pygame.Rect(0, 740, 5000, 80) # Boden self.player = Player(200, 500) # Spieler def draw(self): - self.screen.fill(self.background_color) - pygame.draw.rect(self.screen, (124, 252, 0), self.ground_rect) # Grün für Boden - self.player.draw(self.screen) + camera_offset = self.player.rect.centerx - settings.SCREEN_WIDTH // 2 + camera_offset = max(0, min(camera_offset, self.bg_width - settings.SCREEN_WIDTH)) + self.player.update(self.ground_rect.top, self.obstacles) + + self.screen.blit(self.background, (-camera_offset, 0)) + # pygame.draw.rect(self.screen, (124, 252, 0), self.ground_rect) + + for obs in self.obstacles: + obs.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: