今天分享一下滚动背景的制作以及简单的碰撞检测,来源是书上的一个小例子,自己稍加改变以后提出出来分享一下,如图所示:
素材是一张宽2000像素的白云和一张2000像素的地面图片。一般的情况下,我们就是利用move的动作指令是图片缓缓移动,移动2000像素之后使用place动画让图片回到原位继续变化。但是在这个过程中你会发现有一段时间导致了背景图层出现了空缺,如图所示。
因此在这种情况下,我们需要截取图片最前面的几百个像素拼接在2000像素的大图后面,这样一来就不会出现背景空缺的情况了,代码如下:
auto node = ParallaxNode::create();
this->addChild(node);
auto action_0 = MoveBy::create(20.0, Point(-2000, 0));
auto action_1 = Place::create(Point::ZERO);
auto action_2 = Sequence::create(action_0, action_1, NULL);
auto action_3 = RepeatForever::create(action_2);
node->runAction(action_3);
auto spr_0 = Sprite::create("bg1.png");
spr_0->setAnchorPoint(Point::ZERO);
node->addChild(spr_0, 0, Point(1, 0), Point::ZERO);
auto spr_1 = Sprite::create("bg1.png", Rect(0, 0, 480, 320));
spr_1->setAnchorPoint(Point::ZERO);
node->addChild(spr_1, 0, Point(1, 0), Point(2000, 0));
还有一点要注意的是,如果是地面与天空两者同时在移动,那么一般我们会把两者的速度变得不同,这游戏画面才会更加真实美观,这样的话就要根据两者速度比例来设置图片的长短比例了。假如我设置天空的速度是地面的两倍,那么天空滚动2000像素就需要我们地面滚动4000像素,同样的也要在最后加上几百像素的画面填充以免出现空白。这样的话,就可以成功实现整个背景的滚动了。
接下来再讲一下怎么实现简单的碰撞检测,一般在开发游戏的时候,这个基本是在每一个游戏中必须使用的一点。
我用的是cocos2dx3.6版本的,可能有时候新旧版本语法不一。一般我们要先获取到你所要检测的两个碰撞的物体,可以通过tag值来获取,然后通过getBoundingBox的方法来获取到你的物体的范围大小,再通过intersectsRect来判断两者是否碰撞。
一般我们检测碰撞是要实时进行检测的,这就又要涉及到一个schedule的一个update实时检测更新碰撞的结果。Schedule是一个关于时间的一个类,简单地使用直接砍我的代码就好啦!下面贴代码!
先在初始化函数中调用update。
this->scheduleUpdate();
void Game::update(float delta)
{
if (this->getChildByTag(TAG_SPRITE_BLOCK) != NULL) {
Sprite *sprMan = (Sprite*)this->getChildByTag(TAG_SPRITE_MAN);
Sprite *sprBlock = (Sprite*)this->getChildByTag(TAG_SPRITE_BLOCK);
Rect rectMan = sprMan->getBoundingBox();
Rect rectBlock = sprBlock->getBoundingBox();
if (rectMan.intersectsRect(rectBlock)) {
Director::getInstance()->pause();
isStop = true;
}
}
}
当然这个小游戏里面还涉及到了一个touch的事件监听,来进行跳跃,下一次自己研究更深入一些之后再来分享。
可能我分享的很多也会有一些错误,如果大家看到不对的地方,也希望可以帮忙指出改正,共同进步!