import pygame from random import randrange from display import Scaling from images import Fonts from stats import Stats class EnemySprite(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.update() def set_movement(self, movement: tuple): self.movement = movement def update(self, dt = 0): if dt: self.position = ( self.position[0] + self.movement[0] * dt, self.position[1] + self.movement[1] * dt) self.rect = pygame.Rect( 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): super().__init__() for _ in range(Stats.enemies): 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.field = field def wall_hit(self, field, enemy): if enemy.rect.x < field.rect.x: enemy.force_right() if enemy.rect.y < field.rect.y: enemy.force_down() if ( enemy.rect.x + enemy.rect.w >= field.rect.x + field.rect.w ): enemy.force_left() if ( enemy.rect.y + enemy.rect.h >= field.rect.y + field.rect.h ): enemy.force_up() def hit_walls(self, field_sprites): """ Do actions on enemies that are only partly on the fields """ for enemy in self.sprites(): for field in field_sprites: # if enemy is completely inside any field do next enemy if field.rect.contains(enemy): break else: # now find field that enemy is partly on for field in field_sprites: if field.rect.colliderect(enemy): self.wall_hit(field, enemy)