diff --git a/editor.py b/editor.py index f68b940..ef0dacd 100644 --- a/editor.py +++ b/editor.py @@ -32,10 +32,7 @@ class Editor: self.tilemap: Tilemap = Tilemap(game=self, tile_size=16) - try: - self.tilemap.load(path="map.json") - except FileNotFoundError: - pass + self.load_level("map") self.scroll: list[float] = [0, 0] @@ -49,6 +46,11 @@ class Editor: self.ongrid: bool = True self.running = True + def load_level(self, map_id: str|int): + try: + self.tilemap.load(path="data/maps/" + str(map_id) + ".json") + except FileNotFoundError: + pass def run(self): while self.running: # Hintergrund löschen diff --git a/game.py b/game.py index ae48433..9346446 100644 --- a/game.py +++ b/game.py @@ -9,6 +9,8 @@ from scripts.tilemap import Tilemap from scripts.clouds import Clouds from scripts.animation import Animation from scripts.particle import Particle +from scripts.spark import Spark + SCREEN_WIDTH = 640 SCREEN_HEIGHT = 480 @@ -70,11 +72,11 @@ class Game: "gun": load_image("gun.png"), "projectile": load_image("projectile.png"), } - self.player: Player = Player(game=self, pos=(50, 50), size=(8, 15)) + self.player: Player = Player(game=self, pos=(50, 50), size=(8, 15)) self.tilemap: Tilemap = Tilemap(game=self, tile_size=16) - self.load_level(0) + self.load_level("map") self.leaf_spawners: list[pygame.Rect] = [] self.enemys: list[Enemy] = [] @@ -92,13 +94,14 @@ class Game: self.particles: list[Particle] = [] self.projectiles: list = [] + self.sparks: list[Spark] = [] self.clouds: Clouds = Clouds(cloud_images=self.assets["clouds"], count=16) self.isJumping: bool = False self.scroll: list[float] = [0, 0] # self.boost: bool = False - def load_level(self, map_id: int): + def load_level(self, map_id: str|int): try: self.tilemap.load(path="data/maps/" + str(map_id) + ".json") except FileNotFoundError: @@ -147,7 +150,6 @@ class Game: ) self.player.render(surface=self.display, offset=render_scroll) - # [[x, y], direction, timer] for projectile in self.projectiles.copy(): projectile[0][0] += projectile[1] @@ -162,12 +164,45 @@ class Game: ) if self.tilemap.solid_check(projectile[0]): self.projectiles.remove(projectile) + for _ in range(4): + self.sparks.append( + Spark( + projectile[0], + random.random() + - 0.5 + + (math.pi if projectile[1] > 0 else 0), + 2 + random.random(), + ) + ) elif projectile[2] > 360: self.projectiles.remove(projectile) elif abs(self.player.dashing) < 50: if self.player.rect().collidepoint(projectile[0]): self.projectiles.remove(projectile) + for i in range(30): + angle = random.random() * math.pi * 2 + speed = random.random() * 5 + self.sparks.append( + Spark(self.player.rect().center, angle, 2 + random.random()) + ) + self.particles.append( + Particle( + self, + "particle", + self.player.rect().center, + velocity=[ + math.cos(angle + math.pi) * speed * 0.5, + math.sin(angle + math.pi) * speed * 0.5, + ], + frame=random.randint(0, 7), + ) + ) + for spark in self.sparks.copy(): + kill = spark.update() + spark.render(self.display, offset=render_scroll) + if kill: + self.sparks.remove(spark) # self.player.boost(self.boost) # print(int(self.player.pos[0])) @@ -200,7 +235,11 @@ class Game: # self.boost = True self.player.boost() - if event.key == pygame.K_x or event.key == pygame.K_LSHIFT or event.key == pygame.K_RSHIFT: + if ( + event.key == pygame.K_x + or event.key == pygame.K_LSHIFT + or event.key == pygame.K_RSHIFT + ): self.player.dash() if event.type == pygame.KEYUP: diff --git a/scripts/entities.py b/scripts/entities.py index d717eb9..d54076b 100644 --- a/scripts/entities.py +++ b/scripts/entities.py @@ -4,6 +4,7 @@ import random from dataclasses import dataclass from scripts.animation import Animation from scripts.particle import Particle +from scripts.spark import Spark from scripts.tilemap import Tilemap @@ -136,9 +137,25 @@ class Enemy(PhysicsEntity): self.game.projectiles.append( [[self.rect().centerx - 7, self.rect().centery], -1.5, 0] ) + for _ in range(4): + self.game.sparks.append( + Spark( + self.game.projectiles[-1][0], + random.random() - 0.5 + math.pi, + random.random(), + ) + ) if not self.flip and distance[0] > 0: self.game.projectiles.append( [[self.rect().centerx + 7, self.rect().centery], 1.5, 0] + ) + for _ in range(4): + self.game.sparks.append( + Spark( + self.game.projectiles[-1][0], + random.random() - 0.5, + random.random(), + ) ) elif random.random() < 0.02: diff --git a/scripts/spark.py b/scripts/spark.py new file mode 100644 index 0000000..6bfd4cb --- /dev/null +++ b/scripts/spark.py @@ -0,0 +1,46 @@ +import math + +import pygame + + +class Spark: + """Ein Funken, der von einer Klinge oder einem Projektil ausgeht.""" + + def __init__(self, pos, angle, speed): + self.pos = list(pos) + self.angle = angle + self.speed = speed + + def update(self): + # Bewegt den Funken in seine Richtung + self.pos[0] += math.cos(self.angle) * self.speed + self.pos[1] += math.sin(self.angle) * self.speed + + # Macht den Funken langsamer, bis er stehen bleibt + self.speed = max(0, self.speed - 0.1) + + # Gibt True zurück, wenn der Funken stillsteht (kann dann gelöscht werden) + return not self.speed + + def render(self, surface: pygame.Surface, offset=(0, 0)): + """Zeichnet den Funken als kleines, in Flugrichtung gestrecktes Viereck.""" + render_points = [ + ( + self.pos[0] + math.cos(self.angle) * self.speed * 3 - offset[0], + self.pos[1] + math.sin(self.angle) * self.speed * 3 - offset[1], + ), + ( + self.pos[0] + math.cos(self.angle + math.pi * 0.5) * self.speed * 0.5 - offset[0], + self.pos[1] + math.sin(self.angle + math.pi * 0.5) * self.speed * 0.5 - offset[1], + ), + ( + self.pos[0] + math.cos(self.angle + math.pi) * self.speed * 3 - offset[0], + self.pos[1] + math.sin(self.angle + math.pi) * self.speed * 3 - offset[1], + ), + ( + self.pos[0] + math.cos(self.angle - math.pi * 0.5) * self.speed * 0.5 - offset[0], + self.pos[1] + math.sin(self.angle - math.pi * 0.5) * self.speed * 0.5 - offset[1], + ), + ] + + pygame.draw.polygon(surface, (255, 255, 180), render_points) # (255, 255, 180) \ No newline at end of file