Python从零模仿我的世界(四)

编写方块类

现在我们继续来编写方块类:

# 这个类是用来填充 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表示不可打破

那么我们这一次的代码就讲完了,如果有不懂的地方欢迎大家留言评论,必回。各位点个赞吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值