Cocos2d-x学习(九):cocos2d-x 无限背景滚动

Cocos实例1:实现平面游戏中的滚动地图 2D游戏中的滚动背景 阅读详情

最近在学习飞行射击类游戏的一些开发,学到的东西确实不少,比如,无限背景滚动,子弹的缓冲池,面向组件开发等等!

今天就来总结一下无限背景滚动的实现!

飞行类的游戏都是基于背景的滚动,造成视觉上的假象,认为飞机在飞行,而不是“真正的向前飞”。。。


1.原理

滚动的原理:设定一个速度,在每次调用update(ccTime dt) 时,就根据速度和dt得到移动的偏移量,因为更新频率很快,所以偏移量很小,所以在视觉上认为是连贯的!就形成了滚动效果。

无限滚动的原理:有两个背景,每次调用update(ccTime dt) 时,判断当前这两个背景,如果在屏幕之外了,说明它不在起到显示作用,于是将它放到后面去,其实就像是两条腿走路,一前一后,循环,就向前运动起来了,也就是说只需要两个背景,一张贴在一张后面!(我采用的算法比较懒,就是会对两个背景分别判断位置,而不是记录哪个背景在前,哪个背景在后)!


2.代码实现

这里用了两个景层,一个近景,一个远景,这样看起来效果更逼真!(资源来源于cocos2d-x-html版的飞行demo

远景用了一个图片精灵,近景用了一个tmx地图

定义了一个背景标签,用来标记是近景还是远景,如果只有一层就可以忽略

// 背景标签
enum TAG_BG
{
    TAG_BG_NEAR_LAYER = 0,
    TAG_BG_FAR_LAYER = 1
};
近景和远景精灵,以及其运行速度和景层的高度,(速度用来滚动,高度用来判断更新景层的位置)

private:
    // 背景(远景层)
    CCSprite *m_pSkySprite;
    CCSprite *m_pSkySpriteRe;
    float m_fSkyVelocity;
    float m_fSkyHeight;
    
    // 地图(近景层)
    CCTMXTiledMap *m_pTileMap;
    CCTMXTiledMap *m_pTileMapRe;
    float m_fTileMapVelocity;
    float m_fTileMapHeight;
初始化,每个景层由两个相同地图精灵组成,依次排开,向下运动

void GameBGLayer::initBackground()
{
    // Sky
    m_pSkySprite = CCSprite::spriteWithFile("bg01.jpg");
    m_pSkySpriteRe = CCSprite::spriteWithFile("bg01.jpg");
    m_pSkySprite->setAnchorPoint(CCPointZero);
    m_pSkySpriteRe->setAnchorPoint(CCPointZero);
    this->addChild(m_pSkySprite, -10, TAG_BG_NEAR_LAYER);
    this->addChild(m_pSkySpriteRe, -10, TAG_BG_NEAR_LAYER);
    
    // Map
    m_pTileMap = CCTMXTiledMap::tiledMapWithTMXFile("level01.tmx");
    m_pTileMapRe = CCTMXTiledMap::tiledMapWithTMXFile("level01.tmx");
    m_pTileMap->setAnchorPoint(CCPointZero);
    m_pTileMapRe->setAnchorPoint(CCPointZero);    
    this->addChild(m_pTileMap, -9, TAG_BG_FAR_LAYER);
    this->addChild(m_pTileMapRe, -9, TAG_BG_FAR_LAYER);
    
    // 设置高度
    m_fSkyHeight = m_pSkySprite->getContentSize().height;
    m_fTileMapHeight = m_pTileMap->getMapSize().height * m_pTileMap->getTileSize().height;
    
    // 设置副本背景位置
    m_pSkySpriteRe->setPosition(ccp(0, m_fSkyHeight));
    m_pTileMapRe->setPosition(ccp(0, m_fTileMapHeight));
    
    // 设置移动速度
    m_fSkyVelocity = -16;
    m_fTileMapVelocity = -60;
//    m_fSkyVelocity = -160;
//    m_fTileMapVelocity = -600;
}
更新方法,为了统一管理,我将所有背景相关的都放在了这一层,每次遍历并更新位置和判断是否向后移动

void GameBGLayer::update(ccTime dt)
{
    CCArray *bgSprites = this->getChildren();
    CCObject *obj = NULL;
    
    CCARRAY_FOREACH(bgSprites, obj)
    {
        movingBackground(obj, dt);
    }
}
移动背景(包括滚动和向后移动)

void GameBGLayer::movingBackground(CCObject *pObj, ccTime dt)
{
    CCNode *bgNode = (CCNode*) pObj;
    int tag = bgNode->getTag();
    
    if (tag == TAG_BG_NEAR_LAYER) {
        // 远景层
        bgNode->setPositionY(bgNode->getPositionY() + m_fSkyVelocity * dt);
        if (bgNode->getPositionY() < -m_fSkyHeight) {
            bgNode->setPositionY(bgNode->getPositionY() + m_fSkyHeight * 2 - 2);
        }
    }
    else if (tag == TAG_BG_FAR_LAYER) {
        // 近景层
        bgNode->setPositionY(bgNode->getPositionY() + m_fTileMapVelocity * dt);
        if (bgNode->getPositionY() < -m_fTileMapHeight) {
            bgNode->setPositionY(bgNode->getPositionY() + m_fTileMapHeight * 2 - 2);
        }
    }
}

-2的目的是为了避免背景之间有可能因为加载产生的黑线


3.效果



不能做成动画,效果看不出来。。。




Cocos Creator 实现背景无限滚动效果 文章目录1、引言2、问题3、原理4、实现4.1、场景搭建4.2、代码5、效果展示6、结束语 1、引言   我们在制作一些2d游戏时经常需要用到背景滚动效果来做一些文章。 2、问题   那么既然背景滚动,那么我们总不能做一个无限长的背景来移动吧,那怎么办呢!事实上,解决方案不止一种,我们这里说一下两张背景无限滚动的方法。 3、原理   简单来说就是场景中两张背景图片交替的在移动,在游戏的每帧中... 阅读详情

相关推荐

Cocos2D-x游戏开发之十:背景无限滚动

今天研究了一下Coco2D-x的背景无限滚动,其实是学习别人的demo,不过自己最终还是折腾出来了,其实还是比较简单了,就是背景不停地移动然后两张图片交替的贴上去。 其精髓之处就是不断地更新背景然后在每一帧里调整两张背景的\X锚点,然后就会给人一种主角再向前奔跑的感觉。核心代码如下: bool TollgateScene::init() { bool bRet = false; do 

vanileo的专栏 8415

Scene切换特效

    // -(void) startMenu:(id) sender { CCScene* scenec = [CCTestScene scene]; //部落格------ //CCTransitionTurnOffTiles *transitionScene = [CCTransitionTurnOffT...

一切皆有可能 232

Cocos2d-x】新手自学()滚动背景..实现无限卷轴效果(2.0.1版本)

这段时间一直在研究2.0.1这个版本的引擎...发现和1.0X的差别比较大..有很多函数,都改了名字.. 这次我分享一下那种类似于雷电..游戏的纵版背景滚动.. 1. 如果想使窗口看起来更加适合纵版游戏,首先改变窗口大小(分辨率),在main.cpp这个自动生成的文件中有这个一句:改变那两个数字就行~ AppDelegate app; CC

一颗蓝米粒 6790

cocos creator 2.4.5 2D RPG 无限滚动背景实现

要点: 场景默认自带一个Camera,渲染场景内所有的物体 Camea节点可以看做是一个空节点下挂接一个Camea组件,所以本身不可见 每个场景都可以有多个Camera,通过关联组名来分组渲染 多个Camera的渲染层级符合节点树规则,先按Camera节点的层级分优先级,越下面的Camera,其关联的组越后渲染;同一Camera分组下的节点,越下面的节点越后渲染。越后渲染的节点看起来越接近顶层。 案例 Camera 实践:无限视差滚动地图实现 一、Camer

LANGZI7758521的专栏 2279

Cocos无限滚动背景

无限滚动背景

weixin_42581036的博客 551

Cocos2d-x学习(十二):用cocos2d-x实现MoonWarriors(无限背景滚动的简单实现)

特别声明:本文所有图片资源来源于MoonWarriors cocos2d-html 开源项目 之前总结过一次无线背景滚动的实现方法,基本上是基于cocos2d-html版的MoonWarriors的方法实现的, 博客地址:cocos2d-x学习):cocos2d-x 无限背景滚动 其实原理都是类似的,都是通过移动背景图,造成玩家角色移动的假象,而无限背景滚动就是两

oneRain88的专栏 8517

cocos2d-x无限滚动背景

在一些跑酷类,打飞机类的手游,背景需要无限滚动,我也来实现一下无限跑动。原理比较简单,就是画一张头尾可以相接图片,用两个精灵加载这个图片,两个精灵的位置是相接的,然后两个精灵轮流显示,如果有一个精灵完全离开屏幕,则将精灵设置为连接在另一个精灵后的位置。我们来看看代码: bool CTest::init() { CCAssert(CCLayer::init(), "");

dssdss123的专栏 4503

Cocos2d-x】实现可上下左右无限滚动背景

说明: (1).相关参数 1.speed(速度) 2.direction (方向(横向、竖向滚动)) 3.length(可视区域长度) 4.imgs(参与滚动的图片,至少两张) (2)实现思路 1.根据方向而选择图片的宽或高初始化图片的位置 2.定时器根据速度定时更新背景位置,当图片超出可视区域时,设置图片的位置到末尾。

2998

Cocos2d-x游戏开发实例详解3:无限滚动地图

通过自己的实际演练,详细解说Cocos2d-x引擎的个模块。今天讲解无限滚动地图。一般打飞机类游戏都是飞机不动,背景滚动,造成飞机在天空飞的效果。 MoonWarriors的背景有两层,一个远景天空,一个近景漂浮物,这两层背景滚动速度不一样,形成一种纵深感。 如图: 图有点模糊,实际效果跟html5的一样(根本就是照着它写的,嘿嘿) 前面说了,背景分为两部分,天空和漂浮物,下面分别解释一下 1,天空背景 源图是一张320*576的jpg图片。加载的时候实质上是分两次进行的。 ..

翻肚鱼儿的博客 738

Cocos2d-x《雷电大战》-双层地图无限滚动

  本文要实现飞机射击游戏中的地图无限滚动的功能,这里分为两个层,一个层无限向下滚动,一个层无限向上滚动,这样子结合起来效果就非常有层次感,也非常逼真,这里我把地图层都写成一个类,自己把地图改下,就可以成为你自己的了!下面,我们开始吧   先来看看效果:         Cocos2d-x版本:3.4   工程环境:VS30213   一、实现思路   其实就是两张图片,然后同时一起向下(...

weixin_44239023的博客 293

Cocos2d-x实现场景无限滚动

游戏中,人物行走,其实是背景向相反方向移动,给玩家形成了一个人物向前移动的错觉。 详细步骤如下,懒得码字了,代码中注释得很清楚: 1 做一个人物无限原地踏步的动画,代码如下所示: //创建人物精灵 CCSprite *mainsprite = CCSprite::create("s_1.png"); //...

awp396918513的博客 226

cocos2d-x 《Flappy Bird 》一、滚动背景的实现

《flappy bird》是由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是根本不会飞的……所以玩家每点击一下小鸟就会飞高一点,不点击就会下降,玩家必须控制节奏,拿捏点击屏幕的时间点,让小鸟能在落下的瞬间跳起来,恰好能够通过狭窄的水管缝隙,只要稍一分神,马上就会失败阵亡。 图片资源提取后使用P

West Third Ring 2518

无限背景滚动

之前总结过一次无线背景滚动的实现方法,基本上是基于cocos2d-html版的MoonWarriors的方法实现的,博客地址:cocos2d-x学习):cocos2d-x 无限背景滚动其实原理都是类似的,都是通过移动背景图,造成玩家角色移动的假象,而无限背景滚动就是两个背景图,依次排开,移动,判读是否移除屏幕外,位置更改,循环交替。在之前的博客中,我是在update()方法中根据时间和背景移动

过期的码农 1053

Cocos2d-x《雷电大战》(1)-双层地图无限滚动

本文要实现飞机射击游戏中的地图无限滚动的功能,这里分为两个层,一个层无限向下滚动,一个层无限向上滚动,这样子结合起来效果就非常有层次感,也非常逼真,这里我把地图层都写成一个类,自己把地图改下,就可以成为你自己的了!下面,我们开始吧

Evankaka的专栏 8926
上一篇: Cocos2d-x学习(八):cocos2d-x 2.0 中CCListView的用法
下一篇: Android工程的自动创建,编译并生成apk
oneRain
博客等级 码龄16年 680粉丝 69原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值