cocos2dの使い方【実践】② 〜スプライトで簡単なゲーム 1/2〜

今週のお題「桜」


前回のタッチ機能の復習をしつつ,

今回は複数のSpriteを用いて,簡単なゲームを作ります。

初めてのゲームということでどんなゲームを作るかというと

タッチしたところに四角がきてそれが地面に落ちていき,重なってしまったらゲームオーバーというもの。

言葉で説明してみても分かりにくいので実際やってみながら理解してください


今回もHelloWorldプロジェクトに追加していきます。

サンプルコードはこちらから。


今回はgameLayerのみ編集します。

resourceとしてhttp://www.fnordware.com/superpng/pnggrad8rgb.pngこちらをお借りしました。


ソースの説明は基本的にコメントアウトしてありますが,

//squareスプライト
static CCSprite *square[20];
//次のsquare
static int squareNextNumber = 0;
//squareスプライトの数
static int squareSum = 20;

これらをとりあえず一番上で先に定義してしまいましょう。

//指定した数以上は使わないことが前提
        for (int i = 0; i < squareSum; i++) {
            square[i] = [CCSprite spriteWithFile:@"square.png"];
            square[i].scale = .1f;
            square[i].anchorPoint = ccp(.5f, 0.f);
            //つくるだけでまだ見せない
            square[i].visible = NO;
            //バッチに入れていく
            [self addChild:square[i]];
        }

今回の大きなところとしてこのように先にたくさんのspriteをaddChildしてしまいます。

そしてタッチしたところにspriteがくるのですが

//タッチし終わった(離した)時
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [self convertTouchToNodeSpace: touch];
    square[squareNextNumber].position = location;
    //sakuraを表示
    square[squareNextNumber].visible = YES;
    squareNextNumber++;
    if(squareNextNumber >= 20){
        squareNextNumber = 0;
    }
}

このように離したら次から次の別のspriteを操作するという風にします。

これだけが最初のソースですが,これだけではまだまだなのでとりあえず離したものに関しては下までいってもらう風にしましょう。

Layerの初期化の時(init)で以下の様にスケジュール(タイマー)をセットします。

- (id)init
{
    if(self = [super init])
    {
        .
        .
        .

                
        //タッチ機能ON
        self.isTouchEnabled = YES;
        
        //timerというスケジュール関数(一定間隔で呼ばれる)
        [self schedule:@selector(timer:)];
    }
    return self;
}

これでtimerという名前のスケジュール関数が作成されましたので

//timer追加dt秒感覚で呼ばれる
- (void)timer:(ccTime)dt
{
}

と設置しましょう。

そして四角が落ちていく様にしたいので

for (int i = 0; i < squareSum; i++) {
        //もし見えていたら
        if (square[i].visible)
        {
            //下までいっていなかったら
            if (square[i].position.y > 0){
                //1秒間に100ピクセルのスピードで落ちる
                square[i].position = ccp(square[i].position.x, square[i].position.y - 100*dt);
            }else{
                //下でとまる
                square[i].position = ccp(square[i].position.x, 0);
            }
        }
    }

といった条件で全て確認していき, 落として,下でとめていきます。すると

といった感じで落ちていきます。

ここまでのソースはこちらです。

あとスコアを表示して続きは次回にしましょう。

一番上に

//scoreLabel
static CCLabelTTF *score;
static int gameScore = 0;

とscoreのlabel も宣言し直し,

- (void)timer:(ccTime)dt
{
    .
    .
    .
    //スコアを更新していく
    NSString *scoreString = [[NSString alloc] initWithFormat:@"SCORE : %i", gameScore];
	[score setString: [NSString stringWithFormat:@"%@",scoreString]];
}

timerでスコアを更新していきますがスコアは今回は離したときに増やしてみるので

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    .
    .
    .

    gameScore++;
}

ここに入れておきます。

これで増えていくことになりました。

今回はこのへんで続きは次回やりましょう。

次回の目標は

・重力の様に加速させる
・重なったらの判定をする
・重なったらゲームオーバーにする
・時間制限をする

です。