Python从零模仿我的世界(十三)

本文介绍了如何在Python中初始化和渲染方块,以创建类似我的世界的游戏场景。首先,通过修改初始坐标防止角色掉落。然后,利用Pygame的事件处理功能,特别是`draw`事件,来实现方块的显示。记得在渲染前要设置颜色,以避免奇怪的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

显示

虽说我们的游戏终于再一次能运行了吧……但是这这这不是和第一篇代码的效果一样吗?啊千万别急,我们还没有显示呢。

初始化方块

在正式显示之前我们先做亿点点准备工作。怎么又是这个?
我们在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*系列函数设置颜色,否则会出现很奇怪的效果(你永远不知道前一次操作把颜色设成了什么)。

好啦我们这篇文章就讲到这里了。你的一个点赞就是我创作最大的动力哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值