Java包装类 json arraylist neo4j EaselJS flowjs ppt视频教程下载 jquery循环 jquery通过class获取元素 kafka默认端口 wordpress本地建站 kali重启网卡 郑州普通话 python加注释 python正则表达式例子 java编程基础 java集合 java安装配置 java代码注释 垃圾邮件数据集 pyh js判断字符串相等 din字体下载 wscript 野德天赋 华为下拉开关设置 俄罗斯方块代码 proteus8 rpm卸载命令 php随机数函数 kmplayer绿色版 jsp源码 编写软件 ass转srt 接口自动化测试框架 lol修改皮肤 ps取色 js压缩图片 脚本生成器 dataformatstring
当前位置: 首页 > 学习教程  > 编程语言

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

2020/8/31 16:05:30 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

通过自己的实际演练,详细解说Cocos2d-x引擎的个模块。今天讲解无限滚动地图。一般打飞机类游戏都是飞机不动,背景图滚动,造成飞机在天空飞的效果。

 

MoonWarriors的背景有两层,一个远景天空,一个近景漂浮物,这两层背景滚动速度不一样,形成一种纵深感。

如图:

图有点模糊,实际效果跟html5的一样(根本就是照着它写的,嘿嘿)

前面说了,背景分为两部分,天空和漂浮物,下面分别解释一下

1,天空背景

源图是一张320*576的jpg图片。加载的时候实质上是分两次进行的。

 

    m_backSky = CCSprite::create(s_bg01);
    m_backSky->setAnchorPoint(ccp(0, 0));
    m_backSkyHeight = m_backSky->getContentSize().height;
    addChild(m_backSky, -10);

这是初始初始状态,加载后执行一个动作

 

 m_backSky->runAction(CCMoveBy::create(3, ccp(0, -48)));

就是移动48像素。然后调用一个重复的任务调度来重复滚动;

 

schedule(schedule_selector(GameLayer:: movingBackground),3);

 

来看下这个滚动函数:
void GameLayer::movingBackground()
{
    m_backSky->runAction(CCMoveBy::create(3, ccp(0, -48)));
    m_backSkyHeight -= 48;
    if (m_backSkyHeight <= winSize.height) {
        if (!m_isBackSkyReload) {
            m_backSkyRe = CCSprite::create(s_bg01);
            m_backSkyRe->setAnchorPoint(ccp(0, 0));
            addChild(m_backSkyRe, -10);
            m_backSkyRe->setPosition(ccp(0, winSize.height));
            m_isBackSkyReload = true;
        }
        m_backSkyRe->runAction(CCMoveBy::create(3, ccp(0, -48)));
    }
    
    if (m_backSkyHeight <= 0) {
        m_backSkyHeight = m_backSky->getContentSize().height;
        this->removeChild(m_backSky, true);
        m_backSky = m_backSkyRe;
        m_backSkyRe = NULL;
        m_isBackSkyReload = false;
    }
}

可以看到,实质上是有两个CCSpite轮换加载来滚的。第一张滚加载完后图片比屏幕要高一些,它向下滚,滚到顶部到屏幕顶部的时候加载第二张,同时反转Reload标志位,第二张紧接着滚也滚进屏幕,当第一张滚出屏幕的时候,第一张节点被remove,但指针指向第二个精灵,第二个指针则被释放,同时标志位反转,这就完成了一个周期。整个过程不断重复。

2.近景漂浮物滚动

思路跟上面那个一模一样,但是这个的图片不一样,这是一个tmx,使用瓦片地图的方式加载。

初始加载

    m_backTileMap = CCTMXTiledMap::create(s_level01);
    addChild(m_backTileMap, -9);
    m_backTileMapHeight = m_backTileMap->getMapSize().height * m_backTileMap->getTileSize().height;
    m_backTileMapHeight -= 200;
    m_backTileMap->runAction(CCMoveBy::create(3, ccp(0, -200)));

 

滚动部分:

 

 m_backTileMap->runAction(CCMoveBy::create(3, ccp(0, -200)));
    m_backTileMapHeight -= 200;
if (m_backTileMapHeight <= winSize.height) {
        if (!m_isBackTileReload) {
            m_backTileMapRe = CCTMXTiledMap::create(s_level01);
            this->addChild(m_backTileMapRe, -9);
            m_backTileMapRe->setPosition(0, winSize.height);
            m_isBackTileReload = true;
        }
        m_backTileMapRe->runAction(CCMoveBy::create(3, ccp(0, -200)));
    }
    
    if (m_backTileMapHeight <= 0) {
        m_backTileMapHeight = m_backTileMap->getMapSize().height * m_backTileMap->getTileSize().height;
        this->removeChild(m_backTileMap, true);
        m_backTileMap = m_backTileMapRe;
        m_backTileMapRe = NULL;
        m_isBackTileReload = false;
    }

 


本文链接: http://www.dtmao.cc/news_show_150466.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?