無限スクロールのupdateメソッドに依る実装

任天堂スーパーマリオの頃からの王道アクションゲームに採用されてきたのは 右から左に背景画像が送られる無限スクロールで世人にはお馴染みの景色です。 手元の開発ゲームでは此の王道の手法を採用し、 以下の両記事で紹介しもしました。

うさ犬時計

両者に共通する無限スクロールの実現手法としては地面画像を用意し 此れスプライトインスタンス化して右から左へ移動しつつ繰り返し表示させるものでしたが、 移動には SpriteKit に備え付けの SKAction クラスの moveToX アクションを用いて実装していました。 此れを今回は update メソッドに依る実装に改変します。

スポンサーリンク
日付:2014年4月6日
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.2
Xcodeバージョン:5.1
言語:Objective-C
主関連アプリ:うさ犬が行く

既に想定通りに機能しているプログラムを態々改変するのは SKActionでの実装では所与の値に制限されて機能途中でのイベントを受け入れ難いからです。 例えば無限に右に飛翔を試みる主人公キャラクター ほんまる にユーザーが何某かのアクションを与えた場合スクロールスピードを早めたり遅くしたりしたい目論見があるのでした。 其処でタイムラインに沿って時間経過の度に機能する updateメソッド内に地面のスクロールの座標を進めさせようと言う魂胆です。

本ブログの上記した両記事の流れから繰り返しを許容する地面画像を 此処ではground1、ground2の2つ スプライトインスタンス化し交互にタイミング良く生成消滅を繰り返しながら スクロールするスクリプトは以下の如くなります。 updateが読み込まれる度に移動させるノードのポジションを変更しています。

-(void)update:(CFTimeInterval)currentTime {
  /* 地面無限スクロール */
  if (ground1.position.x <= - self.size.width / 2) {
    ground1.position = CGPointMake(self.size.width / 2, ground1.position.y);
    ground2.position = CGPointMake(ground1.position.x + ground2.size.width, ground2.position.y);
  } else {
    ground1.position = CGPointMake(ground1.position.x - 0.5, ground1.position.y);
    ground2.position = CGPointMake(ground2.position.x - 0.5, ground2.position.y);
  }
  ...(ry

一定の短時間毎に両地面インスタンスの座標は Y軸に変化なくX軸のみ一定の正の値増加することで右から左に移動します。 若し此のX座標が自身を画面から左にはみ出させる位置にあれば 瞬間的にX座標を大きく右に他地面インスタンスの後を上手く継ぐ位置に移動させる勘定です。

runAction:[SKAction repeatActionForever:
  [SKAction sequence:
  ...(ry

但し冒頭の本ブログ2016年7月5日の記事に記載した キャラクターのインスタンスや其の他類する無限スクロールを想定しないようなスプライトインスタンスに於いては シーンに対してノードは描画されるのであればノードはノードで個別に 上記コードに示す如きSKActionにて移動させるべく記述出来る部分は有るかと思われ 適材適所に使い分けるよう想定しています。

Going USAINU(邦題: うさ犬が行く)
無料:カテゴリ: ゲーム: 4+ 評価
バージョン: 3.21
リリース: 2015年9月14日
更新: 2022年3月7日
サイズ : 19.7 MB
互換性: iOS 14.4 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。