加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx3.0 实现屏幕背景滚动

发布时间:2020-12-14 17:08:44 所属栏目:百科 来源:网络整理
导读:主要是利用 update()方法(this-scheduleUpdate();开启),让背景图片不断的移动,两张图片交替 就能形成图片背景移动的效果了。 BgScene.h #ifndef __BG_SCENE_H__ # define __BG_SCENE_H__ #include "cocos2d.h" USING_NS_CC;class Bg: public cocos2d::La

主要是利用 update()方法(this->scheduleUpdate();开启),让背景图片不断的移动,两张图片交替 就能形成图片背景移动的效果了。


BgScene.h

#ifndef __BG_SCENE_H__
#define __BG_SCENE_H__

#include "cocos2d.h"

USING_NS_CC;

class  Bg: public cocos2d::Layer
{
public:

    static Scene* createScene();

    virtual bool init();  

    CREATE_FUNC(Bg);

public:
    Size visibleSize;
    Point origin;

    // node对象的update方法( 每一帧都刷新 this->scheduleUpdate(); )
    virtual void update(float delta);

public:
    Sprite* m_bgSprite1;    // 背景精灵1
    Sprite* m_bgSprite2;    // 背景精灵2
    void initBG();          // 初始化图片背景
};

#endif // 

BgScene.cpp

#include "BgScene.h"

USING_NS_CC;

Scene* Bg::createScene()
{
    auto scene = Scene::create();

    auto layer = Bg::create();

    scene->addChild(layer);

    return scene;
}

bool Bg::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    visibleSize = Director::getInstance()->getVisibleSize();
    origin = Director::getInstance()->getVisibleOrigin();

    auto sp = Sprite::create("CloseNormal.png");
    sp->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2));
    this->addChild(sp,1);

    initBG();

    this->scheduleUpdate();

    return true;
}

void Bg::initBG()
{
    m_bgSprite1 = Sprite::create("bg1.png");
    m_bgSprite1->setPosition(Point(visibleSize.width / 2,visibleSize.height / 2));
    this->addChild(m_bgSprite1,0);

    m_bgSprite2 = Sprite::create("bg2.png");
    m_bgSprite2->setPosition(Point(visibleSize.width / 2,visibleSize.height + visibleSize.height / 2));
    this->addChild(m_bgSprite2,0);
}
void Bg::update(float delta)
{
    int posY1 = m_bgSprite1->getPositionY();    //背景地图1的Y坐标
    int posY2 = m_bgSprite2->getPositionY();    //背景地图2的Y坐标

    int iSpeed = 1; //地图滚动速度

    /* 两张地图向左滚动(两张地图是相邻的,所以要一起滚动,否则会出现空隙) */
    posY1 -= iSpeed;
    posY2 -= iSpeed;

    /* 图大小 */
    Size bgSize = m_bgSprite1->getContentSize();

    /* 当第1个地图完全离开屏幕时,第2个地图刚好完全出现在屏幕上,这时候就让第1个地图紧贴在 ?第2个地图后面 */
    if (posY1 <= -bgSize.height / 2) {
        posY1 = bgSize.height + bgSize.height / 2;
    }
    /* 同理,当第2个地图完全离开屏幕时,第1个地图刚好完全出现在屏幕上,这时候就让第2 ?个地图紧贴在第1个地图后面 */
    if (posY2 <= -bgSize.height / 2) {
        posY2 = bgSize.height + bgSize.height / 2;
    }

    m_bgSprite1->setPositionY(posY1);
    m_bgSprite2->setPositionY(posY2);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读