显示
虽说我们的游戏终于再一次能运行了吧……但是这这这不是和第一篇代码的效果一样吗?啊千万别急,我们还没有显示呢。
初始化方块
在正式显示之前我们先做亿点点准备工作。怎么又是这个?
我们在Model
类中还留了一个方法呢,当时被写成pass
,忘记啦?看一眼第二篇吧。现在我们来重新编写一下这个函数:
class Model:
...
def init(self):
n = 64 # 世界的一半大小
for x in range(-n, n + 1):
for z in range(-n, n + 1):
# 先简单的创建一片草地出来吧
self.add_block((x, 3, z), 'grass_block')
self.add_block((x, 2, z), 'soil')
self.add_block((x, 1, z), 'soil')
self.add_block((x, 0, z), 'bedrock')
可是这时我们的坐标还是(0, 0, 0)
呢,如果这样的话是会掉下去的。为了让草地“接住”我们,我们来修改一下初始坐标:
class Window(...):
def __init__(self, ...):
...
self.position = (0, 5, 0) # 当前位置
这样就不会掉下去了。
渲染方块显示
pyglet
模块为我们提供了许许多多的事件,当发生这些事件时会首先调用我们定义的事件处理函数,比如处理鼠标按下的on_mouse_press
、处理键盘按下的on_key_press
等等。如果我们没有定义的话就会调用pyglet
默认的事件处理函数。绘图(draw)也是一种事件,对应的事件处理函数名称就是on_draw
。因为我们的Window
类继承了pyglet.window.Window
,所以我们把事件直接定义在类里面就行了(否则要使用类似@win.event
的装饰器写法)。更详细的文档可以参考这里。
来看看我们的on_draw
是怎么写的吧:
class Window(...):
...
def on_draw(self):
# 这一行代码是为了清理窗口缓存的,以免发生图像残留
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# clear 函数是继承自 pyglet.window.Window 的
# 是清除窗口的
self.clear()
# 这个函数我们下一篇文章再说
self.set_3d()
# == A ==
glColor3d(1, 1, 1)
self.model.batch.draw()
A:大家要注意,执行任何渲染显示操作之前一定要先调用glColor*
系列函数设置颜色,否则会出现很奇怪的效果(你永远不知道前一次操作把颜色设成了什么)。
好啦我们这篇文章就讲到这里了。你的一个点赞就是我创作最大的动力哦~