diff --git a/9. minimalais_piemers/enemy.py b/9. minimalais_piemers/enemy.py new file mode 100644 index 0000000..28ee5d4 --- /dev/null +++ b/9. minimalais_piemers/enemy.py @@ -0,0 +1,26 @@ +from settings import SCREEN_HEIGHT, SCREEN_WIDTH +from pygame.locals import (RLEACCEL,K_UP,K_DOWN,K_LEFT,K_RIGHT,K_ESCAPE,KEYDOWN,QUIT) +import random +import pygame + +# Define the enemy object by extending pygame.sprite.Sprite +# The surface you draw on the screen is now an attribute of 'enemy' +class Enemy(pygame.sprite.Sprite): + def __init__(self): + super().__init__() + self.surf = pygame.image.load("sprites/bat.png").convert() + self.surf.set_colorkey((0, 0, 0), RLEACCEL) + self.rect = self.surf.get_rect( + center=( + random.randint(SCREEN_WIDTH + 20, SCREEN_WIDTH + 100), + random.randint(0, SCREEN_HEIGHT), + ) + ) + self.speed = random.randint(5, 10) + + # Move the sprite based on speed + # Remove the sprite when it passes the left edge of the screen + def update(self): + self.rect.move_ip(-self.speed, 0) + if self.rect.right < 0: + self.kill() \ No newline at end of file diff --git a/9. minimalais_piemers/main.py b/9. minimalais_piemers/main.py new file mode 100644 index 0000000..36e7476 --- /dev/null +++ b/9. minimalais_piemers/main.py @@ -0,0 +1,117 @@ +# Code is taken from https://realpython.com/pygame-a-primer/ + +# Import and initialize the pygame library +import pygame +from player import Player +from enemy import Enemy +from settings import SCREEN_HEIGHT, SCREEN_WIDTH + +from pygame.locals import ( + K_UP, + K_DOWN, + K_LEFT, + K_RIGHT, + K_ESCAPE, + KEYDOWN, + QUIT, +) + +# Setup for sounds. Defaults are good. +pygame.mixer.init() +pygame.init() + +pygame.font.init() +my_font = pygame.font.SysFont('Comic Sans MS', 30) + +# Load and play background music +pygame.mixer.music.load("sounds/cave_theme_1.wav") +pygame.mixer.music.play(loops=-1) + +# Load all sound files +collision_sound = pygame.mixer.Sound("sounds/boom.wav") + + +# Create the screen object +# The size is determined by the constant SCREEN_WIDTH and SCREEN_HEIGHT +screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) + +# Create a custom event for adding a new enemy +ADDENEMY = pygame.USEREVENT + 1 +pygame.time.set_timer(ADDENEMY, 250) + + +# Variable to keep the main loop running +running = True + +player = Player() + +# Create groups to hold enemy sprites and all sprites +# - enemies is used for collision detection and position updates +# - all_sprites is used for rendering +enemies = pygame.sprite.Group() +all_sprites = pygame.sprite.Group() +all_sprites.add(player) + +bg = pygame.image.load("sprites/background.png").convert() + +# Setup the clock for a decent framerate +clock = pygame.time.Clock() + +# Main loop +while running: + screen.blit(bg, (0,0)) + # Look at every event in the queue + for event in pygame.event.get(): + # Did the user hit a key? + if event.type == KEYDOWN: + # Was it the Escape key? If so, stop the loop. + if event.key == K_ESCAPE: + running = False + + # Did the user click the window close button? If so, stop the loop. + elif event.type == QUIT: + running = False + + # Add a new enemy? + elif event.type == ADDENEMY: + # Create the new enemy and add it to sprite groups + new_enemy = Enemy() + enemies.add(new_enemy) + all_sprites.add(new_enemy) + + + # Get all the keys currently pressed + pressed_keys = pygame.key.get_pressed() + + # Update the player sprite based on user keypresses + player.update(pressed_keys) + + # Update enemy position + enemies.update() + + # Draw all sprites + for entity in all_sprites: + screen.blit(entity.surf, entity.rect) + + + + # Check if any enemies have collided with the player + if pygame.sprite.spritecollideany(player, enemies): + # If so, then remove the player and stop the loop + player.kill() + collision_sound.play() + pygame.time.delay(1000) + running = False + + text = my_font.render("Are ya winning, son?", True, (255,255,255)) + screen.blit(text, (SCREEN_WIDTH - text.get_width(), 0)) + + # Flip the display + pygame.display.flip() + + # Ensure program maintains a rate of 30 frames per second + clock.tick(30) + +# All done! Stop and quit the mixer. +pygame.mixer.music.stop() +pygame.mixer.quit() \ No newline at end of file diff --git a/9. minimalais_piemers/player.py b/9. minimalais_piemers/player.py new file mode 100644 index 0000000..e28dd09 --- /dev/null +++ b/9. minimalais_piemers/player.py @@ -0,0 +1,36 @@ +import pygame +from settings import SCREEN_HEIGHT, SCREEN_WIDTH +from pygame.locals import (RLEACCEL,K_UP,K_DOWN,K_LEFT,K_RIGHT,K_ESCAPE,KEYDOWN,QUIT) + + +# Define a Player object by extending pygame.sprite.Sprite +# The surface drawn on the screen is now an attribute of 'player' +class Player(pygame.sprite.Sprite): + def __init__(self): + super(Player, self).__init__() + self.surf = pygame.transform.scale( + pygame.image.load("sprites/jetfighter.png").convert(), + (50, 36) + ) + self.surf.set_colorkey((0, 0, 0), RLEACCEL) + self.rect = self.surf.get_rect() + + def update(self, pressed_keys): + if pressed_keys[K_UP]: + self.rect.move_ip(0, -5) + if pressed_keys[K_DOWN]: + self.rect.move_ip(0, 5) + if pressed_keys[K_LEFT]: + self.rect.move_ip(-5, 0) + if pressed_keys[K_RIGHT]: + self.rect.move_ip(5, 0) + + # Keep player on the screen + if self.rect.left < 0: + self.rect.left = 0 + if self.rect.right > SCREEN_WIDTH: + self.rect.right = SCREEN_WIDTH + if self.rect.top <= 0: + self.rect.top = 0 + if self.rect.bottom >= SCREEN_HEIGHT: + self.rect.bottom = SCREEN_HEIGHT diff --git a/9. minimalais_piemers/settings.py b/9. minimalais_piemers/settings.py new file mode 100644 index 0000000..71e30e2 --- /dev/null +++ b/9. minimalais_piemers/settings.py @@ -0,0 +1,3 @@ +# Define constants for the screen width and height +SCREEN_WIDTH = 800 +SCREEN_HEIGHT = 600 \ No newline at end of file