LoginSignup
4
4

More than 5 years have passed since last update.

格子状の動く背景を作ってみる

Posted at

概要

同じ画像を格子状でリピート表示され、それが斜め上とかに永遠に動いている。
そんな背景を作ってみる。

環境

  • cocos2d-x v3.3

格子状の動く背景を作る

画像を用意する

2の階乗のサイズで用意する。

GL_REPEATを使ってしきつめる

auto director = Director::getInstance();
const auto vs = director->getVisibleSize();
const auto vo = director->getVisibleOrigin();

// テクスチャを生成
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage("bg.png");

// テクスチャのパラメータを生成
const Texture2D::TexParams tp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};

// テクスチャのサイズ設定用のRectを生成
// - 画面サイズに画像サイズを縦横に1個分ずつ追加する(アニメーションさせるため)
auto rect = Rect(0.0f, 0.0f, vs.width, vs.height);
rect.size.width += texture->getContentSize().width;
rect.size.height += texture->getContentSize().height;

// Spriteを生成
// - 画面の下と右に画像1個分はみ出すように配置する
_bg = Sprite::createWithTexture(texture, rect);
_bg->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
_bg->getTexture()->setTexParameters(tp);
_bg->setPosition(Vec2(vo.x, vo.y - texture->getContentSize().height));
addChild(_bg, 0);

updateで動かす

auto director = Director::getInstance();
const auto vs = director->getVisibleSize();
const auto vo = director->getVisibleOrigin();

// 位置を左上に動かす
// 画像1個分以上移動していたら最初の位置に戻す
{
    auto pos = _bg->getPosition();
    pos += Vec2(-0.5f, 0.5f);

    auto diff = pos - vo;

    if (fabsf(diff.x) >= _bg->getTexture()->getContentSize().width) {
        pos = Vec2(vo.x, vo.y - _bg->getTexture()->getContentSize().height);
    }

    _bg->setPosition(pos);
}

参考

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4