天天看点

Cocos2d-x3.0游戏实例之《别救我》第三篇——循环滚动背景

好,这篇我们来讲解无限循环滚动背景,这个知识已经被讲到烂了,我以前的文章也介绍过,所以就不那么详细地说明了。

笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: 文章来源:

用循环滚动背景,其实是因为我想偷懒,因为这样我只需要准备一张图片就可以了。

我们最终要创建这样的背景,如图:

背景是在滚动的,大家有没有看到?(小若:看你妹,这是jpg,不是gif)

大家是不是很在意下面的那多出来的一条锯齿?它可不是坐标错位了,这是一个伏笔(还伏笔,你以为写小说啊!)。

本篇教程会用到的图片资源到这里下载:  访问密码 8c82

要实现循环滚动的背景,需要2张相同的图片实现,图片首尾相接。

我们要创建一个新的类,叫做backgroundlayer,用来实现滚动背景。

创建2张相同的背景图片,很简单,代码如下:

m_bg1是屏幕居中,m_bg2要紧接着m_bg1的下面,大家感受一下。

先跑一下题,我们把边缘锯齿也给添加好:

createborder是自定义函数,代码如下:

然后调用了setdynamic函数,让刚体成为静态物体,也就是说,物理世界不会对它起产生影响了,它不会被撞飞,随你怎么撞,它都纹丝不动~

但是,它会对其他物理对象产生影响,比如有人撞了它,那个人就可能会反弹~

接着,有三个很特别的函数:setcategorybitmask、setcollisionbitmask、setcontacttestbitmask。

这三个函数是用于物体间的碰撞检测的,用来作为判断条件,要解释它们需要不小的篇幅,所以我就不解释了(小若:有没有墙?我想撞一下)。

本游戏在碰撞检测方面极其简单,所以不理解这三个函数都完全没有影响,因为游戏里的所有对象都能产生碰撞,没有什么特别的地方。

如果以后有机会,我再单独写一篇文章来介绍吧(或者大家百度一下)

好,来看看目前为止backgroundlayer的代码,头文件如下:

我们来先测试一下代码的运行情况吧,我们给tollgatescene添加backgroundlayer层,修改一下tollgatescene的scene函数:

ok,这样就可以了,再次运行代码,正常情况下,如图所示:

(小若:这就是一开始的那张图吧?连图片地址都一样好吧)

现在地图是不会滚动的,没意思,我们来开始滚床单…不,不好意思,习惯了(邪恶),是滚动背景才对。

地图滚动,其实就是不断改变2张地图的坐标,要不断改变坐标,就要用schedule来实现,schedule可以在游戏每一帧或者每隔一段时间的时候执行一次逻辑,这个如果不了解的,可以看看我的另外几篇关于schedule的文章:

木头我有一个坏习惯,那就是把游戏中所有的逻辑都用一个schedule来完成,这么说有点模糊,直接看代码吧。

首先给tollgatescene添加一个logic函数:

以及我偷偷添加了一个backgroundlayer成员变量,大有用处,不要着急~

然后修改一下tollgatescene的scene函数:

留意最后一句代码(小若:是倒数第二句!),好吧,倒数第二句,我们保留了backgroundlayer的引用。也许这样保持引用是比较糟糕的做法,或许用getchildbytag的方式来获取backgroundlayer会好一些,但因为这对象要使用很多次,我选择了直接保存引用。大家根据个人喜好来决定吧~

ok,最重要的,看看tollgatescene的logic函数实现,有点复杂,大家要有心理准备:

(小若:= =哇,好复杂啊,完全看不懂….(蛇精病))

我想,大家已经理解我之前说的,统一控制逻辑的意思了吧?由tollgatescene场景来调用各个层的logic函数,这样很方便,要停止逻辑的时候,只要由tollgatescene控制一下就可以了,不需要对各个层单独地进行控制。

ok,别忘了,在tollgatescene的init函数加上schedule的调用:

好了,我们还得为backgroundlayer添加一个logic逻辑处理函数,头文件添加函数声明:

backgroundlayer的logic函数实现如下,这个就真的有点小复杂了:

原理我就不解释了,大家看看代码注释,然后自己在纸上画一画,很好理解的。反正目的就是让两张背景不断往上移动,一旦图片完全离开屏幕,就让它回到屏幕下方,然后又继续往上移动。

好了,现在运行游戏,就能看到背景在滚动了~

ok,下一篇我们就正式加入主角了。

继续阅读