ゲーム画面を覆うようにforループでNSMutableArrayを生成する

陣取りゲームとして目論む処のゲーム主画面に於いては 陣地の遣り取りの判定のために画面全体を区切る必要があります。 区切った画面各々にプレイヤーの陣地か如何かの判定フラグを持たせ 更には他にも様々に応用して用いる使い勝手の良い 配列 として扱う腹積もりです。 この際ゲーム画面の幅に合わせて区切りを柔軟に保たせるために 可変配列を用いることにします。

可変配列オブジェクト NSMutableArray の概要については iPhoneアプリ開発の虎の巻 のページ NSMutableArray などが参考になるかも知れません。

スポンサーリンク
日付:2014年4月13日
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.2
Xcodeバージョン:5.1
言語:Objective-C
主関連アプリ:Balloons Occupy(邦題:バルーンズ・オキュパイ、バルオキュ)

具体的には画面の横幅と縦幅を鑑みて画面全体をカバーする様に forループを用いて四角形スプライトノードを生成して可変配列に納めます。 スプライトノードを生成するのにアップル社謹製の2Dゲームフレームワーク SpriteKit を利用しています。 すると作成コードはSpreteKitの画面初期化メソッド -(id)initWithSize:(CGSize)size {if (self = [super initWithSize:size]) {…}} の冒頭辺りに記述するに以下の如くなるでしょう。

appearPoints = [NSMutableArray array];
float appearPointSize = self.frame.size.width / 5;
for (int i = 0; i < self.frame.size.height / appearPointSize; i++) {
  for (int j = 0; j < self.frame.size.width / appearPointSize; j++) {
    SKSpriteNode *tempAPoint = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(appearPointSize, appearPointSize)];
    tempAPoint.position = CGPointMake(appearPointSize * j + appearPointSize / 2, appearPointSize * i + appearPointSize / 2);
    [appearPoints addObject:tempAPoint];
  }
}
NSLog(@"AP: %@", appearPoints);

区切られた其々のスプライトノードは プレイヤーの陣地拡大を阻止すべく登場する敵キャラクターの出現ポイントとなりますので可変配列を appearPoints と命名しています。 画面幅から導き出された配列数分だけループしてスプライトノードを生成しています。 画面は縦軸、横軸の2次元になりますのでi、jを用いてネストしています。 其々のポイントにX、Yの値を保持させるのに スプライトノードの position 属性を利用しています。

スプライトノードの属性を利用することでスプライトノードのみの一次元配列で 様々な値を持たせることが可能になるので他に応用が効くものと思います。 此処ではスプライトノードの生成時に2次元の値を持つposition属性を付与していますので 例えばリセットを掛ける行為などでは新規スプライトノードで画面を覆い尽くせますし 他にも透明度や拡大縮小値を保持させても配列自体は同じ扱いで済ませられるのは具合が宜しくあるでしょう。

此処では応用の一つ並びに敵キャラクター出現の実装を織り込んだ上の 陣取りゲームの基本構成となる此の配列を鑑みて 当該可変配列に納めたスプライトノードに於いて特定のスプライトノードをランダムに指定し 取り出したら配列から取り出したオブジェクトを削除するようなスクリプトを考えてみます。 視覚的にもスプライトノードが次々と消えていくのでテストたり得るでしょう。 実は敵キャラクターが次々と位置を変えていくシミュレーションとしても目論んでいます。 配列取り出しテストプログラム とでも称するコードは以下の如く記述しました。

- (void)updateWithTimeSinceLastUpdate:(CFTimeInterval)timeSinceLast {
  self.lastSpawnTimeInterval += timeSinceLast;
  if (self.lastSpawnTimeInterval > 2) {
    self.lastSpawnTimeInterval = 0;
    /* 出現ポイントの取り出し */
    if (appearPoints.count != 0) {
      /* 出現ポイントをランダムに設定 */
      NSLog(@"APcound: %lu", (unsigned long)appearPoints.count);
      NSLog(@"APindex: %d", arc4random_uniform((unsigned int)appearPoints.count));
      int tempAPNum = arc4random_uniform((unsigned int)appearPoints.count);
      SKSpriteNode *aptemp = [appearPoints objectAtIndex:tempAPNum];
      [self addChild:aptemp];
      [appearPoints removeObjectAtIndex:tempAPNum];
    }

単位時間毎に処理を発生させるために本ブログ2017年3月27日の記事 -(void)update:(CFTimeInterval)currentTimeメソッドに於ける任意時間のコールバックメソッド を利用しています。 実行すれば2秒毎に次々とスプライトノードが消えていくのが視覚的に確認出来るでしょう。 スプライトノードを一次元的に配列に納めている為 削除するのに指定すインデックスをランダムに生成するのも一つだけ生成して 一回だけ配列からの削除処理をすれば済むようになっています。 その際ランダムなインデックス数は上のコードでは tempAPNum なる変数で扱っています。 視覚的に加えて数値的確認の為に NSLog() で残りのスプライトノード数をコンソール出力しています。 2行目のNSLog()出力は後で生成するtempAPNumとは無関係ですが ランダムに生成される数値がスプライトノード数内に収まっているか序でに確認するもので余り意味はありません。

Balloons Occupy
無料:カテゴリ: ゲーム: 4+ 評価
バージョン: 3.0
リリース: 2015年1月29日
更新: 2020年9月1日
サイズ : 13 MB
互換性: iOS 8.0 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。