Fengx1n's picture
Initial DEMO
e53fda1
import json
import pygame
from classes.Sprites import Sprites
from classes.Tile import Tile
from entities.Coin import Coin
from entities.CoinBrick import CoinBrick
from entities.Goomba import Goomba
from entities.Mushroom import RedMushroom
from entities.Koopa import Koopa
from entities.CoinBox import CoinBox
from entities.RandomBox import RandomBox
class Level:
def __init__(self, screen, sound, dashboard):
self.sprites = Sprites()
self.dashboard = dashboard
self.sound = sound
self.screen = screen
self.level = None
self.levelLength = 0
self.entityList = []
self.mario_state = None
def loadLevel(self, levelname):
with open("game/supermario/levels/{}.json".format(levelname)) as jsonData:
data = json.load(jsonData)
self.loadLayers(data)
self.loadObjects(data)
self.loadEntities(data)
self.loadMario(data)
self.levelLength = data["length"]
def loadMario(self, data):
# if get_with_warning(data["level"], "Mario", None) is None:
if "Mario" not in data["level"]:
return
self.mario_state = {
# "position" : get_with_warning(data["level"]["Mario"], "position", (0, 0)),
"position" : data["level"]["Mario"]["position"] if "position" in data["level"]["Mario"] else (0, 0),
# TODO more mario states
}
def loadEntities(self, data):
try:
[self.addCoinBox(x, y) for x, y in data["level"]["entities"]["CoinBox"]]
[self.addGoomba(x, y) for x, y in data["level"]["entities"]["Goomba"]]
[self.addKoopa(x, y) for x, y in data["level"]["entities"]["Koopa"]]
[self.addCoin(x, y) for x, y in data["level"]["entities"]["coin"]]
[self.addCoinBrick(x, y) for x, y in data["level"]["entities"]["coinBrick"]]
[self.addRandomBox(x, y, item) for x, y, item in data["level"]["entities"]["RandomBox"]]
except:
# if no entities in Level
pass
def loadLayers(self, data):
layers = []
for x in range(*data["level"]["layers"]["sky"]["x"]):
layers.append(
(
[
Tile(self.sprites.spriteCollection.get("sky"), None)
for y in range(*data["level"]["layers"]["sky"]["y"])
]
+ [
Tile(
self.sprites.spriteCollection.get("ground"),
pygame.Rect(x * 32, (y - 1) * 32, 32, 32),
)
for y in range(*data["level"]["layers"]["ground"]["y"])
]
)
)
self.level = list(map(list, zip(*layers)))
def loadObjects(self, data):
for x, y in data["level"]["objects"]["bush"]:
self.addBushSprite(x, y)
for x, y in data["level"]["objects"]["cloud"]:
self.addCloudSprite(x, y)
for x, y, z in data["level"]["objects"]["pipe"]:
self.addPipeSprite(x, y, z)
for x, y in data["level"]["objects"]["sky"]:
self.level[y][x] = Tile(self.sprites.spriteCollection.get("sky"), None)
for x, y in data["level"]["objects"]["ground"]:
self.level[y][x] = Tile(
self.sprites.spriteCollection.get("ground"),
pygame.Rect(x * 32, y * 32, 32, 32),
)
def updateEntities(self, cam):
for entity in self.entityList:
entity.update(cam)
if entity.alive is None:
self.entityList.remove(entity)
def drawLevel(self, camera):
try:
for y in range(0, 15):
for x in range(0 - int(camera.pos.x + 1), 20 - int(camera.pos.x - 1)):
if self.level[y][x].sprite is not None:
if self.level[y][x].sprite.redrawBackground:
self.screen.blit(
self.sprites.spriteCollection.get("sky").image,
((x + camera.pos.x) * 32, y * 32),
)
self.level[y][x].sprite.drawSprite(
x + camera.pos.x, y, self.screen
)
self.updateEntities(camera)
except IndexError:
return
def addCloudSprite(self, x, y):
try:
for yOff in range(0, 2):
for xOff in range(0, 3):
self.level[y + yOff][x + xOff] = Tile(
self.sprites.spriteCollection.get("cloud{}_{}".format(yOff + 1, xOff + 1)), None, )
except IndexError:
return
def addPipeSprite(self, x, y, length=2):
try:
# add pipe head
self.level[y][x] = Tile(
self.sprites.spriteCollection.get("pipeL"),
pygame.Rect(x * 32, y * 32, 32, 32),
)
self.level[y][x + 1] = Tile(
self.sprites.spriteCollection.get("pipeR"),
pygame.Rect((x + 1) * 32, y * 32, 32, 32),
)
# add pipe body
for i in range(1, length + 20):
self.level[y + i][x] = Tile(
self.sprites.spriteCollection.get("pipe2L"),
pygame.Rect(x * 32, (y + i) * 32, 32, 32),
)
self.level[y + i][x + 1] = Tile(
self.sprites.spriteCollection.get("pipe2R"),
pygame.Rect((x + 1) * 32, (y + i) * 32, 32, 32),
)
except IndexError:
return
def addBushSprite(self, x, y):
try:
self.level[y][x] = Tile(self.sprites.spriteCollection.get("bush_1"), None)
self.level[y][x + 1] = Tile(
self.sprites.spriteCollection.get("bush_2"), None
)
self.level[y][x + 2] = Tile(
self.sprites.spriteCollection.get("bush_3"), None
)
except IndexError:
return
def addCoinBox(self, x, y):
self.level[y][x] = Tile(None, pygame.Rect(x * 32, y * 32 - 1, 32, 32))
self.entityList.append(
CoinBox(
self.screen,
self.sprites.spriteCollection,
x,
y,
self.sound,
self.dashboard,
)
)
def addRandomBox(self, x, y, item):
self.level[y][x] = Tile(None, pygame.Rect(x * 32, y * 32 - 1, 32, 32))
self.entityList.append(
RandomBox(
self.screen,
self.sprites.spriteCollection,
x,
y,
item,
self.sound,
self.dashboard,
self
)
)
def addCoin(self, x, y):
self.entityList.append(Coin(self.screen, self.sprites.spriteCollection, x, y))
def addCoinBrick(self, x, y):
self.level[y][x] = Tile(None, pygame.Rect(x * 32, y * 32 - 1, 32, 32))
self.entityList.append(
CoinBrick(
self.screen,
self.sprites.spriteCollection,
x,
y,
self.sound,
self.dashboard
)
)
def addGoomba(self, x, y):
print("Adding Goomba at x:{} y:{}".format(x, y))
self.entityList.append(
Goomba(self.screen, self.sprites.spriteCollection, x, y, self, self.sound)
)
def addKoopa(self, x, y):
self.entityList.append(
Koopa(self.screen, self.sprites.spriteCollection, x, y, self, self.sound)
)
def addRedMushroom(self, x, y):
self.entityList.append(
RedMushroom(self.screen, self.sprites.spriteCollection, x, y, self, self.sound)
)