编写方块类
现在我们继续来编写方块类:
# 这个类是用来填充 world 字典的值的
class BlockData:
__slots__ = ['model', 'position', 'name', 'init', 'update'] # 这是为了压缩内存空间以及提高访问速度
def __init__(self, model, x, y, z, name, init, update):
self.model = model
self.position = (x, y, z)
self.name = name
self.init = init # 这个函数和 update 函数都是为了以后刷新方块状态的(比如草方块蔓延)
self.update = update
if self.init is not None:
interval = self.init(self)
if interval:
pyglet.clock.schedule_interval(self._update, interval)
def _update(self, dt):
pass
class Block:
def __init__(self, name, chname, images, hardness, drop):
self.name = name # 方块的命名
self.chname = chname # 方块的中文名称
self.hardness = hardness # 方块的硬度
self.drop = drop # 掉落物
self.images = images # top bottom left right front back
# 在这里处理方块表面的贴图
image = pyglet.image.Texture.create(1024, 1024)
for x in range(3):
for y in range(2):
image.blit_into(textures[images[x * 2 + y]], x * 256, y * 256, 0)
self.textures = pyglet.graphics.TextureGroup(image)
def __call__(self, model, x, y, z):
# 这是创建方块时调用的
data = blockdatas[self.name]
return BlockData(model, x, y, z, self.name, data[0], data[1])
这样我们定义就可以使用Block
这个类了。不过这个类要传入的参数也太多了,而且以后还会增长!嗯,像我这么懒的人看来要写一个函数来帮我们定义方块:
def make_block(name, chname, init, update, textures, hardness=100, drop=None):
# 这里自动填充掉落物
if drop is None:
drop = (name, 1)
blocks[name] = Block(name, chname, textures, hardness, drop)
blockdatas[name] = (init, update)
blocks = {}
blockdatas = {}
这样我们就可以调用make_block
函数了,感受一下这个函数是怎么调用的吧:
make_block('soil', '泥土', None, None, ['soil'] * 6)
make_block('grass_block', '草方块', None, None, ['grass', 'soil', 'halfgrass', 'halfgrass', 'halfgrass', 'halfgrass'], drop=('soil', 1))
make_block('bedrock', '基岩', None, None, ['bedrock'] * 6, -1) # 硬度为-1表示不可打破
那么我们这一次的代码就讲完了,如果有不懂的地方欢迎大家留言评论,必回。各位点个赞吧~