程序作品(6)————平面开放世界游戏

来源 : 哔哩哔哩 时间:2023-03-12 18:03:39

4. 背包及掉落物

4.1 挖掘方块生成掉落物

在我的游戏中,玩家需要连续点击一个方块若干下以挖掘这个方块。这个功能非常好实现,只需要给表示方块的类中增加一个clickmark变量表示上一次点击的时间(时间的定义参考之前的文章),再增加一个clicktimes变量表示当前连点的次数即可。为了给每个方块赋予不同的硬度,我又新建了一个叫做obj_hardness的字典,用来将方块的名字和其硬度一一对应。


(相关资料图)

每点击一个方块一次,程序需要判断当前时间与该方块的clickmark的差值是否过大,如果过大,则将clicktimes的值改成一,否则将clicktimes的值加一(如果玩家拿着稿子的话,则根据稿子材质的不同适当增加每次加的值的大小)。如果某次点击后clicktimes的值大于该方块的硬度,则将该方块变成掉落物,并随机生成一个方块填补该方块的位置(并且如果玩家拿着稿子的话,给稿子的耐久值减少一点)。

那么该如何将一个方块变成掉落物呢?

我定义了一个表示掉落物的类,里面含有表示这个掉落物种类、数量、位置等信息的变量。然后又给存储每个区块的列表中新增一个子列表用来存储这个区块中的所有掉落物。这样一来一旦有新的掉落物生成,我们只需要往对应的区块的列表中塞一个表示掉落物的类的实例即可。

4.2 捡起掉落物

我在前面的文章里说过捡起掉落物需要很大的算力,现在我收回这句话。

在前面的文章中我之所以这么说是因为当时我对掉落物和玩家之间的距离的判断依然使用的是将掉落物一一遍历这样的低效方法。然而现在我采用的是上一篇文章中所讲到的区块算法。与判断子弹和生物之间的距离类似,由于同一个小区块里存在两个掉落物的概率非常少,因此判断捡起掉落物的时间复杂度基本上就是O(1)。

捡起掉落物后,我们要从该区块中删除这个掉落物的数据,并且将这个掉落物所代表的物体移到我们的背包里。

4.3 背包

为了存储背包,我定义了一个类用来表示背包的一个格子。这个类中包含了一个格子中物品的种类、数量、耐久度等信息(耐久度不是每个物品都需要用到,所以有时候可能会为None)。接下来我定义了一个叫做pack_list的列表,用来表示背包。列表分为五行九列(最后一行有十列),前四行用来存储背包中的物品,最后一行用来控制合成。每个列表的元素都是一个表示背包格子的类的实例。

4.3.1 移动背包内的物品

为了移动背包里的物品,我们首先要把用户在屏幕上点击的坐标信息转换成所对应的背包的具体格子(即映射)。截至目前为止,我的游戏中的背包看起来是这样的:

可以看到,整个背包由下面四行的存储区和上面十格的合成区组成。下面四行的映射工作非常简单,只需要将用户点击的坐标减去左下角格子的左下角顶点的坐标,再除以每个格子的边长后取整即可。但是上面的合成区的映射就相对来说有一点难度。

为此,我定义了一个叫做yingshe()的函数,专门用来做合成区的映射工作。以用户点击的x、y坐标作为参数,yingshe()函数判断这个坐标是否在合成区的范围内,如果是,则返回映射结果,否则返回None。

将这样的复杂判断定义成一个函数不仅有助于简化我的程序,使其变得更加易读,而且由于合成区的方块移动规则和存储区有一点不一样,这样做还可以帮助我在后面的代码中判断用户点击在合成区还是存储区。

在对用户的点击坐标做好映射之后,我们只需要记录用户第奇数次点击背包的坐标,再在用户第偶数次点击背包的时候将这两个坐标所对应的方格中的方块互换即可。

此外,我也增加了对半分功能。如果用户第偶数次点击是用的右键且所点击的方格中没有方块,那么就将上一次点击的方格中的方块分一半出来放到这次点击的方块中。

4.3.2 合成

合成是使我的世界这款游戏变得更加开放的元素之一。利用合成这一功能,玩家可以使用已采集的方块在背包的合成区内合成新的方块。那么这一功能是怎么实现的呢?

首先,为了方便我们之后的讲解,我们来给合成区的十个格子命名一下。合成区中组成3*3的矩阵的那九个格子我将其命名为输入区,而单独的那一个格子我将其命名为输出区。

在合成的过程中,玩家需要按照合成配方在输入区放入特定数量的方块,并且从输出区拿走合成的方块。在拿走合成的方块的同时,方式在输入区的方块的数量应当按照合成配方减少。此外,为了防止合成的时候方块被“吞掉”,我们规定玩家不能向输出区中放置方块。

现在的问题就是如何判断玩家放置在输入区内的方块能否合成某种物品呢?写特别多的if是不可取的,因为这么做不仅会降低代码的可读性和可扩展性,也会增加程序的时间复杂度。我选择将所有的合成配方都存储在一个列表中,然后在每次玩家向输入区中放置方块之后检查输入区是否满足列表中的某一个合成配方。如果有满足,则将这个合成配方所对应的合成物生成在输出区中(注意此时不应减少输入区中的方块,以便给玩家反悔的机会)。一旦玩家取走输出区的方块,则相应减少输出区中的物品数量。

截止到目前,我所做出的合成配方包括木板、木棍、稿子、弓箭等,其中稿子和弓箭等道具也可以发挥它们的用处(稿子可以加快挖掘速度,弓箭可以射从小白那里捡来的箭)

后期改进将在下一期公示

注:

我已经将这个项目的源代码和exe文件上传到百度网盘中,点击“阅读原文”即可下载

链接:https://pan.baidu.com/s/1uSC3Xkf54w_iMkbIBzBK_Q?pwd=4l84

提取码:4l84

从网页版bilibili复制的链接会自动加上出处和作者,粘贴在搜索栏中时记得删除出处和作者,否则会提示链接无效

X 关闭

  • 热门推荐

备案号:豫ICP备20009784号-11

邮箱:85 18 07 48 3@qq.com

版权所有 全球休闲网所有