simple map and graphics logic

This commit is contained in:
randomuser 2022-04-27 17:58:19 -05:00
parent 444f621aa0
commit 413a3a19ca
4 changed files with 139 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
__pycache__/*

88
map.py Normal file
View File

@ -0,0 +1,88 @@
class TextureParsingError(BaseException):
pass
class Texture:
def __init__(self, ttype, reference, name):
self.ttype = ttype
self.tref = reference
self.name = name
if ttype == "char":
self.texture = [reference]
self.loaded = True
self.dims = [1, 1]
elif ttype == "mchar":
self.loaded = False
self.texture = None
self.dims = None
# lazy load with Texture().load()
def load(self):
if self.loaded:
return
try:
with open("textures/" + self.tref + ".texture") as fd:
self.texture = [i.rstrip() for i in fd.readlines()]
except FileNotFoundError:
raise TextureParsingError("error parsing " + self.tref)
# check if texture is 'jagged', e.g.
# there are multiple line lengths
j = None
for i in self.texture:
if not j:
j = len(i)
elif len(i) != j:
self.loaded = False
raise TextureParsingError("error parsing " + self.tref)
# provide dimensions (j is still in scope)
self.dims = [len(self.texture), j]
self.loaded = True
class TileError(BaseException):
pass
class Tile:
def __init__(self, pos, ttype):
self.x = pos[0]
self.y = pos[1]
self.ttype = ttype
self.textures = {}
self.dims = None
self.animation = 0
def getCoords(self):
return [self.x, self.y]
def addTexture(self, texture):
# check if texture is consistent
# with other textures' dimensions
if not self.dims:
self.dims = texture.dims
else:
if not self.dims == texture.dims:
raise TileError("texture dimensions are not consistent")
self.textures[texture.name] = texture
def update(self, tiles):
"""
This method is designed to be replaced.
This method should be called exactly once
for each rendered frame, regardless if it is
visible.
"""
pass
def render(self):
"""
This method is designed to be replaced.
This method should be called on every frame
this Tile is visible.
"""
try:
return self.textures[0]
except IndexError:
raise TileError("no textures to render!")
def use(self):
""" This method is designed to be replaced. """
pass

47
render.py Normal file
View File

@ -0,0 +1,47 @@
class RendererLoopBreak(BaseException):
pass
class Renderer:
"""
Class responsible for updating tiles, their states, animations, etc.
In the future, also takes in a WaterLayer and updates it with the game map.
"""
def __init__(self):
self.tiles = []
# location of the top left corner of the viewpoint
self.pos = [0, 0]
self.viewport = [80, 24]
def addTile(self, tile):
self.tiles.append(tile)
def massUpdate(self):
for i in self.tiles:
if i.ttype == "standard":
i.update(self.tiles)
def selectForRendering(self):
"""
Returns what tiles are in the viewport.
"""
tilesInScene = []
for i in self.tiles:
dims = i.dims
pos = i.getCoords()
try:
for j in range(dims[0]):
for k in range(dims[1]):
if self.inViewport([pos[0] + j, pos[1] + k]):
tilesInScene.append(i)
raise RendererLoopBreak
except RendererLoopBreak:
pass
self.cachedTiles = tilesInScene
return tilesInScene

3
textures/simple.texture Normal file
View File

@ -0,0 +1,3 @@
-+-
|X|
+-+