Adding asteroids/fields and collision

This commit is contained in:
franky212
2024-10-28 17:31:31 -06:00
parent 0412b21bb0
commit ae27a3c7a0
4 changed files with 85 additions and 4 deletions

View File

@@ -0,0 +1,11 @@
import pygame
from circleshape import CircleShape
class Asteroid(CircleShape):
def __init__(self, x, y, radius):
super().__init__(x, y, radius)
def draw(self, screen):
pygame.draw.circle(screen, "white", self.position, self.radius, 2)
def update(self, dt):
self.position += (self.velocity * dt)

51
asteroidfield.py Normal file
View File

@@ -0,0 +1,51 @@
import pygame
import random
from asteroid import Asteroid
from constants import *
class AsteroidField(pygame.sprite.Sprite):
edges = [
[
pygame.Vector2(1, 0),
lambda y: pygame.Vector2(-ASTEROID_MAX_RADIUS, y * SCREEN_HEIGHT),
],
[
pygame.Vector2(-1, 0),
lambda y: pygame.Vector2(
SCREEN_WIDTH + ASTEROID_MAX_RADIUS, y * SCREEN_HEIGHT
),
],
[
pygame.Vector2(0, 1),
lambda x: pygame.Vector2(x * SCREEN_WIDTH, -ASTEROID_MAX_RADIUS),
],
[
pygame.Vector2(0, -1),
lambda x: pygame.Vector2(
x * SCREEN_WIDTH, SCREEN_HEIGHT + ASTEROID_MAX_RADIUS
),
],
]
def __init__(self):
pygame.sprite.Sprite.__init__(self, self.containers)
self.spawn_timer = 0.0
def spawn(self, radius, position, velocity):
asteroid = Asteroid(position.x, position.y, radius)
asteroid.velocity = velocity
def update(self, dt):
self.spawn_timer += dt
if self.spawn_timer > ASTEROID_SPAWN_RATE:
self.spawn_timer = 0
# spawn a new asteroid at a random edge
edge = random.choice(self.edges)
speed = random.randint(40, 100)
velocity = edge[0] * speed
velocity = velocity.rotate(random.randint(-30, 30))
position = edge[1](random.uniform(0, 1))
kind = random.randint(1, ASTEROID_KINDS)
self.spawn(ASTEROID_MIN_RADIUS * kind, position, velocity)

View File

@@ -13,6 +13,11 @@ class CircleShape(pygame.sprite.Sprite):
self.velocity = pygame.Vector2(0, 0) self.velocity = pygame.Vector2(0, 0)
self.radius = radius self.radius = radius
def collision(self, other):
if self.position.distance_to(other.position) <= (self.radius + other.radius):
return True
return False
def draw(self, screen): def draw(self, screen):
# sub-classes must override # sub-classes must override
pass pass

22
main.py
View File

@@ -4,17 +4,26 @@
import pygame import pygame
from constants import SCREEN_HEIGHT, SCREEN_WIDTH from constants import SCREEN_HEIGHT, SCREEN_WIDTH
from player import Player from player import Player
from asteroid import Asteroid
from asteroidfield import AsteroidField
def main(): def main():
pygame.init() pygame.init()
clock = pygame.time.Clock() clock = pygame.time.Clock()
dt = 0 dt = 0
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
asteroids = pygame.sprite.Group()
updatable = pygame.sprite.Group()
drawable = pygame.sprite.Group()
Asteroid.containers = (asteroids, updatable, drawable)
AsteroidField.containers = updatable
asteroid_field = AsteroidField()
Player.containers = (updatable, drawable)
player = Player(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2) player = Player(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)
updatable = []
drawable = []
updatable.append(player)
drawable.append(player)
while True: while True:
for event in pygame.event.get(): for event in pygame.event.get():
@@ -30,6 +39,11 @@ def main():
for object in updatable: for object in updatable:
object.update(dt) object.update(dt)
for asteroid in asteroids:
if asteroid.collision(player):
print("Game over!")
return
pygame.display.flip() pygame.display.flip()
if __name__ == "__main__": if __name__ == "__main__":