Spaces:
Sleeping
Sleeping
File size: 8,032 Bytes
e53fda1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
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)
)
|