最近很火的一个拼图游戏,老板让我用Cocos3.8做一个...

引言

哈喽大家好,我是亿元程序员,最近有小伙伴求助笔者:

亿哥,是这样的,最近不是有一个比较火的拼图游戏吗?

很多直播间都在播这款游戏,老板看到后,让我用Cocos3.8做一个…

这个拼图游戏,看似简单,实际上好像也不难,但是我不知道怎么下手,可以帮忙分析一下怎么实现吗?

好巧不巧,笔者也看到了这款游戏,正准备蹭下热点,并且加入到我的小游戏合集当中去。

言归正传,本期带大家一起来看看,如何在Cocos游戏开发中,实现一个目前很火的拼图游戏

本文源工程可在文末获取,小伙伴们自行前往。

什么是拼图游戏?

拼图游戏是一种将碎片化的组件拼接成完整图案的益智类游戏,核心玩法是让玩家通过观察、推理和动手操作,把打乱的零散拼块组合成预设的目标图像。

玩过拼图游戏的小伙伴都知道,游戏的过程是把散的图还原成一幅完整的图片。

但是,在开发这款游戏的第一步,我们需要把一幅完整的图片打散。

打散图片

看到这里,有小伙伴可能就跃跃欲试:

打散图片这个我懂!让美术妹子按照比例等比切割出来,然后把散图丢给我就好了,嘿嘿!

美术妹子:“我谢谢你!”

这样操作也不是不行,但是大概率会被美术妹子吐槽一番。

因为很多时候,拼图的难度是由拼图的片数决定,图片输出时,并不能马上决定是拆成多少张,假如输出了3*3,结果策划觉得不合适又要改成4*4,这样美术妹子又得返工了,显然不合理。

于是,我们需要将完整的图片,在游戏中动态切割成指定数量的散图,这样才能减少美术的工作量。

动态纹理分割

拼图游戏中的动态纹理分割就是根据传入的纹理图片,按照指定的行列数动态切割并创建对应的拼图块。

在Cocos游戏开发中,通常可以通过以下几步:

1. 通过Rect根据纹理需要拆解的数量,计算并通过行列指定裁剪区域。
image
2. 创建SpriteFrame精灵帧,将纹理和裁剪区域赋值给它。
image
3. 将精灵帧赋值给Sprite
image

这样我们就成功将图片变成了拼图碎片,那怎么拼回去呢?

如何判断拼图完成

我们拼图拆分后,通常需要将碎片打散,打散前,我们需要记录拼图的正确顺序。

然后可以通过随机函数将拼图打散。

image

由于是随机打散,有可能打散后拼图已经差不多完成,导致游戏性降低。

因此我们可以通过随机多次并判断,直到拼图足够散,甚至我们可以通过配置去固定拼图的初试顺序,保证难度一致。

image

最后玩家通过拖拽拼图和指定拼图交换,直到所有拼图碎片都回到正确的位置之后,即可通关游戏。

既然如此简单,那这款游戏凭什么火?

与普通拼图不同的点

1. 拼图合并

当拼图局部拼正确时,会自动合并成一块整体,拖动时变成整体移动。

QQ202619-222147-HD

合并的逻辑也比较简单,当相邻的拼图(左右、上下)处在同一行或者同一列时,他们的行或者列相差1则可以进行合并。

合并只需要将合并的拼图块分成同一个组,表示已经合并。

image

移动的时候,根据组ID拿到所有的拼图块,移动的时候整体按照偏移移动即可。

2. 拼图整体交换

由于上面的合并规则,移动时可能不再是一换一,而是多换多,从而导致拼图被“挤走”替换。

整体交换的逻辑相对复杂一点,需要找到拼图被挤走后,填充到哪个空位。

核心代码如下:

3. 其他

除了上述玩法规则的创新以外,其实还有很多其他火的特点。

  • 游戏简单:拼图游戏适合下至3岁小孩、上至80老人都能很好的入手。
  • 反馈清晰:由于拼图自动合并成块的规则,玩家可以清晰地看到游戏的完成进度,吸引路人。
  • 适合直播:游戏可以开启数字角标模式,方便观众在直播间与主播互动。

结语

拼图游戏和箭头游戏一样,有着天生的直播体质,错过了箭头游戏的小伙伴,可以尝试一下拼图游戏这个赛道哦。

小伙伴们,如果老板让你这么做,你会怎么做?

本文实战完整源码已集成到亿元Cocos小游戏实战合集,内含体验链接。

11赞

大佬厉害啊!!!

我建议先开发切图工具(切图编辑器),通过工具(编辑器)分割好给到技术, 游戏渲染性能及代码可维护性会高一些

这个不需要编辑器,就一个shader

  1. 这个文档里没有shader
  2. 就算是shader也是有开销的,切好的图性能肯定是最优的

这个用shader没啥消耗,如果用切图做也太死板了

shader或者自定义assmble都可以

这个还没上圆角和内弯角呢,切图行不通的,美术会吐血,每一块就多少状态了

不就是算一个uv吗,没啥消耗的

直接uv分割就行了,不需要切图

store有一个格子拼图,做的非常好,我们买了后用gpt改成了C#,shader也对应的改了。上gp了。。

自定义形状拼图

:sob: 策划拼图游戏不按常理来,各种格子形状,没切图是设置目标图的显示区域,费力。

不知道是不是说的我发的那个?仙剑女主角图的?

应该可以有个最小单元格的

没 仿照unity的一个组件,自定义显示图片的部分区域

image

直接用mask组件不也一样

mask会打断合批,而且引擎mask是无法自定义想要的形状的

整个场景,就几个图块,又不是几百个。每个图块一个mask,自己组合就行

如果策划需要
1.底图 完整的背景图
2.中间层 黑色拼图块
3.上层 正常显示区域块
如果用mask dc会很大,你看我上面截图一共有4x4x6个块