cocos2dx中用動作實現背景無限滾動
阿新 • • 發佈:2019-02-20
cocos2dx-3.1.5中用動作實現背景滾動,cocos2dx都可以使用的
用到的動作其實很簡單
- MoveBy 因為有反動作
- TargetedAction 給指定目標1個動作
- Spawn 同時執行
- Sequence 動作按照順序執行
- RepeatForever 一直重複執行
如果用定時器,會有畫面抖動,因為每幀執行的時間不一樣,而我們用動作實現背景滾動只需要關注移動的時間,不需要關注每幀偏移的畫素是多少。
標頭檔案
#pragma once
#include "GameSceneManager.h"
#define DEF_ROLL_SPEDD 8
/*
背景滾動
*/
class BackgroundLayer : public Layer
{
public:
virtual bool init();
CREATE_FUNC(BackgroundLayer);
Scale9Sprite* createBackGround(Vec2 pos);
// 預設背景滾動圖片
static int currBgImageIndex;
// 滾動速度,值越小速度越快
static int rollTime;
void startRollBg();
void stop();
bool isFastRoll = false ;
};
cpp檔案
#include "BackgroundLayer.h"
int BackgroundLayer::rollTime = DEF_ROLL_SPEDD;
int BackgroundLayer::currBgImageIndex = 1;
bool BackgroundLayer::init()
{
if (!Layer::init())
{
return false;
}
startRollBg();
return true;
}
Scale9Sprite* BackgroundLayer::createBackGround (Vec2 pos)
{
auto background = Scale9Sprite::create(StringUtils::format(BACKGROUND_IMG_NAME, currBgImageIndex));
background->setScale9Enabled(true);
background->setContentSize(winSize);
background->setPosition(pos);
background->setAnchorPoint(Vec2::ZERO);
this->addChild(background);
return background;
}
void BackgroundLayer::startRollBg()
{
// 建立2張背景圖
Scale9Sprite* bg = createBackGround(Vec2::ZERO);
Scale9Sprite* bg2 = createBackGround(Vec2(0, winSize.height));
// 滾動動作
auto mt = MoveBy::create(rollTime, Vec2(0, -winSize.height));
auto ta = TargetedAction::create(bg, mt);
auto ta2 = TargetedAction::create(bg2, mt->clone());
// 同時執行
auto spawn = Spawn::createWithTwoActions(ta, ta2);
// 重複執行,設定位置
auto rf = RepeatForever::create(Sequence::createWithTwoActions(spawn, CallFunc::create([=]()
{
//this->stopAllActions();
bg->setPositionY(0);
bg2->setPositionY(winSize.height);
//log("----");
})));
// 當前Layer執行這個Action
this->runAction(rf);
}
void BackgroundLayer::stop()
{
this->stopAllActions();
}