summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorViljami Ilola <+@hix.fi>2024-03-24 01:22:39 +0200
committerViljami Ilola <+@hix.fi>2024-03-24 01:22:39 +0200
commitcd128f5bc4fae39fb7e77683758d437f64eb4203 (patch)
treef4f3efbca3e11e7f6fb73a227ad09ef11918ec48 /src
parent4353670f0cee67550b20dfcfd51b81386372f358 (diff)
gameover, level x and level up screens
Diffstat (limited to 'src')
-rw-r--r--src/sliceitoff/__main__.py1
-rw-r--r--src/sliceitoff/assets/fonts.lst4
-rw-r--r--src/sliceitoff/field/field.py11
-rw-r--r--src/sliceitoff/game/anykey.py7
-rw-r--r--src/sliceitoff/game/gameplay.py14
-rw-r--r--src/sliceitoff/game/level.py46
-rw-r--r--src/sliceitoff/game/show.py17
-rw-r--r--src/sliceitoff/player/player.py20
-rw-r--r--src/sliceitoff/screens/__init__.py5
-rw-r--r--src/sliceitoff/screens/gameover.py8
-rw-r--r--src/sliceitoff/screens/level.py9
-rw-r--r--src/sliceitoff/screens/levelup.py42
-rw-r--r--src/sliceitoff/stats/stats.py1
13 files changed, 106 insertions, 79 deletions
diff --git a/src/sliceitoff/__main__.py b/src/sliceitoff/__main__.py
index 7d21c7d..2ca02f7 100644
--- a/src/sliceitoff/__main__.py
+++ b/src/sliceitoff/__main__.py
@@ -34,7 +34,6 @@ def sliceitoff():
dt = clock.tick()
display.update( [welcome.sprites] )
-
Stats.new_game()
diff --git a/src/sliceitoff/assets/fonts.lst b/src/sliceitoff/assets/fonts.lst
index f5b4bd3..4a57f92 100644
--- a/src/sliceitoff/assets/fonts.lst
+++ b/src/sliceitoff/assets/fonts.lst
@@ -1,4 +1,8 @@
lcd assets gnufonts UTIL GNUFONTS LCD.FNT
deco assets gnufonts UTIL GNUFONTS DECO.FNT
8x8 assets gnufonts UTIL GNUFONTS 8X8.FNT
+8x14 assets gnufonts UTIL GNUFONTS 8X14.FNT
computer assets gnufonts UTIL GNUFONTS COMPUTER.FNT
+breeze assets gnufonts UTIL GNUFONTS BREEZE.FNT
+scott assets gnufonts UTIL GNUFONTS SCOTT.FNT
+hearst assets gnufonts UTIL GNUFONTS HEARST.FNT \ No newline at end of file
diff --git a/src/sliceitoff/field/field.py b/src/sliceitoff/field/field.py
index 134501c..f1a2086 100644
--- a/src/sliceitoff/field/field.py
+++ b/src/sliceitoff/field/field.py
@@ -128,8 +128,9 @@ class Field(pygame.sprite.LayeredUpdates):
area = ax, y2, aw, y3-y2
self.explode(area)
- self.add(SliceSprite(area))
- return Scaling.area_to_rect( area )
+ zap_spite = SliceSprite(area)
+ self.add(zap_spite)
+ return zap_spite
def active_sprites(self):
""" Returns all sprites that are not dead """
@@ -137,9 +138,9 @@ class Field(pygame.sprite.LayeredUpdates):
def explode(self, area):
sx, sy, w, h = area
- for x in range(int(sx),int(sx+w),4_000):
- for y in range(int(sy),int(sy+h),3_000):
- self.add(ExplodedField((x,y,3_000,3_000)))
+ for x in range(int(sx),int(sx+w),8_000):
+ for y in range(int(sy),int(sy+h),8_000):
+ self.add(ExplodedField((x,y,4_000,4_000)))
def kill_if_not_colliding(self, sprites):
diff --git a/src/sliceitoff/game/anykey.py b/src/sliceitoff/game/anykey.py
new file mode 100644
index 0000000..6fd48a2
--- /dev/null
+++ b/src/sliceitoff/game/anykey.py
@@ -0,0 +1,7 @@
+import pygame
+
+def anykey():
+ for event in pygame.event.get():
+ if event.type in (pygame.MOUSEBUTTONDOWN, pygame.KEYDOWN, pygame.QUIT):
+ return True
+ return False
diff --git a/src/sliceitoff/game/gameplay.py b/src/sliceitoff/game/gameplay.py
index 12daeaf..6869cbb 100644
--- a/src/sliceitoff/game/gameplay.py
+++ b/src/sliceitoff/game/gameplay.py
@@ -17,18 +17,14 @@ class Gameplay:
self.enemies = enemies
def fire(self):
- hitbox = self.field.slice(
+ """ Lazer is fired. Actions to be taken. """
+ zap_sprite = self.field.slice(
self.player.position,
self.player.direction,
4_500)
- hit = False
- if hitbox is not None:
- for enemy in self.enemies.sprites():
- if hitbox.colliderect(enemy.rect):
- hit = True
- break
-
- if hit:
+ if not zap_sprite:
+ return False
+ if pygame.sprite.spritecollideany(zap_sprite, self.enemies):
if Stats.lose_life():
return True
self.field.kill_if_not_colliding(self.enemies.sprites())
diff --git a/src/sliceitoff/game/level.py b/src/sliceitoff/game/level.py
index 25c34b9..15668a4 100644
--- a/src/sliceitoff/game/level.py
+++ b/src/sliceitoff/game/level.py
@@ -6,7 +6,9 @@ from player import Player
from field import Field
from enemies import Enemies
from stats import Stats
+from screens import levelup_screen, gameover_screen, level_screen
from .gameplay import Gameplay
+from .anykey import anykey
class Level:
@@ -22,30 +24,40 @@ class Level:
status = self.status,
field = self.field,
enemies = self.enemies)
- self.obj_classes = (
+ self.obj_classes = [
self.status,
self.field,
- self.enemies,
- self.player)
+ self.enemies]
+ self.level_info = level_screen()
+ self.level_over = None
def step(self, dt):
for obj in self.obj_classes:
obj.update(dt = dt)
self.enemies.hit_walls(self.field.active_sprites())
-
- Stats.update_bonus(dt)
-
- self.display.update( (
- self.status,
- self.field,
- self.enemies,
- pygame.sprite.GroupSingle(
- sprite = self.player.get_top_sprite())))
-
-
- if self.gameplay.step():
- return False
-
+ objs = self.obj_classes[:]
+ if self.level_info:
+ if anykey():
+ self.level_info = None
+ else:
+ objs += [self.level_info]
+ elif self.level_over:
+ objs += [self.level_over]
+ if anykey():
+ return False
+ else:
+ objs += [pygame.sprite.GroupSingle(
+ sprite = self.player.get_top_sprite())]
+ Stats.update_bonus(dt)
+ if self.gameplay.step():
+ if Stats.lives:
+ self.level_over = levelup_screen()
+ else:
+ self.level_over = gameover_screen()
+
+ self.display.update(objs)
+
+
return True
diff --git a/src/sliceitoff/game/show.py b/src/sliceitoff/game/show.py
index c3fe436..50ed0ba 100644
--- a/src/sliceitoff/game/show.py
+++ b/src/sliceitoff/game/show.py
@@ -1,5 +1,6 @@
""" Reads user input and does actions when game play is on. """
import pygame
+from .anykey import anykey
class Show:
""" To show some sprites and quit on any key """
@@ -13,21 +14,13 @@ class Show:
return False
if self.timeout < 0:
- for event in pygame.event.get():
- if event.type in (
- pygame.MOUSEBUTTONDOWN,
- pygame.KEYDOWN,
- pygame.QUIT):
- return False
+ if anykey():
+ return False
self.fadeout -= dt
self.sprites.update(explode=dt)
return True
- for event in pygame.event.get():
- if event.type in (
- pygame.MOUSEBUTTONDOWN,
- pygame.KEYDOWN,
- pygame.QUIT):
- self.timeout = 0
+ if anykey():
+ self.timeout = 0
self.timeout -= dt
return True
diff --git a/src/sliceitoff/player/player.py b/src/sliceitoff/player/player.py
index de49083..c062f1c 100644
--- a/src/sliceitoff/player/player.py
+++ b/src/sliceitoff/player/player.py
@@ -12,7 +12,7 @@ class PlayerSprite(pygame.sprite.Sprite):
self.image = image
self.rect = self.image.get_rect()
- def update(self, pos = None):
+ def update(self, pos = None, **kwargs):
if pos:
w, h = self.image.get_size()
self.rect = self.image.get_rect().move(pos[0]-w//2,pos[1]-h//2)
@@ -28,11 +28,13 @@ class Player(pygame.sprite.LayeredUpdates):
image = pygame.transform.rotate(image, 90)
self.add(PlayerSprite(image), layer = 1)
- def update(self, pos = None, direction = False, dt = 0):
- if not self.lazer:
- if direction:
- self.direction = not self.direction
- self.switch_layer(0,1)
- if pos:
- super().update(pos = pos)
- self.position = Scaling.scale_to_internal(pos)
+ def update(self, pos = None, direction = False, **kwargs):
+ if self.lazer:
+ direction = False
+ pos = None
+ super().update(pos = pos, **kwargs)
+ if direction:
+ self.direction = not self.direction
+ self.switch_layer(0,1)
+ if pos:
+ self.position = Scaling.scale_to_internal(pos)
diff --git a/src/sliceitoff/screens/__init__.py b/src/sliceitoff/screens/__init__.py
index 89294bd..ad49657 100644
--- a/src/sliceitoff/screens/__init__.py
+++ b/src/sliceitoff/screens/__init__.py
@@ -1,2 +1,5 @@
-#from .levelup import LevelUp
from .welcome import welcome_screen
+from .levelup import levelup_screen
+from .gameover import gameover_screen
+from .level import level_screen
+
diff --git a/src/sliceitoff/screens/gameover.py b/src/sliceitoff/screens/gameover.py
new file mode 100644
index 0000000..33bda18
--- /dev/null
+++ b/src/sliceitoff/screens/gameover.py
@@ -0,0 +1,8 @@
+from text import TextPage
+
+def gameover_screen():
+ return TextPage(
+ "Game Over!",
+ font = '8x8',
+ size = (24_000, 24_000),
+ pos = (48_000, 108_000) )
diff --git a/src/sliceitoff/screens/level.py b/src/sliceitoff/screens/level.py
new file mode 100644
index 0000000..4a63dc2
--- /dev/null
+++ b/src/sliceitoff/screens/level.py
@@ -0,0 +1,9 @@
+from text import TextPage
+from stats import Stats
+
+def level_screen():
+ return TextPage(
+ f"Level {Stats.level}!",
+ font = '8x8',
+ size = (24_000, 24_000),
+ pos = (48_000, 108_000) )
diff --git a/src/sliceitoff/screens/levelup.py b/src/sliceitoff/screens/levelup.py
index 178160c..0a0468b 100644
--- a/src/sliceitoff/screens/levelup.py
+++ b/src/sliceitoff/screens/levelup.py
@@ -1,27 +1,19 @@
-import os
-import pygame
-
-from display import Scaling
-from images import Images, Fonts
+from text import TextPage
from stats import Stats
-class Status():
- def __init__(self):
- self.sprites = pygame.sprite.Group()
-
- def update(self, dt):
- """ Update sprites basis of dt. dt = milliseconds from last update """
-
- score_str = (
- "{:02d}\x12 {:02d}\xfe {:02d}\x03 "
- "{:02d}\x0e {:08d}\x0f").format(
- Stats.level,
- 99 if Stats.percent == 100 else int(Stats.percent),
- Stats.lives,
- Stats.bonus // 1000,
- Stats.score)
- self.sprites = TextGroup(
- score_str,
- (0, 282_000),
- size = 16_000,
- font = '8x8')
+def levelup_screen():
+ text = (
+ " LEVEL UP BONUS!\n"
+ " ===============\n"
+ "\n"
+ f"Level{Stats.level*3000:7d}pts\n"
+ f"Time{Stats.bonus:8d}pts\n"
+ f"\n"
+ f"Total{Stats.level*3000+Stats.bonus:7d}pts")
+
+ return TextPage(
+ text,
+ font = 'hearst',
+ size = (12_000, 24_000),
+ grid = (14_000, 24_000),
+ pos = (12_000, 6_000) )
diff --git a/src/sliceitoff/stats/stats.py b/src/sliceitoff/stats/stats.py
index 22345d7..80cd347 100644
--- a/src/sliceitoff/stats/stats.py
+++ b/src/sliceitoff/stats/stats.py
@@ -20,6 +20,7 @@ class Stats:
__class__.score += __class__.level * 3_000
__class__.score += __class__.level * __class__.bonus
__class__.bonus = 20_000
+ __class__.percent = 100
__class__.level += 1
@staticmethod