読者です 読者をやめる 読者になる 読者になる

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

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

Objective-C

【Objective-C】NSUserDefaultsに値を書き込んだらsynchronizeをすべきなのか?

音量調節ボタンやミュートボタンをアプリに追加しました。ゲーム実行時画面には音量調節とミュートのON/OFFボタン、タイトル画面にはミュートのON/OFFボタンを配置して早速テストしてみると、ゲーム内でミュートしたはずなのに再起動後のタイトル画面ではミ…

【TravelShooting JP】ゲーム開始時の処理をタイトル画面で済ませてレスポンスアップ!

順調に開発が遅れているTravelShooting JPですが、そろそろタイトル画面を付けて見たくなり、タイトル画面としてcocos2dのシーンを1つ追加しました。タイトル画面にボタンを1つ配置し、押すとゲームがスタートするようにしてみたのですが、嫌なことに気がつ…

【Core Motion】モーションセンサー使用時にだんだん座標がずれていくのを防止する

以前、Core Motionを使ってモーションセンサーでゲームを操作する方法についてブログを書きました。【cocos2d】Core Motionを使ってcocos2dゲームをモーションセンサーで操作 - 夏までにiPhone アプリつくってみっか!iPhone4Sだとそれほど気にならなかった…

【cocos2d】Core Motionを使ってcocos2dゲームをモーションセンサーで操作

前回、 【偽スペースハリアー】自家製スペハリfor iPhone完成!これからが本番 - 夏までにiPhone アプリつくってみっか! で一応完成した偽スペハリですが、まだまだプロトタイプとして実験に使って行きます。今回は、CoreMotionフレームワークを導入し、加…

【Objective-C, cocos2d】BGMの切り替えを並列処理して画面のコマ落ちを防ぐ方法

前回、 【cocos2d】テクスチャーをキャッシュに先読みしてゲーム中に画面が一瞬止まるのを防ぐ方法 - 夏までにiPhone アプリつくってみっか! で画面のコマ落ちを防ぐためにテクスチャーの先読みを行いました。 これで完璧か!とテストをしてみると、改善は…

【Objective-C】.plistファイルを経由せず直接.csvファイルからデータを読み込む方法

これまで敵生成データ、敵の動きのデータ、敵の攻撃などのアクションのデータは.plistファイルから読み込んでいました。 .plistファイルからNSArrayへの読み込みは1行で書けるので便利なのですが、これらのデータをいきなり.plistファイルとして書くのは困難…

【Xcode, Objective-C】メインバンドルの下にディレクトリーを作り中のファイルにアクセスする方法

.plistファイルなどのリソースファイルが増えてきて見た目にもプログラム的にも整理したくなってきました。 見た目に整理するだけならXcodeで適当にフォルダーを作ってファイルをぶち込めばいいのですが、それだとプログラムから見たときにはメインバンドル…

【偽スペースハリアー】.plistに従い敵キャラを生成

これまではランダムな位置に敵キャラを生成していましたが、今回からあらかじめ決めた位置・タイミングで敵を生成するようにしました。敵キャラは「名前」、「x座標」、「インターバル」をキーとした.plistに記述し、そこから読み込むようにしました。.plist…

【cocos2d】Xcode5で新規cocos2dプロジェクトを一番簡単にARC対応にする方法

以前、 【cocos2d】cocos2dプロジェクトをARC対応にする - 夏までにiPhone アプリつくってみっか! でcocos2dプロジェクトのARC対応について書いたのですが、久々に新しいプロジェクトを作ってみると上手く行きませんでした。環境がXcode5に変わったのがが原…

【iPhoneアプリ】英語アプリをローカライズして日本語対応にする方法

BeeClusterは世界各国でダウンロードされる事を期待してユーザーインターフェースは英語で表示していました、というのは建前で、本当はローカライズするのが面倒だったためです。 最近は日本でのダウンロードすうが圧倒的なので日本語にローカライズしたいと…

【BeeCluster】コンボヒットでスコアをインフレーション

BeeClusterは上手い人でも下手な人でもクリアしたときのスコアは1万3千何百点に落ち着いてしまうのでスコアアタックの楽しみはありませんでした。 せっかくなので上手い人は高得点を取れるようコンボヒット制度を取り入れます。 敵を連続して倒す事でコンボ…

【BeeCluster】一瞬「うっ」となるTwitterボタンのレスポンスを改善

すみません。この方法は根本的にダメでした。 iOS5.0.1の実機だと一応動作していたのですが、iOS6のシミュレーターでクラッシュしました。 __weak指定の_tweetViewControllerが解放されるのが原因でした。 __weakを外すとリテインサイクルになるかもしれない…

【cocos2d】BeeClusterにTwitterボタンをつけてハイスコアをツイート

BeeClusterにツイートボタンを付けてツイッターでハイスコアをつぶやけるようにしてみました。追記:この方法でツイッターボタンのレスポンスが遅いと感じた方は「【BeeCluster】一瞬「うっ」となるTwitterボタンのレスポンスを改善」もご覧下さい。全面的に…

【BeeCluster】難易度設定機能を追加。セッターメソッドでいろいろやってみた。

いろいろな方から「難しい!」とご指摘を受けております、BeeCluster。 1面しか遊んでもらえないのではもったいないので、次のアップデートでは難易度設定機能を追加します。敵や敵の弾のスピード、敵の攻撃確率をコントロールする機能はすでにプログラムし…

【cocos2d】色が変化するライフゲージをボスにつけてみた

現行バージョンのBeeClusterはボスキャラのダメージがどれほどなのかがわからず戦っていて不安になるのでライフゲージをつけてみました。 また、ライフの残量に合わせて色を緑から赤に変化させることでより一層のダメージ感を演出しています。 まずは、動画…

【cocos2d】cocos2dプロジェクトをARC対応にする

追記:Xcode5だとここに書いてある方法ではは上手く行かないみたいなので、もっと簡単なこちらのリンクに書いてある方法をオススメします。 【cocos2d】Xcode5で新規cocos2dプロジェクトを一番簡単にARC対応にする方法 - 夏までにiPhone アプリつくってみっ…

【BeeCluster】取りあえず完成!しかしiPad6.1シミュレーターでクラッシュ!最適化の副作用か?

4月1日にプロジェクトを開始したBeeCluster。 本日6月18日に完成しました! 3ヶ月で開発するという目標は無事達成しました。 あとはAppleに審査に出してリリースとなりますが、やり方はこれから調べます。と思ったらiPad 6.1シミュレーターでクラッシュする…

【Objective-C】リリースビルドでクラッシュ発生!原因はあいつか!

そろそろリリース時期も近くなったので、初めてリリースビルドを試してみました。実機で走らせてみると全ての敵キャラクターが画面左下に向かって飛んで行きます。そしてしばらくするとクラッシュ。 そして、シミュレーターで実行する場合は正常に動きます。…

【Objective-C】NSUserDefaultsを使ってハイスコアをセーブ

BeeClusterのメインプログラムがほぼ完成し、リリースに向け少しずつ改良しています。 今回は、NSUserDefaultsを使ってハイスコアを記録できるようにしました。 アプリケーションを削除しない限りハイスコアを保持できますので、ハイスコアを更新する楽しみ…

【cocos2d】addChildのzパラメーターでスプライトを順序よく重ね合わせる

BeeClusterの最終面では蜂の巣から幼虫が飛び出してくるという演出を考えています。 蜂の巣を斜め上から見下ろしているようなアングルになります。 幼虫が巣の各部屋の中に入っているように見せるには、幼虫は上の壁と下の壁の間に重ね合わせる必要がありま…

【cocos2d】CCParallaxNodeでサクッと多重スクロール

こちらのポストではCCParallaxNodeを使わずに多重スクロールする方法を解説しました。 今回はCCParallaxNodeを使って手軽に多重スクロールを実装したいと思います。 せっかくなので背景1枚+前景4枚の5重スクロールとしました。 CCParallaxNodeによるスクロ…

【cocos2d】クマの目玉を動かしビームを発射

今回はBeeCluster 4面のボスとして登場するクマの目から発射する赤いビーム光線についての解説です。 今回はこのゲームで初めてCCTint系のアクションを使ってみました。 まずは動画でクマの動きをお確かめください。 クマの目玉がハチを追って動いているのが…

【cocos2d】ダミーのスプライトを使った当たり判定

BeeCluster 4面のボスのクマ。 時折腕を振り回して攻撃してきます。 今回は、クマの腕に使用した、ダミースプライトによる当たり判定について書きたいとおもいます。 BeeClusterの当り判定は全てオブジェクト同士の距離を計算して行っています。 つまり、オ…

【BeeCluster】4面が完成!

BeeCluster 4面の敵キャラの配置が完了しました。 高速スクロール部分があまりにも高難易度で何度トライしてもボスまでたどり着けなかったので木の配置を見直し、行き止まりになっている部分を修正しました。 適度にスリリングであまりイライラしない難易度…

【cocos2d】CCEaseBackInアクションでクマをズシンズシンと歩かせろ!

BeeClusterではSteering BehaviorsのArrivalという方法でキャラクターの動きを滑らかにしています。詳しくはこれらのポストをご覧ください。 空中を飛ぶ虫は滑らか動きが必要なのですが、地上を歩く動物はどうでしょうか? あまり滑らかに動くと歩いている感…

【cocos2d】CCAction実行中の時間の経過にご注意!

cocos2dのCCAction実行中は時間が経過し、プログラムの他の部分が実行されるという事に注意する必要があります。 これに気づかずに私は昨日のポストのプログラムにバグを仕込んでしまいました。例えば、このlandメソッドのCCScaleToアクションとCCCallBlock…

【cocos2d】バッタがジャンプする動きを実装。しかし見えない・・・

今回はBeeClusterの4面にバッタを出してみました。 しかしイマイチな結果に・・・まずは動画をご覧ください。 草むらから弾が飛び出してきて、そのあと虫が飛び出してくる様子がわかりますか? 草むらにはバッタが潜んでいるのですが、そのあまりの保護色っ…

【cocos2d】スクロール速度を変化させてみた

BeeClusterの4面には高速スクロール部分を作ろうと考えています。 いくつかの方法を考えてみましたが、結局素直にCCMoveByアクションをずらずらと並べるというシンプルな結論に達しました。 まずは動画をご覧ください、ステージ開始後40秒からじわじわとスピ…

【BeeCluster】3面を最後まで実装しました

6月中にAppleの審査へ提出する事を目指して急ピッチで製作中のBeeClusterの3面が完成しました。 6月最終週は本業の都合上こちらの作業ができない事が決定していますので、実質あと1ヶ月で完成させる必要があります。 今日はようやく3面が完成しました。 こち…

【cocos2d】3面ボスのカブトムシを実装してみた

BeeClusterに3面のボスを実装しました。 最強の昆虫、カブトムシです。 まずは動画をご覧ください。 何やら背中の上の回る部分から大量に弾を吐いてきます。 そして、時々自機に向かってくると弾の間隔が狭くなって避けるのが大変になります。 今はテスト実…

【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版作者: 荻原剛志出版社/メーカー: ソフトバン…

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

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