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

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

Objective-C

【cocos2d】自動弾避けアルゴリズム

暑い!夏になってしまう! そうです。夏までにこのゲームを完成させなくてはならないので急がなくてはなりません。 今回は、自機であるミツバチが敵の弾や仲間のハチを避けつつも集団で行動するアルゴリズムについて書きたいと思います。 自動弾避け機能がわ…

【cocos2d】親ノードと子ノードのCCActionを同期させる方法

子ノードのアクションを親ノードのアクションにシンクロナイズさせてタイミングを合わせたいときありますよね。 そんなときは、親ノードのCCCallBlockで子ノードに対しrunActionしてやればうまく行きます。 例えば、この動画をご覧ください。 これは、今開発…

【cocos2d】CCActionで実現できない複雑な動きの実装方法

前回のポストでも少し触れましたが、cocos2dのCCActionで実現できない複雑な動きはアクションを細切れにする事で実装できます。 例えば、BeeClusterの1面中盤、0:45辺りで登場するモンシロチョウの動きはその方法を使っています。 基本的には自機に向かって…

【cocos2d】注意!CCActionの使い回しはできません

同じアクションをいくつかのノードで走らせたい場合、同じCCActionオブジェクトを使い回したくなりませんか? 親子関係にあるノードを一緒にCCFadeOutでフェードアウトさせたい場合などです。ところが、同じオブジェクトを使い回してこのようにプログラムす…

【cocos2d, Objective-C】オブジェクトにタップを知らせる機能をつけた

BeeClusterでは基本的にタッチ機能はキャラクターの移動に使用します。 タッチを管理するTouchLayerクラスのlocationプロパティを使用して自キャラや敵キャラなどのオブジェクトはタッチ位置を知る事ができます。 マップのあちこちにいる味方キャラをタップ…

【cocos2d】1面ボスを作ってみた。CCActionで複雑なパターンを実装

1面のボスキャラとしてクワガタを作りました。 まずは動画をご覧ください。 ボスキャラは特殊な処理が多いので雑魚キャラとはクラスを分けて実装することに決めました。 イニシャライザーの実装です。 - (id)initWithPosition:(CGPoint)position type:(NSStr…

【Objective-C】プロジェクト共通のマクロをまとめてみた

複数のクラスから参照したい共通のマクロを一つのファイルにまとめました。 とりあえず、この回で作った指定範囲の乱数を返すMYRANDマクロや、基本のフレームレートを示すFPSマクロを定義するCommon.hという共通ヘッダファイルを作りました。 #define MYRAND…

【Objective-C, cocos2d】任意の範囲のfloatのランダム値を得るマクロ

ある数値に係数を掛けて数値を若干ランダムに変化させる必要が出てきたので作ったマクロです。UINT_MAXの前に(float)をつけ忘れると整数の割り算になってしまうので要注意です。 #define MYRAND(min, max) ((arc4random()/(float)UINT_MAX)*((max)-(min))+(m…

【cocos2d】教訓:replaceScene後、シングルトンの子ノードを削除する

次回シーン切り替えについて書こうと思いますが、その実装中、前のシーンのスプライトの残骸が画面に残るバグに悩まされました。結論としては、シングルトンのCCSpriteBatchNodeのインスタンスにaddChildされているスプライト達をシーン切り替えのタイミング…

【Objective-C】.plistファイルの作り方と読み込み方

追記:.plistファイルを経由せずに.csvファイルを直接プログラムから読み込む方法は、 【Objective-C】.plistファイルを経由せず直接.csvファイルからデータを読み込む方法 - 夏までにiPhone アプリつくってみっか! をご参照ください。現在作成中の縦スクロ…

【cocos2d】ぎこちないCCActionの動きを滑らかにしてみた Part 3

前々回、前回で作成したSteering BehaviorsのArrivalアルゴリズムを実装したMySteeringクラスを2つの方法で使ってみたいと思います。 1つ目は継承です。これまで作ってきたMyEnemyクラスを修正し、MySteeringクラスのサブクラスに変更します。MyEnemyクラス…

【cocos2d】ぎこちないCCActionの動きを滑らかにしてみた Part 2

前回のPart 1に掲載したSteering BehaviorのArrivalアルゴリズムのプログラムについて解説したいと思います。自分の理解を深めるために絵を描きましたのでプログラムの各部をとそれに対応する絵を使って説明します。説明の中で、速度、加速度、位置など単位…

【cocos2d】ぎこちないCCActionの動きを滑らかにしてみた

cocos2dのCCActionのCCMoveByなどをつかってキャラクターを方向転換させると角のあるカクカクとした動きになってしまいます。もちろん角がなくなるよういくつものアクションを連続して行えば滑らかになると思いますが、非常に面倒くさそうです。 そこで、今…

【Objective-C, cocos2d】イニシャライザ内でself.parentを参照すると危険

またハマりました。 イニシャライザ内の処理でcocos2dのノード階層上の親ノードにアクセスするためにself.parentを使うとハマります。というより、その時点では親ノードにはつながっていません。例えば、MyClass* myobj = [[MyClass alloc] init]; [self add…

【Objective-C, cocos2d】Weakのインスタンス変数についての疑問解決しました

前回悩んでいたweak指定のインスタンス変数にオブジェクトを入れるにはどうすれば良いかという疑問が解決しました。__weak CCSprite* testと言うインスタンス変数があったとして、_test = [[CCSprite alloc] initWithFile@"test-sprite.png"]; [self addChil…

【Objective-C】プロパティを使ってみる(nonatomic, readonly, weakどうすりゃいいの?)

前回のMyEnemyのテストプログラムにより、CCNodeのサブクラスに対してCCFadeInなどのアクションを設定するとクラッシュ事が判明しました。現時点ではMySprite, MyBulletでは動きに関するアクションしか設定していないため、たまたま動作していますが、今後に…

【cocos2d, Objective-C】CCSpriteBatchNodeをシングルトンで実装してみる

今回はスプライトバッチノードをシングルトンとして実装してみたいと思います。シングルトンのインスタンスはクラスメソッドから取り出せるので、ヘッダファイルさえインポートしておけばどのクラスのどのメソッドからも[MyBatch sharedMybach]の形でアクセ…

【cocos2d, Objective-C】コンポーネントベースアーキテクチャとタッチ入力を試してみる

cocos2d関連のチュートリアルサイトや書籍などで「継承(interitance)ではなく合成(composition)を使ってゲームを設計せよ」とよく書かれています。 コンポーネントベースアーキテクチャ、コンポーネントシステムなどと書かれている場合もあります。オブジェ…

【Objective-C】クラスの継承とイニシャライザについて

前回のポストで書いた、initメソッドの呼び方を間違えると無限ループに陥るという問題をもう少し詳しく調べてみました。 そこで参考にしたのがこの本。Objective-Cについての本です。詳解 Objective-C 2.0 第3版作者:荻原 剛志SBクリエイティブAmazonこの第3…

【cocos2d, Objective-C】Cocos2でARCを使う。ハマりましたー!

cocos2dを使って早速iPhone用オリジナルゲームのテストプログラムを作ろうとしたところ、早速ハマってしまいました。 cocos2dを使用するアプリでARCを使用可能にする方法はいくつかあるようですが、 Learn Cocos2d 2: Game Development for Iosの著者がお勧…