cocos2dx3.0 实现屏幕背景滚动

前端之家收集整理的这篇文章主要介绍了cocos2dx3.0 实现屏幕背景滚动前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

主要是利用 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@H_404_61@::createScene()
{
    auto scene = Scene@H_404_61@::create();

    auto layer = Bg@H_404_61@::create();

    scene->addChild(layer);

    return scene;
}

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

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

    initBG();

    this->scheduleUpdate();

    return true;
}

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

    m_bgSprite2 = Sprite@H_404_61@::create("bg2.png");
    m_bgSprite2->setPosition(Point(visibleSize.width / 2,visibleSize.height + visibleSize.height / 2));
    this->addChild(m_bgSprite2,0);
}
void Bg@H_404_61@::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);
}

猜你在找的Cocos2d-x相关文章