From 87aa85cdbe3bb90705ba5919206f84d7d6bf9a3d Mon Sep 17 00:00:00 2001 From: omagdy7 Date: Mon, 20 Mar 2023 18:19:31 +0200 Subject: Organized the project in separate files --- src/Direction.py | 7 +++ src/Game.py | 95 +++++++++++++++++++++++++++++++++++++ src/Player.py | 48 +++++++++++++++++++ src/macpan.py | 141 ++----------------------------------------------------- src/settings.py | 7 +++ 5 files changed, 161 insertions(+), 137 deletions(-) create mode 100644 src/Direction.py create mode 100644 src/Game.py create mode 100644 src/Player.py create mode 100644 src/settings.py diff --git a/src/Direction.py b/src/Direction.py new file mode 100644 index 0000000..076a754 --- /dev/null +++ b/src/Direction.py @@ -0,0 +1,7 @@ +from enum import Enum + +class DIRECTION(Enum): + UP = 1 + DOWN = 2 + RIGHT = 3 + LEFT = 4 diff --git a/src/Game.py b/src/Game.py new file mode 100644 index 0000000..aedfa0c --- /dev/null +++ b/src/Game.py @@ -0,0 +1,95 @@ +import Player +from Direction import DIRECTION +import settings as Settings +import pygame + +class Game(): + def __init__(self): + self.settings = Settings.settings + + def init(self): + # Initialize Pygame + pygame.init() + + # Set the dimensions of the window + screen = pygame.display.set_mode((Settings.settings.width, Settings.settings.height)) + + # Sprite sheet for pacman + sprite_sheet = pygame.image.load('../assets/pacman_left_sprite.png').convert_alpha(); + + player = Player.Player(sprite_sheet) + + # Set the circle's velocity + dx = 0 + dy = 0 + + # counter used to cycle through pacman sprite animation + counter = 0 + + clock = pygame.time.Clock() + + # Sprite sheet for pacman + sprite_sheet = pygame.image.load('../assets/pacman_left_sprite.png').convert_alpha(); + + sprite_width, sprite_height = 32, 32 + + + + # Checks collision with walls + def check_collision(dx, dy): + return player.y + sprite_height + dy > Settings.settings.height or player.y + dy < 0 or player.x + sprite_width + dx > Settings.settings.width or player.x + dx < 0 + + # Main game loop + running = True + + + while running: + # setting game fps + clock.tick(Settings.settings.fps) + + # counter logic for cycling between pacman different sprites + if counter < 19: + counter += 1 + else: + counter = 0 + + # Handling events + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + elif event.type == pygame.KEYDOWN: + # Move the circle based on the pressed key + if event.key == pygame.K_w: + player.direction = DIRECTION.UP + dy = -player.speed + dx = 0 # Necssarry to move only horizontal or vertical + elif event.key == pygame.K_s: + player.direction = DIRECTION.DOWN + dy = player.speed + dx = 0 # Necssarry to move only horizontal or vertical + elif event.key == pygame.K_a: + player.direction = DIRECTION.LEFT + dx = -player.speed + dy = 0 # Necssarry to move only horizontal or vertical + elif event.key == pygame.K_d: + player.direction = DIRECTION.RIGHT + dx = player.speed + dy = 0 # Necssarry to move only horizontal or vertical + + + # print(player.direction) + # Update the circle's position and checking for collisions + if not check_collision(dx, dy): + player.x += dx + player.y += dy + + screen.fill((0, 0, 0)) # Clear the screen + + player.draw(screen, counter) + + # Update the screen + pygame.display.flip() + + + # Quit Pygame + pygame.quit() diff --git a/src/Player.py b/src/Player.py new file mode 100644 index 0000000..f8ebc06 --- /dev/null +++ b/src/Player.py @@ -0,0 +1,48 @@ +from typing import List +from Direction import DIRECTION +import pygame +import settings as Settings + + +def get_sprites(sprite_sheet) -> List: + sheet_width, sheet_height = sprite_sheet.get_size() + sprite_width, sprite_height = 32, 32 + rows = sheet_height // sprite_height + columns = sheet_width // sprite_width + sprites = [] + + for row in range(rows): + for col in range(columns): + x = col * sprite_width + y = row * sprite_height + + # Create a new surface for the current sprite and blit it from the sprite sheet onto this new surface + new_sprite_surface = pygame.Surface((sprite_width, sprite_height), pygame.SRCALPHA) + new_sprite_surface.blit(sprite_sheet, (0, 0), (x, y, x + sprite_width, y +sprite_height)) + + # Add this new surface to our list of sprites + sprites.append(new_sprite_surface) + + return sprites + + +class Player(): + def __init__(self, sprite_sheet): + self.x = Settings.settings.width // 2; + self.y = Settings.settings.height // 2; + self.sprite = get_sprites(sprite_sheet) + self.speed = 5 + self.direction = DIRECTION.LEFT + + def draw(self, screen, counter): + pos = (self.x, self.y) + print(self.direction, DIRECTION.UP) + if self.direction == DIRECTION.UP: + screen.blit(pygame.transform.rotate(self.sprite[counter // 5], 270), pos) + elif self.direction == DIRECTION.DOWN: + screen.blit(pygame.transform.rotate(self.sprite[counter // 5], 90), pos) + elif self.direction == DIRECTION.RIGHT: + screen.blit(pygame.transform.flip(self.sprite[counter // 5], True, False), pos) + elif self.direction == DIRECTION.LEFT: + screen.blit(self.sprite[counter // 5], pos) + diff --git a/src/macpan.py b/src/macpan.py index e20cfde..93b81b3 100644 --- a/src/macpan.py +++ b/src/macpan.py @@ -1,139 +1,6 @@ -from enum import Enum -import pygame +import Game +if __name__ == "__main__": + game = Game.Game() + game.init() - - -# Initialize Pygame -pygame.init() - -# Set the dimensions of the window -width, height = 640, 480 -screen = pygame.display.set_mode((width, height)) - -# Sprite sheet for pacman -sprite_sheet = pygame.image.load('../assets/pacman_left_sprite.png').convert_alpha(); - -sheet_width, sheet_height = sprite_sheet.get_size() - -sprite_width, sprite_height = 32, 32 - -rows = sheet_height // sprite_height -columns = sheet_width // sprite_width - -# Set the center position of the circle -center = [320, 240] # Center of the window -radius = 0 - -# Set the circle's velocity -dx = 0 -dy = 0 - -# Set the speed of the pacman movement -speed = 5 - - -fps = 60 - -clock = pygame.time.Clock() - -sprites = [] - -class DIRECTION(Enum): - UP = 1 - DOWN = 2 - RIGHT = 3 - LEFT = 4 - - - -def get_sprites(): - for row in range(rows): - for col in range(columns): - x = col * sprite_width - y = row * sprite_height - - # Create a new surface for the current sprite and blit it from the sprite sheet onto this new surface - new_sprite_surface = pygame.Surface((sprite_width, sprite_height), pygame.SRCALPHA) - new_sprite_surface.blit(sprite_sheet, (0, 0), (x, y, x + sprite_width, y +sprite_height)) - - # Add this new surface to our list of sprites - sprites.append(new_sprite_surface) - -# Checks collision with walls -def check_collision(pos_x, pos_y, dx, dy): - # edges of the circle - # upper_circle_point = circle_center_y - # lower_circle_point = circle_center_y - # right_circle_point = circle_center_x - # left_circle_point = circle_center_x - print(pos_x, pos_y) - return pos_y + sprite_height + dy > height or pos_y + dy < 0 or pos_x + sprite_width + dx > width or pos_x + dx < 0 - -get_sprites() - -counter = 0 - -def draw_player(pos, direction): - if direction == DIRECTION.UP: - screen.blit(pygame.transform.rotate(sprites[counter // 5], 270), pos) - elif direction == DIRECTION.DOWN: - screen.blit(pygame.transform.rotate(sprites[counter // 5], 90), pos) - elif direction == DIRECTION.RIGHT: - screen.blit(sprites[counter // 5], pos) - elif direction == DIRECTION.LEFT: - screen.blit(pygame.transform.flip(sprites[counter // 5], True, False), pos) - - -sprite_direction = DIRECTION.LEFT - - -# Main game loop -running = True -while running: - # Handle events - clock.tick(fps) - - if counter < 19: - counter += 1 - else: - counter = 0 - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - running = False - elif event.type == pygame.KEYDOWN: - # Move the circle based on the pressed key - if event.key == pygame.K_w: - sprite_direction = DIRECTION.UP - dy = -speed - dx = 0 # Necssarry to move only horizontal or vertical - elif event.key == pygame.K_s: - sprite_direction = DIRECTION.DOWN - dy = speed - dx = 0 # Necssarry to move only horizontal or vertical - elif event.key == pygame.K_a: - sprite_direction = DIRECTION.RIGHT - dx = -speed - dy = 0 # Necssarry to move only horizontal or vertical - elif event.key == pygame.K_d: - sprite_direction = DIRECTION.LEFT - dx = speed - dy = 0 # Necssarry to move only horizontal or vertical - - # Update the circle's position - if not check_collision(center[0], center[1], dx, dy): - center[0] += dx - center[1] += dy - - screen.fill((0, 0, 0)) # Clear the screen - - - draw_player(center, sprite_direction) - - # Update the screen - pygame.display.flip() - - -# Quit Pygame -pygame.quit() diff --git a/src/settings.py b/src/settings.py new file mode 100644 index 0000000..ba62736 --- /dev/null +++ b/src/settings.py @@ -0,0 +1,7 @@ +class Settings(): + def __init__(self): + self.width = 640 + self.height = 480 + self.fps = 60 + +settings = Settings() -- cgit v1.2.3