diff --git a/gamedata/definitions.py b/gamedata/definitions.py index fa211d4..6b9be05 100644 --- a/gamedata/definitions.py +++ b/gamedata/definitions.py @@ -1,5 +1,5 @@ from random import * -import sys,os,math,shutil,traceback +import sys,os,math,shutil,json def ex_sql(db_name,request,replace=""): conn = sqlite3.connect(db_name) diff --git a/gamedata/game.py b/gamedata/game.py index 7334bef..c19fafe 100644 --- a/gamedata/game.py +++ b/gamedata/game.py @@ -19,6 +19,8 @@ class Game(): self.fontfilesmall = pygame.font.Font(font,18) self.fontfilebig = pygame.font.Font(font,60) + self.logs = [] + self.running = True self.init_inputs() self.gameloop = gameloop.GameLoop() # Je crée une boucle de jeu @@ -26,6 +28,37 @@ class Game(): pygame.display.set_icon(self.sprite_lib["icon.png"]) self.sound_lib = self.init_assets("gamedata/sounds/",pygame.mixer.Sound) # Pareil, mais pour les musiques / sons + # Chargement des niveaux + def loadlvldata(mapfolder): + mapdico = {} + mapdico["name"] = mapfolder.split(os.sep)[-1] + mapdico["cover"] = None + mapdico["data"] = None + mapdico["tilesets"] = {} + scanner = os.scandir(path=mapfolder) + for i in scanner: # Je check tout les fichiers du dossier + name = i.name + try: + if name.endswith(".png"): + if name=="cover.png": + mapdico["cover"] = pygame.image.load(i.path) + else: + mapdico["tilesets"][i.name] = pygame.image.load(i.path) + except: + self.log("Erreur",mapfolder,name,"Fichier invalide") + if name=="map.json": + try: + with open(i.path,"r") as jsonfile: + mapdico["data"] = lib.json.loads(jsonfile.read()) + except: + self.log("Erreur",mapfolder,name) + if mapdico["data"]: + return mapdico + return None + + self.levels_lib = self.init_assets("gamedata/maps/",loadlvldata,recursive=False) # Je charge le dossier de maps + + self.sound_volumes = {} for i in self.sound_lib.keys(): self.sound_volumes[i] = 1 @@ -57,6 +90,10 @@ class Game(): def set_camera(self,posx,posy): self.globals["camerax"], self.globals["cameray"] = posx,posy + def log(*args): + args[0].logs.append(" ".join(args[1:])) + print(" ".join(args[1:])) + def reinit_volumes(self): for i in self.sound_lib.keys(): # J'applique de base les volumes @@ -169,23 +206,23 @@ class Game(): else: self.inputs["mouse"]["click"] = 0 - def init_assets(self,path,function): + def init_assets(self,path,function,recursive=True): dico = {} - self.scan_dir(path,path,dico,function) + self.scan_dir(path,path,dico,function,recursive) return dico - def scan_dir(self,dirpath,origin,dico,function): + def scan_dir(self,dirpath,origin,dico,function,recursive=True): scanner = os.scandir(path=dirpath) for i in scanner: # Je passe à travers toutes les données d'un dossier, fichiers et sous dossiers compris # i.path est le chemin du fichier, par exemple # Si c'est une image, je l'importe et l'ajoute à la librairie finalpath = i.path.replace("\\","/") - if i.is_file(): + if i.is_file() or not recursive: finalpath = finalpath.replace(origin,'') # J'enleve l'origine (dans ce cas 'assets/' car c'est redontant, tout les sprites sont dedans dico[finalpath] = function(i.path) # Si c'est un dossier, je répete l'opération mais à l'intérieur de celui ci - if i.is_dir(): - self.scan_dir(i.path,origin,dico,function) + if i.is_dir() and recursive: + self.scan_dir(i.path,origin,dico,function,recursive) scanner.close() def getSpriteDir(self,directory,ext=".png",assetdir="sprite_lib"): diff --git a/gamedata/maps/TulipFields/base.png b/gamedata/maps/TulipFields/base.png new file mode 100644 index 0000000..c4aef78 Binary files /dev/null and b/gamedata/maps/TulipFields/base.png differ diff --git a/gamedata/maps/TulipFields/map.json b/gamedata/maps/TulipFields/map.json new file mode 100644 index 0000000..b169220 --- /dev/null +++ b/gamedata/maps/TulipFields/map.json @@ -0,0 +1,371 @@ +{ + "ogmoVersion": "3.4.0", + "width": 320, + "height": 240, + "offsetX": 0, + "offsetY": 0, + "layers": [ + { + "name": "Platforms", + "_eid": "16983036", + "offsetX": 0, + "offsetY": 0, + "gridCellWidth": 16, + "gridCellHeight": 16, + "gridCellsX": 20, + "gridCellsY": 15, + "tileset": "Base", + "dataCoords2D": [ + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [0, 0], + [2, 0], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [0, 2], + [2, 2], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [0, 0], + [1, 0], + [2, 0], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [0, 1], + [1, 1], + [2, 1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [0, 0], + [1, 0], + [1, 0], + [1, 0], + [2, 0], + [-1], + [-1], + [-1] + ], + [ + [-1], + [0, 1], + [1, 1], + [2, 1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [5, 1], + [1, 1], + [1, 1], + [1, 1], + [2, 1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [0, 1], + [1, 1], + [2, 1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [-1], + [5, 1], + [1, 1], + [1, 1], + [1, 1], + [2, 1], + [-1], + [-1], + [-1] + ], + [ + [-1], + [0, 1], + [1, 1], + [2, 1], + [-1], + [-1], + [0, 0], + [1, 0], + [1, 0], + [1, 0], + [1, 0], + [1, 0], + [5, 2], + [1, 1], + [1, 1], + [6, 0], + [7, 0], + [8, 0], + [-1], + [-1] + ], + [ + [-1], + [0, 1], + [1, 1], + [6, 0], + [8, 0], + [-1], + [0, 1], + [1, 1], + [1, 1], + [1, 1], + [1, 1], + [1, 1], + [1, 1], + [1, 1], + [6, 0], + [11, 2], + [7, 1], + [8, 1], + [-1], + [-1] + ] + ], + "exportMode": 1, + "arrayMode": 1 + }, + { + "name": "Solids", + "_eid": "17026890", + "offsetX": 0, + "offsetY": 0, + "gridCellWidth": 16, + "gridCellHeight": 16, + "gridCellsX": 20, + "gridCellsY": 15, + "entities": [ + {"name": "Solid", "id": 1, "_eid": "17026310", "x": 16, "y": 144, "width": 48, "height": 96, "originX": 0, "originY": 0}, + {"name": "Solid", "id": 2, "_eid": "17026310", "x": 112, "y": 112, "width": 32, "height": 32, "originX": 0, "originY": 0}, + {"name": "Solid", "id": 3, "_eid": "17026310", "x": 192, "y": 160, "width": 80, "height": 48, "originX": 0, "originY": 0}, + {"name": "Solid", "id": 4, "_eid": "17026310", "x": 96, "y": 208, "width": 192, "height": 32, "originX": 0, "originY": 0}, + {"name": "Solid", "id": 6, "_eid": "17026310", "x": 64, "y": 224, "width": 16, "height": 16, "originX": 0, "originY": 0} + ] + } + ] +} \ No newline at end of file diff --git a/gamedata/objects/combat/player.py b/gamedata/objects/combat/player.py index d94aacc..1e69c8d 100644 --- a/gamedata/objects/combat/player.py +++ b/gamedata/objects/combat/player.py @@ -9,9 +9,9 @@ class Player(BaseObject): super().__init__(x,y,game,self.sprite.get_width(),self.sprite.get_height()) tileset = game.gameloop.findname("TilesetRenderer")[0] - self.grid = tileset.collisiongrid - self.tilew = tileset.tilew - self.tileh = tileset.tileh + self.collisionrects = tileset.rects + self.tilew = tileset.solidtilew + self.tileh = tileset.solidtileh self.speed = 300 @@ -20,8 +20,6 @@ class Player(BaseObject): self.jump = -600 self.vertical = self.maxgravity - self.collisionrects = self.getrects() - self.hrest = 0 self.vrest = 0 @@ -48,14 +46,6 @@ class Player(BaseObject): self.move(hor*self.speed*self.game.dt,self.vertical*self.game.dt) - def getrects(self): - result = [] - for y in range(len(self.grid)): - for x in range(len(self.grid[y])): - if self.grid[y][x]>0: - result.append(self.game.pygame.Rect([x*self.tilew,y*self.tileh,self.tilew,self.tileh])) - return result - def move(self,movex,movey): hstoped = False hor = int(movex+self.hrest) diff --git a/gamedata/objects/combat/tileset.py b/gamedata/objects/combat/tileset.py index 09c6d02..e9ca229 100644 --- a/gamedata/objects/combat/tileset.py +++ b/gamedata/objects/combat/tileset.py @@ -2,30 +2,50 @@ from gamedata.objects.base import BaseObject class TilesetRenderer(BaseObject): - def __init__(self,x,y,game): + def __init__(self,x,y,game,mapfoldername): super().__init__(x,y,game) self.tilew = 64 self.tileh = 64 - self.solid = game.sprite_lib["solid.png"] - self.empty = game.sprite_lib["empty.png"] + self.level = game.levels_lib[mapfoldername] + self.reinit_rects(self.level) - self.collisiongrid = [ - [0,0,0,0,0,0,0], - [1,0,0,0,1,0,0], - [1,1,0,0,0,0,0], - [1,1,0,0,0,0,0], - [1,1,0,1,0,1,1], - [1,1,0,1,1,1,0], - ] def draw(self): + for i in self.rects: + self.game.pygame.draw.rect(self.game.window,[255,0,0],(i[0:4])) - for y in range(len(self.collisiongrid)): - for x in range(len(self.collisiongrid[y])): + def reinit_rects(self,level): + json = level["data"] + name = level["name"] + self.rects = [] + if "layers" in json.keys(): + solidlayer = False + for layer in json["layers"]: + try: + if layer["name"] == "Solids" and "entities" in layer.keys() : + solidlayer = layer + break + except: + self.game.log("Erreur",name,"Les layers sont invalides") + if solidlayer: + if "gridCellWidth" in solidlayer.keys() and "gridCellHeight" in solidlayer.keys(): + self.solidtilew = solidlayer["gridCellWidth"] + self.solidtileh = solidlayer["gridCellHeight"] + else: + self.solidtilew,self.solidtileh = 32,32 + self.game.log("Erreur",name,"Pas de taille de tiles précisée, défaut à 32x32") + for entity in solidlayer["entities"]: + try: + x,y = entity["x"],entity["y"] + w,h = entity["width"],entity["height"] + self.rects.append(self.game.pygame.Rect(x,y,w,h)) + except: + self.game.log("Erreur",name,"Propriétés invalides") + else: + self.game.log("Erreur",name,"Il manque les collisions, Entity Layer nommé Solids") - data = self.collisiongrid[y][x] - sprites = [self.empty,self.solid] - self.game.window.blit(sprites[data],(self.rect[0]+x*self.tilew,self.rect[1]+y*self.tileh)) + else: + self.game.log("Erreur",name,"Pas de layers") diff --git a/gamedata/scenes.py b/gamedata/scenes.py index ed8dbe5..1a764d8 100644 --- a/gamedata/scenes.py +++ b/gamedata/scenes.py @@ -16,7 +16,8 @@ def main(game): def fight(game): game.gameloop.reinit() - tileset = TilesetRenderer(0,0,game) + mapname = game.lib.choice(list(game.levels_lib.keys())) + tileset = TilesetRenderer(0,0,game,mapname) game.gameloop.summon(tileset) p1 = Player(70,50,game) game.gameloop.summon(p1)