Overflown/gamedata/objects/ingame/tileset.py

148 lines
7.3 KiB
Python

from gamedata.objects.base import BaseObject
from gamedata.objects.ingame.ennemies.robot import Robot
from gamedata.objects.ingame.ennemies.crate import Crate
from gamedata.objects.ingame.ennemies.balloon import Balloon
from gamedata.objects.ingame.ennemies.spring import Spring
from gamedata.objects.ingame.ennemies.waterchange import WaterChange
from gamedata.objects.levels import Levels
class TilesetRenderer(BaseObject):
def __init__(self,x,y,game,mapfoldername):
super().__init__(x,y,game)
self.tilew = 64
self.tileh = 64
self.level = game.levels_lib[mapfoldername]
self.reinit(self.level)
self.bgs = [game.sprite_lib["fallbackground.png"]]
if len(self.level["backgrounds"]):
self.bgs = self.level["backgrounds"]
self.bgoffset = self.layers[0]["surface"].get_height()/2-self.game.globals["camerah"]
# Prescale backgrounds
self.sep = self.game.pygame.transform.scale(self.game.sprite_lib["backgroundseparator.png"],[self.game.globals["cameraw"],self.game.globals["camerah"]])
self.scaledbgs = []
wratio = self.game.globals["cameraw"]/self.bgs[0]["sprite"].get_width()
hratio = self.game.globals["camerah"]/self.bgs[0]["sprite"].get_height()
for bg in self.bgs:
width, height = round(bg["sprite"].get_width()*wratio),round(bg["sprite"].get_height()*hratio)
sprite = self.game.pygame.transform.scale(bg["sprite"],(width,height))
self.scaledbgs.append(sprite)
def step(self):
# Spawning ennemies
while len(self.queue)>0:
props = self.queue.pop()
e = props[0](props[1],props[2],self.game,props[3],props[4])
self.game.gameloop.summon(e)
def draw(self):
lastoffset = 0
for i,bg in enumerate(self.scaledbgs):
ratio = 1-(len(self.bgs)-i)/len(self.bgs)
width = bg.get_width()
height = bg.get_height()
nbs = self.game.globals["cameraw"]/width
lastoffset = self.rect[1]+(self.bgoffset-self.game.globals["cameray"])*ratio
for i in range(round(nbs+0.5)):
self.game.window.blit(bg,[(-self.game.globals["camerax"]*ratio)%width+(i-1)*width,lastoffset])
# Draw filler
if self.level["filler"]:
filleroffset = lastoffset+height
self.game.window.blit(self.level["filler"],[0,filleroffset])
# Separator
self.game.window.blit(self.sep,[0,0])
# Layers
for layer in self.layers:
self.game.window.blit(layer["surface"],(layer["offsets"][0]-self.game.globals["camerax"],layer["offsets"][1]-self.game.globals["cameray"]))
def reinit(self,level):
json = level["data"]
name = level["name"]
self.rects = []
self.semirects = []
self.layers = []
self.spawns = []
spawnlists = {"Spawns":self.spawns}
ennemies = {"Robot":Robot,"Crate":Crate,"Balloon":Balloon,"Spring":Spring,"WaterChange":WaterChange,"Levels":Levels}
self.queue = [] # For spawning ennemies after beeing initialized
if "layers" in json.keys() and type(json["layers"]).__name__=="list":
solidlayer = False
for layer in json["layers"]:
#try:
if True:
if layer["name"] == "Solids" and "entities" in layer.keys() : # Je trouve les collisions
solidlayer = layer
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"]
spawnlists[entity["name"]].append(self.game.pygame.Rect((x,y,w,h)))
elif layer["name"] == "Ennemies" and "entities" in layer.keys():
for entity in layer["entities"]:
x,y = entity["x"],entity["y"]
nodes = []
customvalues = {}
if "nodes" in entity.keys():
nodes = entity["nodes"]
if "values" in entity.keys():
customvalues = entity["values"]
self.queue.append((ennemies[entity["name"]],x,y,nodes,customvalues))
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],"name":layer["name"]}
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)
#except:
else:
self.game.log("Erreur",name,"Les layers sont invalides")
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"]
w,h = self.solidtilew,self.solidtileh
if "width" in entity.keys():
w = entity["width"]
if "height" in entity.keys():
h = entity["height"]
lists = {"Solid":self.rects,"SemiSolid":self.semirects}
lists[entity["name"]].append(self.game.pygame.Rect(x,y,w,h))
except:
self.game.log("Erreur",name,entity,"Propriétés invalides")
else:
self.game.log("Erreur",name,"Il manque les collisions, Entity Layer nommé Solids")
self.layers.sort(key=lambda x: x["name"])
self.layers.reverse()
else:
self.game.log("Erreur",name,"Pas de layers")