窗口类
我们窗口类的雏形各位都还记得吗?不记得了的话赶快看看第二篇温习一下哦~
我们现在把这个窗口类改成这样:
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)
那么,这篇文章就讲的差不多了。这些属性各位可以结合注释再好好看一下。最后,点一个大大的赞吧~