Overflown/gamedata/objects/combat/tileset.py

116 lines
5.7 KiB
Python
Raw Normal View History

2021-06-25 16:13:52 +02:00
from gamedata.objects.base import BaseObject
2021-11-16 23:36:56 +01:00
from gamedata.objects.combat.ennemies.robot import Robot
2021-11-17 16:14:29 +01:00
from gamedata.objects.combat.ennemies.crate import Crate
2021-11-17 17:28:02 +01:00
from gamedata.objects.combat.ennemies.balloon import Balloon
2021-11-18 17:58:38 +01:00
from gamedata.objects.combat.ennemies.spring import Spring
2021-06-25 16:13:52 +02:00
class TilesetRenderer(BaseObject):
def __init__(self,x,y,game,mapfoldername):
2021-06-25 16:13:52 +02:00
super().__init__(x,y,game)
self.tilew = 64
self.tileh = 64
self.level = game.levels_lib[mapfoldername]
2021-07-02 16:18:36 +02:00
self.reinit(self.level)
2021-06-25 16:13:52 +02:00
2021-07-02 22:10:01 +02:00
self.bg = game.sprite_lib["fallbackground.png"]
if self.level["background"]:
self.bg = self.level["background"]
2021-11-16 23:36:56 +01:00
def step(self):
# Spawning ennemies
while len(self.queue)>0:
props = self.queue.pop()
2021-11-18 17:58:38 +01:00
e = props[0](props[1],props[2],self.game,props[3],props[4])
2021-11-16 23:36:56 +01:00
self.game.gameloop.summon(e)
2021-06-25 16:13:52 +02:00
def draw(self):
2021-07-02 22:10:01 +02:00
self.game.window.blit(self.game.pygame.transform.scale(self.bg,(self.game.globals["cameraw"],self.game.globals["camerah"])),[0,0])
2021-07-02 16:18:36 +02:00
for layer in self.layers:
2021-07-02 21:06:34 +02:00
self.game.window.blit(layer["surface"],(layer["offsets"][0]-self.game.globals["camerax"],layer["offsets"][1]-self.game.globals["cameray"]))
2021-07-02 16:18:36 +02:00
def reinit(self,level):
json = level["data"]
name = level["name"]
self.rects = []
2021-07-06 21:14:27 +02:00
self.semirects = []
2021-07-02 16:18:36 +02:00
self.layers = []
2021-11-16 10:50:02 +01:00
self.spawns = []
spawnlists = {"Spawns":self.spawns}
2021-11-18 17:58:38 +01:00
ennemies = {"Robot":Robot,"Crate":Crate,"Balloon":Balloon,"Spring":Spring}
2021-11-16 23:36:56 +01:00
self.queue = [] # For spawning ennemies after beeing initialized
2021-07-02 16:18:36 +02:00
if "layers" in json.keys() and type(json["layers"]).__name__=="list":
solidlayer = False
for layer in json["layers"]:
2021-07-03 00:26:02 +02:00
#try:
if True:
2021-07-02 16:18:36 +02:00
if layer["name"] == "Solids" and "entities" in layer.keys() : # Je trouve les collisions
solidlayer = layer
2021-07-03 00:26:02 +02:00
elif layer["name"] == "Spawns" and "entities" in layer.keys() : # Je trouve les spawns
for entity in layer["entities"]:
x,y = entity["x"],entity["y"]
w,h = layer["gridCellWidth"],layer["gridCellHeight"]
if "width" in entity.keys():
w = entity["width"]
if "height" in entity.keys():
h = entity["height"]
2021-11-16 10:37:39 +01:00
spawnlists[entity["name"]].append(self.game.pygame.Rect((x,y,w,h)))
2021-07-03 00:26:02 +02:00
2021-11-16 23:36:56 +01:00
elif layer["name"] == "Ennemies" and "entities" in layer.keys():
for entity in layer["entities"]:
x,y = entity["x"],entity["y"]
nodes = []
2021-11-18 17:58:38 +01:00
customvalues = {}
2021-11-16 23:36:56 +01:00
if "nodes" in entity.keys():
nodes = entity["nodes"]
2021-11-18 17:58:38 +01:00
if "values" in entity.keys():
customvalues = entity["values"]
self.queue.append((ennemies[entity["name"]],x,y,nodes,customvalues))
2021-11-16 23:36:56 +01:00
2021-07-02 16:18:36 +02:00
else: # J'ajoute un layer de tiles
tileset = level["tilesets"][layer["tileset"]]
tilew,tileh = layer["gridCellWidth"],layer["gridCellHeight"]
tileoffx,tileoffy = layer["offsetX"],layer["offsetY"]
nbtilesx,nbtilesy = layer["gridCellsX"],layer["gridCellsY"]
storedlayer = {"offsets":[tileoffx,tileoffy]}
surface = self.game.pygame.Surface((tilew*nbtilesx,tileh*nbtilesy),flags=self.game.pygame.SRCALPHA)
for y in range(len(layer["dataCoords2D"])):
for x in range(len(layer["dataCoords2D"][y])):
coords = layer["dataCoords2D"][y][x]
if len(coords)>1:
areatocopy = [coords[0]*tilew,coords[1]*tileh,tilew,tileh]
surface.blit(tileset,(x*tilew,y*tileh),area=areatocopy)
storedlayer["surface"] = surface
self.layers.append(storedlayer)
2021-07-03 00:26:02 +02:00
#except:
else:
self.game.log("Erreur",name,"Les layers sont invalides")
2021-07-02 16:18:36 +02:00
if solidlayer: # Je crée les collisions
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"]
2021-07-03 00:26:02 +02:00
w,h = self.solidtilew,self.solidtileh
if "width" in entity.keys():
w = entity["width"]
if "height" in entity.keys():
h = entity["height"]
2021-07-06 21:14:27 +02:00
lists = {"Solid":self.rects,"SemiSolid":self.semirects}
lists[entity["name"]].append(self.game.pygame.Rect(x,y,w,h))
except:
2021-07-06 21:14:27 +02:00
self.game.log("Erreur",name,entity,"Propriétés invalides")
else:
self.game.log("Erreur",name,"Il manque les collisions, Entity Layer nommé Solids")
else:
self.game.log("Erreur",name,"Pas de layers")