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

窗口类

我们窗口类的雏形各位都还记得吗?不记得了的话赶快看看第二篇温习一下哦~
我们现在把这个窗口类改成这样:

class Window(pyglet.window.Window):
    def __init__(self, *args, **kwargs):
        pyglet.window.Window.__init__(self, *args, **kwargs)

        # 是否捕获了鼠标
        self.exclusive = False

        # 一些和位置有关的信息
        self.strafe = [0, 0]  # 当前的移动状态
        self.position = (0, 0, 0)  # 当前位置
        self.rotation = (0, 0)  # 当前旋转的角度
        self.sector = None  # 当前所在的区块
        # 这个 sector 属性被设置为 None,而且一定要设置为 None,为什么不能设置为 (0, 0, 0) 呢?
        # 我们讲到 update 时再说

        # 当前在 y 坐标上移动的速度(受跳跃和重力影响)
        self.dy = 0

        self.model = Model()

        pyglet.clock.schedule_interval(self.update, 1.0 / Settings.ticks_per_sec)

pyglet.clock可以参考这里
这里都只是一些属性的初始化,我们要关注的函数在这里:

class Window(...):
    ...
    def update(self, dt):
        sector = sectorize(self.position)
        if sector != self.sector:
            self.model.change_sectors(self.sector, sector)
            # 如果 sector 的值是 None,就表示模型还没有初始化好
            # 因此调用 model.process_entire_queue 来一次性执行所有操作
            # 忘记了?快看看第七篇!
            if self.sector is None:
                self.model.process_entire_queue()
            self.sector = sector

        m = 8
        dt = min(dt, 0.2)
        for _ in range(m):
            # 坐标的移动在 _update_world 里实现
            # 为什么要传入 dt / m 嘛,我们讲到 _upate_world 时再说
            self._update_world(dt / m)

那么,这篇文章就讲的差不多了。这些属性各位可以结合注释再好好看一下。最后,点一个大大的赞吧~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值