1. 程式人生 > >cocos2dx中用動作實現背景無限滾動

cocos2dx中用動作實現背景無限滾動

cocos2dx-3.1.5中用動作實現背景滾動,cocos2dx都可以使用的

用到的動作其實很簡單

  1. MoveBy 因為有反動作
  2. TargetedAction 給指定目標1個動作
  3. Spawn 同時執行
  4. Sequence 動作按照順序執行
  5. 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(); }