
Python从零模仿我的世界
主要使用python语言努力复刻一个“我的世界”游戏出来。
Cosmicland
这个作者很懒,什么都没留下…
展开
-
Python从零模仿我的世界(十六)番外篇
修改游戏代码这篇文章既然是一片“番外篇”,那我们就偏离一点主线,来讲一下如何修改游戏代码。首先重温一下Settings类:class Settings: ticks_per_sec = 60 # 每秒刷新的次数 sector_size = 16 # 区块的大小 walking_speed = 5.0 # 走路的速度 gravity = 20.0 # 重力的大小 max_jump_height = 1.0 # 跳跃的高度 jump_speed = math.原创 2022-04-28 08:56:36 · 2229 阅读 · 0 评论 -
Python从零模仿我的世界(十五)
自由移动大家发现是什么问题了吗?没错!就是在旋转的时候鼠标在窗口上面晃来晃去的(也许还碍手碍脚的?),更糟的是只有当鼠标在窗口上方的时候才会捕获到鼠标移动事件,一旦不小心移到了外面窗口就不动了,真是烦人!有什么方法能解决这个问题呢?解决方案 1有的有的,有一个叫set_exclusive_mouse函数可以捕获到鼠标焦点,从而做到这一点,让我们来修改一下代码:...if __name__ == '__main__': ... win.set_exclusive_mouse(True原创 2022-04-27 16:38:00 · 649 阅读 · 0 评论 -
Python从零模仿我的世界(十四)
显示这篇文章我们来讲set3d函数和它的“近亲”set2d函数。它们长成这个样子:class Window(...): ... def set_2d(self): # get_size 函数是继承来的 width, height = self.get_size() glDisable(GL_DEPTH_TEST) # get_viewport_size 函数也是继承来的 viewport = self.get原创 2022-04-27 15:56:03 · 573 阅读 · 0 评论 -
Python从零模仿我的世界(十三)
显示虽说我们的游戏终于再一次能运行了吧……但是这这这不是和第一篇代码的效果一样吗?啊千万别急,我们还没有显示呢。初始化方块在正式显示之前我们先做亿点点准备工作。怎么又是这个?我们在Model类中还留了一个方法呢,当时被写成pass,忘记啦?看一眼第二篇吧。现在我们来重新编写一下这个函数:class Model: ... def init(self): n = 64 # 世界的一半大小 for x in range(-n, n + 1):原创 2022-04-27 15:10:49 · 2091 阅读 · 0 评论 -
Python从零模仿我的世界(十二)
到现在为止我们的游戏还是不能运行的,因为还缺了一个函数呢。没错!就是Model.change_sectors!完善模型类上代码:class Model: ... # 这个函数是用来在玩家走动的时候切换区块的 # 只有和玩家的距离小于等于 pad 的区块才会显示 def change_sectors(self, before, after): # 创建空集合 # 直接使用 {} 的话创建的是空字典哦 before_set =原创 2022-04-27 14:02:24 · 1588 阅读 · 0 评论 -
Python从零模仿我的世界(十一)
窗口类这篇文章我们来看两个和3维矢量(vector3)有关的函数。由于我们的游戏是3维的,所以当我提到“矢量”时没有特殊说明都指的是“3维矢量”。先来围观代码:class Window(...): ... def get_sight_vector(self): # rotation 是画面旋转的角度,等我们讲到鼠标移动时再说 x, y = self.rotation # 这里是一些算法,看看就行了 # 感兴趣的可以评论区讨论原创 2022-04-27 13:14:11 · 502 阅读 · 0 评论 -
Python从零模仿我的世界(十)
窗口类这篇文章我们来讲讲_update_world函数,先上代码:class Window(...): ... def _update_world(self, dt): # 得到当前的速度 speed = Settings.walking_speed # == A == d = dt * speed # 获取移动的3维矢量(vector3) # 一个3维矢量是 x y z 坐标都位于-1到1之原创 2022-04-27 08:55:36 · 638 阅读 · 0 评论 -
Python从零模仿我的世界(九)
窗口类我们窗口类的雏形各位都还记得吗?不记得了的话赶快看看第二篇温习一下哦~我们现在把这个窗口类改成这样:class Window(pyglet.window.Window): def __init__(self, *args, **kwargs): pyglet.window.Window.__init__(self, *args, **kwargs) # 是否捕获了鼠标 self.exclusive = False # 一原创 2022-04-26 16:18:10 · 473 阅读 · 0 评论 -
Python从零模仿我的世界(八)
模型类现在我们来实现_show_block和_hide_block函数:class Model: ... def _show_block(self, position, block, real=True): x, y, z = position # 得到立方体的坐标 vertex_data = cube_vertices(x, y, z, 0.5) # == A == self._shown[position原创 2022-04-26 15:59:01 · 579 阅读 · 0 评论 -
Python从零模仿我的世界(七)
模型类现在我们来编写用于删除方块的remove_block函数: def remove_block(self, position, immediate=True): # 删除在 world 字典中的值(也就是删除了这个方块) del self.world[position] self.sectors[sectorize(position)].remove(position) if immediate: # 如果原创 2022-04-26 15:31:34 · 763 阅读 · 0 评论 -
Python从零模仿我的世界(六)
模型类现在我来详细讲讲check_neighbours函数。这个函数长这个样子:class Model: ... def check_neighbours(self, position): x, y, z = position # 依次检测上下前后左右的方块是否需要显示 for dx, dy, dz in Settings.faces: key = (x + dx, y + dy, z + dz)原创 2022-04-26 14:30:23 · 480 阅读 · 0 评论 -
Python从零模仿我的世界(五)
模型类初始化有了方块类,我们现在终于可以添加方块了。添加方块现在我们来编写添加方块的代码:class Model: ... def add_block(self, position, block, immediate=True): # 如果该位置已经存在了方块那么先删除原方块,用新的方块替代它 if position in self.world: self.remove_block(position, immediate, r原创 2022-04-26 14:00:16 · 510 阅读 · 0 评论 -
Python从零模仿我的世界(四)
编写方块类现在我们继续来编写方块类:# 这个类是用来填充 world 字典的值的class BlockData: __slots__ = ['model', 'position', 'name', 'init', 'update'] # 这是为了压缩内存空间以及提高访问速度 def __init__(self, model, x, y, z, name, init, update): self.model = model self.position =原创 2022-04-26 11:02:50 · 667 阅读 · 0 评论 -
Python从零模仿我的世界(三)
模型类编写模型类现在我们来正式编写这个模型类。首先导入pyglet中OpenGL 到函数以及deque队列。from pyglet.gl import *from collections import deque然后是模型类的主体:class Model: def __init__(self): self.batch = pyglet.graphics.Batch() # 一个可以对图形进行统一处理的类,简化我们的工作 self.world = {}原创 2022-04-26 10:44:59 · 547 阅读 · 0 评论 -
Python从零模仿我的世界(二)
编写设置一个游戏里的设置是必不可少的,所以我们要先来编写 母体 的一些设置。首先导入math库。import math然后编写游戏中的数据(大家可以根据自己的喜好更改哦)class Settings: ticks_per_sec = 60 # 每秒刷新的次数 sector_size = 16 # 区块的大小 walking_speed = 5.0 # 走路的速度 gravity = 20.0 # 重力的大小 max_jump_height = 1.0 # 跳原创 2022-04-26 09:49:35 · 844 阅读 · 0 评论 -
Python从零模仿我的世界(一)
我一直很喜欢玩我的世界,不知道有没有人和我一样好奇我的世界到底是如何实现的 直到我看到了Mojang的代码那么,现在,我们就一起来模仿一下我的世界!国外有一个叫做fogleman的人就曾经写过一个简单版的“我的世界”,我们会以这个项目作为模版:链接环境搭建这里默认你的机器里有python环境,并且安装了pip。我们会使用pyglet这个第三方库进行开发。pip install pyglet我们再给这个项目起一个名字吧!引用电影《黑客帝国》里面的梗,就起名叫做“母体”吧,英文叫做"Matrix原创 2022-04-26 09:11:24 · 881 阅读 · 0 评论