読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【偽スペースハリアー】なんと美しい!日本の空、山、森を再現。

cocos2d iPhoneアプリ スペースハリアー TravelShooting JP

前回チェック模様の地面の表示まで進んだ偽スペースハリアープロジェクト。
今回は地面の奥に表示される空、山、森を表示してみました。

グラデーションが美しい空は地平線に合わせて上下させているだけで左右にはスクロールしていません。
奥の山と手前の森は別のスプライトで表示しています。手前の森より奥の山を遅くスクロールさせる事で奥行き間が一層強調されています。

山と森はそれぞれ横幅2048ピクセルのスプライトを左右に2枚並べて表示います。
2枚並べただけだと同じ方向にスクロールして行くと画面から消えて行ってしまいます。
これを防ぐためにスクロールに応じて画面外にあるスプライトの位置をもう一方のスプライト左右適切な方にに置きかえています。

スプライトの位置を入れ替えるプログラムはこのようになっています。

- (void)repositionSprite1:(CCSprite *)sprite1 Sprite2:(CCSprite *)sprite2
{
    CCSprite* left;
    CCSprite* right;
    if (sprite1.position.x < sprite2.position.x) {
        left = sprite1;
        right = sprite2;
    } else {
        left = sprite2;
        right = sprite1;
    }
    
    CGFloat totalWidth = left.contentSize.width + right.contentSize.width;
    if ((left.position.x - left.contentSize.width/2.0) > 0.0) { // 左スプライトの左端が画面内に入ったら
        right.position = ccp(right.position.x - totalWidth, 0.0); // 右のスプライトを左側に移動
    } else if ((right.position.x + right.contentSize.width/2.0) <
               [CCDirector sharedDirector].winSize.width) { // 右スプライトの右端が画面内に入ったら
        left.position = ccp(left.position.x + totalWidth, 0.0); // 左のスプライトを右側に移動
    }
}

スプライトの入れ替えはスプライトの端がギリギリ画面内に入って来るタイミングで行っています。
上記のメソッドはupdate:から毎フレーム呼ばれるようにしているのでうっかり端が見えてしまう事はありません。

次回は、地上に木々や茂み、空中に岩を表示してみたいと思います。
本物のスペースハリアーは、木や茂みが地面の模様の動きとピッタリ一致していますので、これをうまいこと再現したいと思います。できるかな?