Import des collisions depuis un fichier de map
This commit is contained in:
parent
a1cbe26892
commit
78f015a082
@ -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)
|
||||
|
@ -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"):
|
||||
|
BIN
gamedata/maps/TulipFields/base.png
Normal file
BIN
gamedata/maps/TulipFields/base.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.0 KiB |
371
gamedata/maps/TulipFields/map.json
Normal file
371
gamedata/maps/TulipFields/map.json
Normal 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}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -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)
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user