summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorViljami Ilola <+@hix.fi>2024-03-30 12:07:49 +0200
committerViljami Ilola <+@hix.fi>2024-03-30 12:07:49 +0200
commit607c00bc57fb68572754404cb5da0e7f7a5618e5 (patch)
tree195f10e6506a1c30500662230c807dc2756431af /src
parent51c495d9691d19b65b377d377599ce1d52def874 (diff)
refactor enemies to add bounchers
Diffstat (limited to 'src')
-rw-r--r--src/sliceitoff/enemies/enemies.py75
-rw-r--r--src/sliceitoff/text/__init__.py2
-rw-r--r--src/sliceitoff/text/text.py33
3 files changed, 50 insertions, 60 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)
diff --git a/src/sliceitoff/text/__init__.py b/src/sliceitoff/text/__init__.py
index 082179e..59385be 100644
--- a/src/sliceitoff/text/__init__.py
+++ b/src/sliceitoff/text/__init__.py
@@ -1,3 +1,3 @@
""" text - fonts, letters, texts and related """
-from .text import TextPage, LetterSprite
+from .text import TextPage, LetterSprite, get_letter_surface
from .fonts import Font, Fonts
diff --git a/src/sliceitoff/text/text.py b/src/sliceitoff/text/text.py
index 83367e0..69a30bc 100644
--- a/src/sliceitoff/text/text.py
+++ b/src/sliceitoff/text/text.py
@@ -8,28 +8,35 @@ from .fonts import Fonts
scaled_fonts = {}
-class LetterSprite(pygame.sprite.Sprite):
- """ Single letter at given properties hopefully from cache
+def get_letter_surface(font_key, ch):
+ """ Get letter surface at given properties hopefully from cache
args:
font_key: (font name, width to scale, color)
ch: 0-255 character on cp473
color: 0-15 as in CGA palette
"""
+ font, w, color = font_key
+ if font not in Fonts.fonts:
+ return None
+ if font_key not in scaled_fonts:
+ scaled_fonts[font_key]=[None for _ in range(256)]
+ if scaled_fonts[font_key][ch] is None:
+ scaled_fonts[font_key][ch] = pygame.transform.scale_by(
+ Fonts.fonts[font].get(ch),
+ w/8 * Scaling.factor)
+ scaled_fonts[font_key][ch].fill(
+ CGA_COLORS[color],
+ special_flags = pygame.BLEND_RGBA_MULT)
+ return scaled_fonts[font_key][ch]
+
+
+class LetterSprite(pygame.sprite.Sprite):
+ """ Make sprite out of letter surface at given position """
def __init__(self, font_key, ch, pos):
super().__init__()
self.dead = True
- if font_key not in scaled_fonts:
- scaled_fonts[font_key]=[None for _ in range(256)]
- if scaled_fonts[font_key][ch] is None:
- font, w, color = font_key
- scaled_fonts[font_key][ch] = pygame.transform.scale_by(
- Fonts.fonts[font].get(ch),
- w/8 * Scaling.factor)
- scaled_fonts[font_key][ch].fill(
- CGA_COLORS[color],
- special_flags = pygame.BLEND_RGBA_MULT)
- self.image = scaled_fonts[font_key][ch]
+ self.image = get_letter_surface(font_key, ch)
self.rect = self.image.get_rect().move(pos)
self.direction = (
Scaling.factor * (1_000 - randrange(2_000)),