Migration to Codeberg
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
|
||||
# Asteroids
|
||||
|
||||
## Overview
|
||||
Asteroids game is built using the [Pygame](https://www.pygame.org/) library, which provides tools for creating 2D games in Python.
|
||||
|
||||
## Prerequisites
|
||||
To run the game, ensure you have the following installed on your system:
|
||||
|
||||
- **Python 3.13 or later**: Install the latest version of Python from the [official Python website](https://www.python.org/).
|
||||
- **Pygame**: The game relies on Pygame for graphics and input handling.
|
||||
|
||||
## Setting Up the Environment
|
||||
To set up the game environment, follow these steps:
|
||||
|
||||
1. **Create a virtual environment:**
|
||||
```bash
|
||||
python3 -m venv venv
|
||||
```
|
||||
This command creates a virtual environment in the `venv` directory.
|
||||
|
||||
2. **Activate the virtual environment:**
|
||||
On macOS or Linux:
|
||||
```bash
|
||||
source venv/bin/activate
|
||||
```
|
||||
On Windows:
|
||||
```cmd
|
||||
venv\Scripts\activate
|
||||
```
|
||||
|
||||
3. **Install Pygame:**
|
||||
With the virtual environment activated, install Pygame:
|
||||
```bash
|
||||
pip3 install pygame
|
||||
```
|
||||
|
||||
## Running the Game
|
||||
To start the game, ensure the virtual environment is activated, then run the following command:
|
||||
|
||||
```bash
|
||||
python3 asteroids.py
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
- Ensure the virtual environment is activated before running the game or installing dependencies.
|
||||
- If you encounter issues with Pygame installation, ensure your Python version is compatible with the latest Pygame release.
|
||||
- Check that all game files, including `asteroids.py`, are in the correct directory.
|
||||
|
||||
## License
|
||||
This project is distributed under the MIT License. See the `LICENSE` file for details.
|
||||
|
||||
## Contributions
|
||||
Contributions are welcome! Feel free to fork the repository and submit pull requests.
|
||||
|
||||
## Credits
|
||||
- **Developer:** Joaquin Gottlebe
|
||||
- **Built With:** Pygame and Python
|
||||
@@ -0,0 +1,187 @@
|
||||
import pygame
|
||||
import sys
|
||||
from random import randint, uniform
|
||||
|
||||
|
||||
class Ship(pygame.sprite.Sprite):
|
||||
def __init__(self, groups):
|
||||
super().__init__(groups)
|
||||
self.image = pygame.image.load('ship.png').convert_alpha()
|
||||
self.rect = self.image.get_rect(center=(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2))
|
||||
self.mask = pygame.mask.from_surface(self.image)
|
||||
|
||||
self.can_shoot = True
|
||||
self.shoot_time = None
|
||||
|
||||
self.laser_sound = pygame.mixer.Sound('laser.ogg')
|
||||
|
||||
def laser_timer(self):
|
||||
if not self.can_shoot:
|
||||
current_time = pygame.time.get_ticks()
|
||||
if current_time - self.shoot_time > 500:
|
||||
self.can_shoot = True
|
||||
|
||||
def input_position(self):
|
||||
pos = pygame.mouse.get_pos()
|
||||
self.rect.center = pos
|
||||
|
||||
|
||||
def laser_shoot(self):
|
||||
if pygame.mouse.get_pressed()[0] and self.can_shoot:
|
||||
self.can_shoot = False
|
||||
self.shoot_time = pygame.time.get_ticks()
|
||||
Laser(self.rect.midtop, laser_group)
|
||||
self.laser_sound.play().set_volume(0.1)
|
||||
|
||||
def meteor_collision(self):
|
||||
if pygame.sprite.spritecollide(self, meteor_group, False, pygame.sprite.collide_mask):
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
|
||||
def update(self):
|
||||
self.laser_timer()
|
||||
self.laser_shoot()
|
||||
self.input_position()
|
||||
self.meteor_collision()
|
||||
|
||||
|
||||
class Laser(pygame.sprite.Sprite):
|
||||
def __init__(self, pos, groups):
|
||||
super().__init__(groups)
|
||||
self.image = pygame.image.load('laser.png').convert_alpha()
|
||||
self.rect = self.image.get_rect(midbottom=pos)
|
||||
self.mask = pygame.mask.from_surface(self.image)
|
||||
|
||||
self.pos = pygame.math.Vector2(self.rect.topleft)
|
||||
self.direction = pygame.math.Vector2(0, -1)
|
||||
self.speed = 600
|
||||
|
||||
self.explosio_sound = pygame.mixer.Sound('explosion.wav')
|
||||
|
||||
def meteor_collision(self):
|
||||
if pygame.sprite.spritecollide(self, meteor_group, True, pygame.sprite.collide_mask):
|
||||
self.kill()
|
||||
self.explosio_sound.play().set_volume(0.1)
|
||||
|
||||
def update(self):
|
||||
self.pos += self.direction * self.speed * dt
|
||||
self.rect.topleft = (round(self.pos.x), round(self.pos.y))
|
||||
self.meteor_collision()
|
||||
|
||||
if self.rect.bottom < 0:
|
||||
self.kill()
|
||||
|
||||
|
||||
class Meteor(pygame.sprite.Sprite):
|
||||
|
||||
def __init__(self, pos, groups):
|
||||
# basic setup
|
||||
super().__init__(groups)
|
||||
|
||||
# surface
|
||||
meteor_surf = pygame.image.load('meteor.png').convert_alpha()
|
||||
meteor_size = pygame.math.Vector2(meteor_surf.get_size()) * uniform(0.5,2)
|
||||
self.scaled_surf = pygame.transform.scale(meteor_surf, meteor_size)
|
||||
self.image = self.scaled_surf
|
||||
|
||||
# rectangle
|
||||
self.rect = self.image.get_rect(center=pos)
|
||||
self.mask = pygame.mask.from_surface(self.image)
|
||||
|
||||
|
||||
# positioning
|
||||
self.pos = pygame.math.Vector2(self.rect.topleft)
|
||||
self.direction = pygame.math.Vector2(uniform(-0.5, 0.5), 1)
|
||||
self.speed = randint(400, 600)
|
||||
|
||||
# rotation
|
||||
self.rotation = 0
|
||||
self.rotation_speed = randint(-20,20)
|
||||
|
||||
def rotate(self):
|
||||
self.rotation += self.rotation_speed * dt
|
||||
rotated_surf = pygame.transform.rotozoom(self.scaled_surf, self.rotation,1 )
|
||||
self.image = rotated_surf
|
||||
self.rect = self.image.get_rect(center=self.rect.center)
|
||||
self.mask = pygame.mask.from_surface(self.image)
|
||||
|
||||
|
||||
def update(self):
|
||||
self.pos += self.direction * self.speed * dt
|
||||
self.rect.topleft = (round(self.pos.x), round(self.pos.y))
|
||||
self.rotate()
|
||||
|
||||
if self.rect.top > WINDOW_HEIGHT:
|
||||
self.kill()
|
||||
|
||||
|
||||
class Score:
|
||||
def __init__(self):
|
||||
self.font = pygame.font.Font('subatomic.ttf',50)
|
||||
|
||||
def display(self):
|
||||
score_text = f'Score: {pygame.time.get_ticks() // 1000}'
|
||||
text_surf = self.font.render(score_text, True, (255,255,255))
|
||||
text_rect = text_surf.get_rect(midbottom=(WINDOW_WIDTH / 2, WINDOW_HEIGHT - 80))
|
||||
display_surface.blit(text_surf,text_rect)
|
||||
pygame.draw.rect(display_surface,
|
||||
(255,255,255),
|
||||
text_rect.inflate(30,30),
|
||||
width=8,
|
||||
border_radius=5)
|
||||
|
||||
|
||||
# basic setup
|
||||
pygame.init()
|
||||
WINDOW_WIDTH, WINDOW_HEIGHT = 1280,720
|
||||
display_surface = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
|
||||
pygame.display.set_caption('Space shooter')
|
||||
clock = pygame.time.Clock()
|
||||
|
||||
# background
|
||||
background_surf = pygame.image.load('background.png').convert()
|
||||
|
||||
# sprite groups
|
||||
spaceship_group = pygame.sprite.GroupSingle()
|
||||
laser_group = pygame.sprite.Group()
|
||||
meteor_group = pygame.sprite.Group()
|
||||
score = Score()
|
||||
|
||||
music = pygame.mixer.Sound('music.wav').play(loops = -1).set_volume(0.01)
|
||||
|
||||
# sprite creation
|
||||
ship = Ship(spaceship_group)
|
||||
|
||||
# timer
|
||||
meteor_timer = pygame.event.custom_type()
|
||||
pygame.time.set_timer(meteor_timer, 200)
|
||||
|
||||
|
||||
# game loop
|
||||
while True:
|
||||
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
|
||||
if event.type == meteor_timer:
|
||||
meteor_y_pos = randint(-150, -50)
|
||||
meteor_x_pos = randint(-100, WINDOW_WIDTH + 100)
|
||||
Meteor((meteor_x_pos, meteor_y_pos), groups=meteor_group)
|
||||
|
||||
dt = clock.tick() / 1000
|
||||
|
||||
display_surface.blit(background_surf, (0, 0))
|
||||
|
||||
spaceship_group.update()
|
||||
laser_group.update()
|
||||
meteor_group.update()
|
||||
|
||||
score.display()
|
||||
|
||||
spaceship_group.draw(display_surface)
|
||||
laser_group.draw(display_surface)
|
||||
meteor_group.draw(display_surface)
|
||||
|
||||
pygame.display.update()
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 803 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
Binary file not shown.
Reference in New Issue
Block a user