countinued working on level loading

main
Stephan Halder 2023-03-26 15:14:06 +02:00
parent 7f6e37d8bc
commit bf0688408e
12 changed files with 118 additions and 56 deletions

View File

@ -26,7 +26,7 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,X,X,X,X,X,X,X,X,X,,,,,,,,,,,,,,,,,D,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,x,x,x,x,x,x,x,x,x,,,,,,,,,,,,,,,,,D,,,
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#

1
26
27
28
29 X x X x X x X x X x X x X x X x X x D
30 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
31 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
32 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

View File

@ -1,7 +1,7 @@
[
{
"name": "1-1",
"theme": "ghost",
"theme": "tutorial",
"abilities": [
"dash"
],

View File

@ -88,5 +88,34 @@
"height": 36
}
]
},
{
"id": "tutorial_block_full",
"subsheets": [
{
"id": "1",
"delays": [
1
],
"width": 16,
"height": 16
},
{
"id": "2",
"delays": [
1
],
"width": 16,
"height": 16
},
{
"id": "3",
"delays": [
1
],
"width": 16,
"height": 16
}
]
}
]

View File

@ -5,9 +5,12 @@ DYNAMIC = 'dynamic'
class LevelElementSymbols:
SOLID_BLOCK = {
'symbol': '#',
'type': STATIC,
'sprite_id': '_block'
'sprite_id': '_block_full',
'themed': True
}
SOLID_BLOCK_TOP = {
}
SOLID_BLOCK_LEFT = {
'type': STATIC,
@ -26,7 +29,7 @@ class LevelElementSymbols:
'sprite_id': '_gate'
}
GOAL_DOOR = {
'type':STATIC,
'type': STATIC,
'sprite_id': '_goal_door'
}
SMALL_SPIKE = {
@ -34,7 +37,7 @@ class LevelElementSymbols:
'sprite_id': '_small_spike'
}
LEVER = {
'type':STATIC,
'type': STATIC,
'sprite_id': '_lever'
}
PLAYER = {
@ -44,13 +47,16 @@ class LevelElementSymbols:
dict = {
'#': SOLID_BLOCK,
'+': SOLID_BLOCK,
'l': SOLID_BLOCK_RIGHT,
'r': SOLID_BLOCK_LEFT,
'': AIR,
'g': GATE,
'd': GOAL_DOOR,
'G': GATE,
'D': GOAL_DOOR,
'x': SMALL_SPIKE,
'h': LEVER,
'L': LEVER,
'P': PLAYER
}
BLOCKS_LIST = [SOLID_BLOCK, SOLID_BLOCK_RIGHT, SOLID_BLOCK_LEFT]

View File

@ -1,5 +1,3 @@
import sys
import os
import json
from level.Level import Level

View File

@ -1,7 +1,7 @@
from level.elements.LevelElement import LevelElement
from sprite.StaticSprite import StaticSprite
from level.elements.StaticLevelElement import StaticLevelElement
from sprite.Spritesheet import Spritesheet
class BlockElement(LevelElement):
def __init__(self, x_position : int, y_position : int, sprite : StaticSprite):
super().__init__(x_position, y_position, sprite)
class BlockElement(StaticLevelElement):
def __init__(self, spritesheet: Spritesheet):
super().__init__(spritesheet)

View File

@ -1,9 +1,9 @@
from LevelElement import LevelElement
from sprite.StaticSprite import StaticSprite
from StaticLevelElement import StaticLevelElement
from sprite.Spritesheet import Spritesheet
class InteractableElement(LevelElement):
def __init__(self, x_position : int, y_position : int, sprite : StaticSprite, block_id : str, requires : list[str]):
super().__init__(x_position, y_position, sprite)
class InteractableElement(StaticLevelElement):
def __init__(self, spritesheet: Spritesheet, block_id: str, requires: list[str]):
super().__init__(spritesheet)
self.block_id = block_id
self.requires = requires

View File

@ -1,9 +0,0 @@
from sprite.StaticSprite import StaticSprite
class LevelElement:
def __init__(self,x_position : int, y_position : int, sprite : StaticSprite):
self.x_position = x_position
self.y_position = y_position
self.sprite = sprite

View File

@ -1,12 +1,12 @@
from level.Level import Level
from level.LevelElementSymbols import LevelElementSymbols
from level.elements.BlockElement import BlockElement
from level.elements.InteractableElement import InteractableElement
from physics.SpriteManager import SpriteManager, DrawLayers
from sprite.SpritesheetManager import SpritesheetManager
from sprite.StaticSprite import StaticSprite
BLOCK_SIZE = (12, 12)
class LoadedLevel:
def __init__(self, sprite_manager: SpriteManager, spritesheet_manager: SpritesheetManager):
self.sprite_manager = sprite_manager
@ -15,25 +15,25 @@ class LoadedLevel:
def load_level(self, level: Level):
for row_number, row in enumerate(level.tiles):
self.blocks.append([])
for tile_number, tile in enumerate(row):
x_position = row_number * BLOCK_SIZE[0]
y_position = tile_number * BLOCK_SIZE[1]
if LevelElementSymbols.dict[tile] != LevelElementSymbols.PLAYER and LevelElementSymbols.dict[tile] != LevelElementSymbols.AIR:
sprite = StaticSprite(self.spritesheet_manager.get_sheet(level.theme + LevelElementSymbols.dict[tile]['sprite_id']))
sprite.position_scale.position = (x_position, y_position)
position = (tile_number * BLOCK_SIZE[0], row_number * BLOCK_SIZE[1])
tile_element = LevelElementSymbols.dict[tile['name']]
sprite = None
if tile_element in LevelElementSymbols.BLOCKS_LIST:
spritesheet = self.spritesheet_manager.get_sheet(level.theme + tile_element['sprite_id'])
sprite = BlockElement(spritesheet)
sprite.set_animation_state('1')
sprite.position_scale.position = position
# tile['id'], tile['requirements']
if sprite is not None:
self.sprite_manager.add_ui_element(DrawLayers.OBJECTS, sprite)
if(tile['id'] is None):
self.blocks[row_number].append(BlockElement(x_position, y_position, sprite))
else:
self.blocks[row_number].append(InteractableElement(x_position, y_position, sprite,tile['id'], tile['requirements']))
def destroy_level(self):
for block in self.blocks:
self.sprite_manager.remove_ui_element(block)
del self.blocks

View File

@ -0,0 +1,7 @@
from sprite.Spritesheet import Spritesheet
from sprite.StaticSprite import StaticSprite
class StaticLevelElement(StaticSprite):
def __init__(self, spritesheet: Spritesheet):
super().__init__(spritesheet)

View File

@ -3,6 +3,7 @@ import random
import pygame
from level.LevelManager import LevelManager
from level.elements.LoadedLevel import LoadedLevel
from physics.SpriteManager import SpriteManager, DrawLayers
from physics.TickData import TickData
from physics.controllers.PlayerSprite import PlayerSprite
@ -14,7 +15,7 @@ from ui_elements.ClickEvent import ClickEvent
from ui_elements.KeyManager import KeyManager
from ui_elements.TextLabel import TextLabel
what_to_run = 'physics'
what_to_run = 'level'
def apply_frame_rate(number: float):
@ -28,11 +29,41 @@ def apply_frame_rate(number: float):
if what_to_run == 'level':
csv_parse_test = LevelManager('data/levels')
csv_parse_test.load_from_config('data/levels/levels.json')
print(csv_parse_test.levels[0])
for row in csv_parse_test.levels[0].tiles:
print(row)
screen_transform = PositionScale((0, 0), (1.5, 1.5))
pygame.init()
screen = pygame.display.set_mode((12 * 71 * 1.5, 12 * 40 * 1.5))
pygame.display.set_caption("PM GAME")
clock = pygame.time.Clock()
frame_rate = 30
spritesheet_manager = SpritesheetManager("data/sprites", "data/sprites/sprites.json")
sprite_manager = SpriteManager()
key_manager = KeyManager()
parsed_levels_manager = LevelManager('data/levels')
parsed_levels_manager.load_from_config('data/levels/levels.json')
generated_level = LoadedLevel(sprite_manager, spritesheet_manager)
generated_level.load_level(parsed_levels_manager.levels[0])
while True:
clock.tick(frame_rate)
pygame_events: list[pygame.event.Event] = pygame.event.get()
key_manager.update_key_events(pygame_events)
click_events: list[ClickEvent] = ClickEvent.create_events(pygame_events, screen_transform)
for event in pygame_events:
if event.type == pygame.QUIT:
pygame.quit()
quit()
screen.fill((0, 0, 0))
sprite_manager.tick(TickData(apply_frame_rate(1), pygame_events, key_manager, click_events, screen_transform))
sprite_manager.draw(screen, screen_transform)
pygame.display.update()
elif what_to_run == 'physics':

View File

@ -1,5 +1,5 @@
class PositionScale:
def __init__(self, position: tuple[int, int] = (0, 0), scale: tuple[int, int] = (1, 1)):
def __init__(self, position: tuple[float, float] = (0, 0), scale: tuple[float, float] = (1, 1)):
self.position = position
self.scale = scale