显示
虽说我们的游戏终于再一次能运行了吧……但是这这这不是和第一篇代码的效果一样吗?啊千万别急,我们还没有显示呢。
初始化方块
在正式显示之前我们先做亿点点准备工作。怎么又是这个?
我们在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*系列函数设置颜色,否则会出现很奇怪的效果(你永远不知道前一次操作把颜色设成了什么)。
好啦我们这篇文章就讲到这里了。你的一个点赞就是我创作最大的动力哦~
本文介绍了如何在Python中初始化和渲染方块,以创建类似我的世界的游戏场景。首先,通过修改初始坐标防止角色掉落。然后,利用Pygame的事件处理功能,特别是`draw`事件,来实现方块的显示。记得在渲染前要设置颜色,以避免奇怪的效果。
590

被折叠的 条评论
为什么被折叠?



