Import des collisions depuis un fichier de map

This commit is contained in:
theo@manjaro 2021-07-02 11:10:45 +02:00
parent a1cbe26892
commit 78f015a082
7 changed files with 456 additions and 37 deletions

View File

@ -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)

View File

@ -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"):

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -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}
]
}
]
}

View File

@ -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)

View File

@ -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")

View File

@ -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)