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()
{
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();
}