feat(sim): tile grid and static entity base
This commit is contained in:
1 parent
990fd2dd0e
commit
bf2ab194e4
2 files changed
+155
No files matched your search
@@ -0,0 +1,58 @@
|
||||
import itertools
|
||||
|
||||
from .geometry import Aabb
|
||||
|
||||
_idCounter = itertools.count(1)
|
||||
|
||||
|
||||
class Actor:
|
||||
def __init__(self, x, y, w, h):
|
||||
self.id = next(_idCounter)
|
||||
self.x = float(x)
|
||||
self.y = float(y)
|
||||
self.w = float(w)
|
||||
self.h = float(h)
|
||||
self.vx = 0.0
|
||||
self.vy = 0.0
|
||||
self.facing = 1
|
||||
self.onGround = False
|
||||
self.onCeiling = False
|
||||
self.onWallLeft = False
|
||||
self.onWallRight = False
|
||||
self.groundPlatform = None
|
||||
self.alive = True
|
||||
self.removed = False
|
||||
|
||||
@property
|
||||
def aabb(self):
|
||||
return Aabb(self.x, self.y, self.w, self.h)
|
||||
|
||||
@property
|
||||
def centerX(self):
|
||||
return self.x + self.w * 0.5
|
||||
|
||||
@property
|
||||
def centerY(self):
|
||||
return self.y + self.h * 0.5
|
||||
|
||||
@property
|
||||
def left(self):
|
||||
return self.x
|
||||
|
||||
@property
|
||||
def right(self):
|
||||
return self.x + self.w
|
||||
|
||||
@property
|
||||
def top(self):
|
||||
return self.y
|
||||
|
||||
@property
|
||||
def bottom(self):
|
||||
return self.y + self.h
|
||||
|
||||
def hurtBox(self):
|
||||
return self.aabb
|
||||
|
||||
def kill(self):
|
||||
self.alive = False
|
||||
@@ -0,0 +1,97 @@
|
||||
AIR = "air"
|
||||
|
||||
|
||||
class TileDef:
|
||||
__slots__ = ("name", "solid", "oneWay", "hazard", "ladder", "slope", "damage")
|
||||
|
||||
def __init__(self, name, solid=False, oneWay=False, hazard=False, ladder=False, slope=None, damage=0):
|
||||
self.name = name
|
||||
self.solid = solid
|
||||
self.oneWay = oneWay
|
||||
self.hazard = hazard
|
||||
self.ladder = ladder
|
||||
self.slope = slope
|
||||
self.damage = damage
|
||||
|
||||
|
||||
tileRegistry = {
|
||||
AIR: TileDef(AIR),
|
||||
"ground": TileDef("ground", solid=True),
|
||||
"brick": TileDef("brick", solid=True),
|
||||
"stone": TileDef("stone", solid=True),
|
||||
"dirt": TileDef("dirt", solid=True),
|
||||
"platform": TileDef("platform", oneWay=True),
|
||||
"woodOneWay": TileDef("woodOneWay", oneWay=True),
|
||||
"spike": TileDef("spike", hazard=True, damage=2),
|
||||
"lava": TileDef("lava", hazard=True, damage=3),
|
||||
"ladder": TileDef("ladder", ladder=True),
|
||||
"ladderTop": TileDef("ladderTop", ladder=True, oneWay=True),
|
||||
"slopeRight": TileDef("slopeRight", slope="ascendRight"),
|
||||
"slopeLeft": TileDef("slopeLeft", slope="ascendLeft"),
|
||||
"pipeTL": TileDef("pipeTL", solid=True),
|
||||
"pipeTR": TileDef("pipeTR", solid=True),
|
||||
"pipeBL": TileDef("pipeBL", solid=True),
|
||||
"pipeBR": TileDef("pipeBR", solid=True),
|
||||
}
|
||||
|
||||
|
||||
asciiToTile = {
|
||||
"X": "ground",
|
||||
"#": "brick",
|
||||
"S": "stone",
|
||||
"D": "dirt",
|
||||
"=": "platform",
|
||||
"-": "woodOneWay",
|
||||
"^": "spike",
|
||||
"~": "lava",
|
||||
"H": "ladder",
|
||||
"T": "ladderTop",
|
||||
"/": "slopeRight",
|
||||
"\\": "slopeLeft",
|
||||
"L": "pipeTL",
|
||||
"R": "pipeTR",
|
||||
"l": "pipeBL",
|
||||
"r": "pipeBR",
|
||||
}
|
||||
|
||||
tileToAscii = {value: key for key, value in asciiToTile.items()}
|
||||
|
||||
|
||||
asciiEntities = {
|
||||
"p": "playerSpawn",
|
||||
"g": "goomba",
|
||||
"c": "chaser",
|
||||
"f": "flyer",
|
||||
"s": "shooter",
|
||||
"o": "coin",
|
||||
"G": "gem",
|
||||
"k": "key",
|
||||
"v": "heart",
|
||||
"@": "checkpoint",
|
||||
"E": "exit",
|
||||
}
|
||||
|
||||
|
||||
def tileDef(name):
|
||||
return tileRegistry.get(name, tileRegistry[AIR])
|
||||
|
||||
|
||||
def isSolidName(name):
|
||||
return tileRegistry[name].solid if name in tileRegistry else False
|
||||
|
||||
|
||||
def isOneWayName(name):
|
||||
return tileRegistry[name].oneWay if name in tileRegistry else False
|
||||
|
||||
|
||||
def isHazardName(name):
|
||||
return tileRegistry[name].hazard if name in tileRegistry else False
|
||||
|
||||
|
||||
def isLadderName(name):
|
||||
return tileRegistry[name].ladder if name in tileRegistry else False
|
||||
|
||||
|
||||
def slopeKind(name):
|
||||
definition = tileRegistry.get(name)
|
||||
return definition.slope if definition else None
|
||||
Reference in new issue
Block a user