Categories

  • Android開発
    android marketで目指せ億万長者(ウソ)
  • cocos2d
    pythonでも使えるゲームフレームワーク
  • Google
    ここには未来を開くためのAPIがたくさん用意されている。
  • GoogleAppEngine
    どこまでもスケールアウトするクラウドサービス。使いこなすのが大変
  • Hack
    様々な電子機器を本来の用途とは別の用途に使ってみる。
  • iPhone開発
    app storeで目指せ億万長者(ウソ)
  • python
    LightWeightLanguageで一番難しいがLispにも通じるところがある面白い言語。
  • TIPS
    覚えておくともしかしたら役に立つかもしれないチョットしたこと。
  • うまくいきません
    やってみたけど、うまくいかなかった失敗記事
  • ネット世界
  • 夢見るソフトウェア
    こんなのいいな、できたらいいな、いつかつくろう
  • 開発環境
    開発するまえに環境を整えた記録、次に同じことをするためめの忘備録
無料ブログはココログ
My Photo

« cocos2dの練習 Game Demo Tutorial #2: Hello Spaceをやってみた | Main | cocos2dはもともとiphoneだけのものではない »

August 16, 2009

cocos2dの練習 Game Demo Tutorial #3: Collisions & Particle Systems をやってみた

Game Demo Tutorial #3: Collisions & Particle Systems

前回に行き続き、MAC DEVのチュートリアル3番
Mac Dev » Game Demo Tutorial #3: Collisions & Particle Systems

このエントリーではchipmunkを使った衝突検出を使う。そして、パーティクルも使う。
その前にソースコードをダウンロードしてrock.pngをリソースに追加する
まず、小惑星を表示したいので、makeSpaceRockXをbullet同様に書く。
collisionのところにNEWのコメントがついているが、まだ衝突検出しないので実装しない。


//破壊すべき小惑星を作ってみる
-(void) makeSpaceRockX: (float) x y:(float)y
{
     Sprite *rock = [[SpritespriteWithFile:@"rock.png"] retain];
     rock.position = cpv(x,y);
     [selfaddChild: rock];
     cpVect verts[] = {
          cpv(-54,-43),
          cpv(-54, 43),
          cpv(54, 43),
          cpv(54,-43),
     };
     cpBody *rockBody = cpBodyNew(200.0f, INFINITY);
     rockBody->p = cpv(x, y);
     rockBody->v = cpv(0, 0);
     cpSpaceAddBody(space, rockBody);
     cpShape * rockShape = cpPolyShapeNew(rockBody, 4, verts, cpvzero);
     rockShape->e = 0.9f; rockShape->u = 0.9f;
     rockShape->data = rock;
     //rockShape->collision_type = 0; //New!
     cpSpaceAddShape(space, rockShape);
     //cpSpaceAddCollisionPairFunc(space, 0, 1, &bulletCollision, self); //Also new!
}
ここで実行。よーし、絵が出た。楽勝だ。

次に衝突検出だ


まずは先ほどのコメントを外して小惑星のcollision_typeを0
rockShape->collision_type = 0; //New!
おなじく衝突検出のコールバック設定もコメント解除
0とか1とかはcollision_typeで設定した数値。2つしか設定できない。だってPairだもん。
cpSpaceAddCollisionPairFunc(space, 0, 1, &bulletCollision, self); //Also new!

弾のcollision_typeを1
laserShape->collision_type = 1; //this is new!

衝突検知したときにコールバックされる関数は、クラス外に置く
staticint bulletCollision(cpShape *a, cpShape *b, cpContact *contacts, int numContacts, cpFloat normal_coef, void *data)
{
GameLayer *game = (GameLayer*) data;
a->body->p = cpv(800,800);//画面外へ
b->body->p = cpv(800,800);//画面外へ
//[game createExplosionX:200 y:200];//これはまだ実装していないのでコメントアウト
return0;
}

これで実行、弾を打って小惑星にあ当たると、弾も小惑星も消える。
さて、衝突したら爆発して欲しいので、パーティクルを使った爆発を作る。
新しいソースでRockExplosionを追加します。名前がかっこいい。

いつものNSObjectから派生させるのではなく、PointParticleSystemから派生させる。
#import "TextureMgr.h"
をRockExplosionに追記するのを忘れないように
positionが見つからないのでコンパイルエラーになる。コメントアウトしちゃえ。

GameSceneにcreateExplosionXを実装して、先ほどのコメントを解除。
RockExplosionの後ろについているnodeってなんだ?


-(void) createExplosionX: (float) x y: (float) y
{
     ParticleSystem *emitter = [RockExplosion node];
     emitter.position = cpv(x,y);
     [self addChild: emitter];
}

今回の爆発で使用したパーティクルシステムは初期化しかない。
そのかわり初期化で設定するものが大量にある。


-(id) initWithTotalParticles:(int)p
{
if( !(self=[superinitWithTotalParticles:p]) ) return nil;
// duration
duration = 0.1f; //パーティクルを発生させている期間
// gravity
gravity.x = 10; //重力
gravity.y = 10;
// angle
angle = 90; //発射する角度 0で右水平
angleVar = 360; //発射する角度の広がり 360すなわち全方向
// speed of particles
speed = 200; //発射速度
speedVar = 40; //発射速度のばらつき範囲
// radial
radialAccel = 0; //放射するときの加速度
radialAccelVar = 0;//上のばらつき範囲
// tagential
tangentialAccel = 0; //接線方向への加速度、これを設定すると渦を巻きながら飛んでいく
tangentialAccelVar = 0;//上のばらつき範囲
// emitter position
/*position.x = 160;//これは,setPositionで設定することになったみたい。
position.y = 240;
*/
posVar.x = 0; //与えられた初期位置からの横方向のばらつき
posVar.y = 0; //与えられた初期位置からの縦方向のばらつき
// life of particles
life = 10.0f; //パーティクルを発生し続ける時間
lifeVar = 2;
// size, in pixels
startSize = 40.0f; //発生源の大きさ?
startSizeVar = 20.0f;
// emits per second
emissionRate = totalParticles/duration;
// color of particles
startColor.r = 0.99f; //初期カラー
.....endColorVar.a = 0.0f; //終了時のカラー
//テクスチャーの割当。 TextureMgrを使えばいちいちファイルからロードしない?
self.texture = [[TextureMgrsharedTextureMgr] addImage: @"rock.png"];
// additive
blendAdditive = NO; //不明
return self;
}

blendAddtiveだけがわからない。発生個数を4ではなく、20ぐらいにすると気持ちいい.

ということでMAC DEVのチュートリアル終わっちゃった。続きでないかな。

今回も参考にさせていただきました
shukujitsuの開発ブログ : MAC DEVのサンプルを読む その2 - livedoor Blog(ブログ)

« cocos2dの練習 Game Demo Tutorial #2: Hello Spaceをやってみた | Main | cocos2dはもともとiphoneだけのものではない »

iPhone開発」カテゴリの記事

Comments

Post a comment

Comments are moderated, and will not appear on this weblog until the author has approved them.

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/48058/45948965

Listed below are links to weblogs that reference cocos2dの練習 Game Demo Tutorial #3: Collisions & Particle Systems をやってみた:

« cocos2dの練習 Game Demo Tutorial #2: Hello Spaceをやってみた | Main | cocos2dはもともとiphoneだけのものではない »