diff options
author | Viljami Ilola <+@hix.fi> | 2024-03-30 12:07:49 +0200 |
---|---|---|
committer | Viljami Ilola <+@hix.fi> | 2024-03-30 12:07:49 +0200 |
commit | 607c00bc57fb68572754404cb5da0e7f7a5618e5 (patch) | |
tree | 195f10e6506a1c30500662230c807dc2756431af /src/sliceitoff/enemies | |
parent | 51c495d9691d19b65b377d377599ce1d52def874 (diff) |
refactor enemies to add bounchers
Diffstat (limited to 'src/sliceitoff/enemies')
-rw-r--r-- | src/sliceitoff/enemies/enemies.py | 75 |
1 files changed, 29 insertions, 46 deletions
diff --git a/src/sliceitoff/enemies/enemies.py b/src/sliceitoff/enemies/enemies.py index 66ebcbd..41a19fa 100644 --- a/src/sliceitoff/enemies/enemies.py +++ b/src/sliceitoff/enemies/enemies.py @@ -2,22 +2,38 @@ import pygame from random import randrange from display import Scaling -from text import Fonts +from text import get_letter_surface -class EnemySprite(pygame.sprite.Sprite): +BALL_SPAWN_AREA = (0, 0, 300_000, 200_000) +BALL_MOVEMENT = (100, 100) + +class EnemyBall(pygame.sprite.Sprite): def __init__(self): super().__init__() - self.position = (0, 0) - self.movement = (0, 0) - - def set_position(self, position: tuple): - self.position = position + self.position = ( + randrange(BALL_SPAWN_AREA[0], BALL_SPAWN_AREA[2]), + randrange(BALL_SPAWN_AREA[1], BALL_SPAWN_AREA[3])) + self.movement = ( + randrange(0, BALL_MOVEMENT[0]*2) - BALL_MOVEMENT[0], + randrange(0, BALL_MOVEMENT[1]*2) - BALL_MOVEMENT[1]) + self.image = get_letter_surface( + ('8x8', 8_000, 0), + randrange(1,3)).subsurface( + (0,0,8_000*Scaling.factor,8_000*Scaling.factor)) self.update() + self.rect = None - def set_movement(self, movement: tuple): - self.movement = movement - - def update(self, dt = 0, **kwargs): + def update(self, dt = 0, wall_hit = None, **kwargs): + if wall_hit: + if self.rect.x < wall_hit.x: + self.movement = (abs(self.movement[0]), self.movement[1]) + if self.rect.y < wall_hit.y: + self.movement = (self.movement[0], abs(self.movement[1])) + if self.rect.x + self.rect.w >= wall_hit.x + wall_hit.w: + self.movement = (-abs(self.movement[0]), self.movement[1]) + if self.rect.y + self.rect.h >= wall_hit.y + wall_hit.h: + self.movement = (self.movement[0], -abs(self.movement[1])) + return if dt: self.position = ( self.position[0] + self.movement[0] * dt, @@ -26,34 +42,11 @@ class EnemySprite(pygame.sprite.Sprite): Scaling.scale_to_display(self.position), self.image.get_size()) - def force_right(self): - self.movement = (abs(self.movement[0]), self.movement[1]) - - def force_left(self): - self.movement = (-abs(self.movement[0]), self.movement[1]) - - def force_down(self): - self.movement = (self.movement[0], abs(self.movement[1])) - - def force_up(self): - self.movement = (self.movement[0], -abs(self.movement[1])) - -class EnemyBall(EnemySprite): - def __init__(self): - super().__init__() - letter = Fonts.fonts['8x8'].get(randrange(1,3)).subsurface((0,0,8,8)) - colored = letter.fill( "black", special_flags = pygame.BLEND_RGBA_MULT) - self.image = pygame.transform.scale_by(letter, 1_000 * Scaling.factor) - self.update() - class Enemies(pygame.sprite.Group): def __init__(self, field = None, count = 0): super().__init__() for _ in range(count): - enemy = EnemyBall() - enemy.set_position( (randrange(0,300_000), randrange(0,200_000)) ) - enemy.set_movement( (randrange(0,200)-100, randrange(0,200)-100) ) - self.add(enemy) + self.add(EnemyBall()) self.field = field def update(self, field_rects = [], **kwargs): @@ -68,14 +61,4 @@ class Enemies(pygame.sprite.Group): # now find field that enemy is partly on for field_rect in field_rects: if field_rect.colliderect(enemy): - self.wall_hit(field_rect, enemy) - - def wall_hit(self, field, enemy): - if enemy.rect.x < field.x: - enemy.force_right() - if enemy.rect.y < field.y: - enemy.force_down() - if enemy.rect.x + enemy.rect.w >= field.x + field.w: - enemy.force_left() - if enemy.rect.y + enemy.rect.h >= field.y + field.h: - enemy.force_up() + enemy.update(wall_hit = field_rect) |