リンク
とp

2012年08月26日

そのよんFour、iPhoneアプリ開発中、cocos2d,バグ、エラー、事例対応検討履歴、目指せー副業収入:月5万円以上、簡単にいきそうで上手くいかないアイフォンアプリ開発ですが徐々にコツがわかってきました。2012年8月20日から8月24日

そのよんFour、iPhoneアプリ開発中、cocos2d,バグ、エラー、事例対応検討履歴、目指せー副業収入:月5万円以上、簡単にいきそうで上手くいかないアイフォンアプリ開発ですが徐々にコツがわかってきました。2012年8月20日から8月24日

今回は、スプライト画像を数枚の画像を切り替わりつつ、A点からB点の2点間移動を設定しようとしました。
そして、一時停止だるポーズPauseを入れようとしました。
そのときのバグとエラーの対応について、検討、改善、調査した履歴です。
一部、または全部改善されていないところもあります。

<現在の状況動画7>
ゲームオーバーで再度ゲームを開始するバージョン

<現在の状況動画8進行中のもの>
1面クリアで2面に移動するバージョン、進行中。

ひよこさんをタップすると得点になります。ひよこさんがワニさんに食べられるとミスです。

<バグ、エラー、事例>
1.runActionが動かない CCAnimation等を利用した場合
  A. 記載する箇所、プログラム行を確認しましょう。
2.PauseはNSTImerがとまらない
  A. NSTimerを止めるときは、invalidateを使いましょう。
NSTimer *tm
とした場合、NSTImerを止めるときは
[tm invalidate]
 でも、cocosのschedule:@selector(test:) interval:1.0fなどを活用すれば、そんなことはなかった?(未検討。)

3.ccTouchEndedが反応していない(前回のバージョンまで問題なく動作していたのに)
 A. スペルミスに気をつけましょう。コンパイルエラーが表示されなくて、実行してもエラーにならないことがあります。

4.XCODEでプロジェクト作成のindexingが延々と作業している状態を止めたい場合
  XCODEでプロジェクトを作成すると、自動でインデックスを作成します。しかし、この処理がMacBookPro(Core i7)であっても数分かかり、処理が重たい。ATOK2012日本語変換が遅いくらいです。
  しかも、どこかで失敗すると、何度も何度もインデックス作業を続けてしまいます。
 当初は100ファイル程度が、600ファイルにまで増えてしまいました。徐々に増えて増殖中。Gぶりの様です。(嫌だ怖い。おじちゃんでも嫌。)
しびれを切らして、どうやって、XCODEのindexingを止めれば良いのか調べてみると
次へ続きます。
xcodeで補完がバグった時の対処法にありました。要点のみ記載すると
オーガナイザを開き、プロジェクトタブを選択し、Derived Dataを削除するそうです。
しかし、実行してもいっこうに、インデックスが止まる気配がありません。

そこで、一旦XCODEを終了して、
再度、起動して、(1)を 試しました。
また、一旦XCODEを終了して、
再度、起動すると、インデックスの作成は止まりました。
そして、補完機能も正常です。

次回からプロジェクトの作成は、storyboadのチェックを無しにしてやってみます。



以下、詳細に記載します。

1.runActionが動かない
アクションの設定[CCAnimate action...や[sprite runAction:...]を(void)updateに設定しましたが動かず、コンパイルエラーはないのですが、実行してエラー。
そこで、
 アクションの設定[CCAnimate action...や[sprite runAction:...]を(id)initに設定したところ、動作しました。
<画像111>
画像111.png


runActionの記載設定位置が悪かったようです。
 また、CCAnimationをスプライト毎に配列に入れてましたが、やめました。理由は、正常に動作しなくて、フレームレートが再生するたびに低くなって、60、30、20、10フレームとカクカクになってしまいました。
いくつも追加されているようでした。

アクションとスプライトが対になるので、同一のアクションがスプライト毎に複数個必要とならないようです。
なお、個別にアニメーションをしたい場合は、複数個のアクションが必要となるのかもしれません。


2.PauseはNSTimerがとまらない(schedule:@selector(test:) interval:1.0fを使えばいいんではないですか?)
コーディングのはじめはNSTimerを使って、 [CCDirecter ..]pause]を使用しました。
アニメーション等の動きは止まりましたが、NSTimerは動いていました。
正確には、プログラム自体は動作しているので、タイマーを止めたければ、他の処理を入れて止めなさい、ということでしょうか。
NSTimer *tm
について
[tm invalidate]
として、止まりました。Resumeについて、正常に動き始めます。これでいいらしい。
そもそも、NSTimerをつかわずに、schedule:@selector(test:) interval:1.0f
を使えばよいらしい。
-(void)test:(ccTime)dt{count++://etc.}
そうすれば、 pauseで止まるかもしれない。(未対応です。現時点8月25日)

3.ccTouchEndedが反応していない(結論は、スペルミスです。)
上記の1,2の他、シーンを追加した後、タッチイベントが反応しません。CCAnimaも動作しました。
 replacesceneシーンを追加してシーンの切り替えも期待した動きではありませんがほぼOK。
いままで、ccTouchEndedは反応していました。ひよこさんをタッチできていました。
 ここで、整理します。
(1)症状
 ccTouchBegan,ccTouchEndedを設定しました。iPhoneアプリをシミュレータにて実行し、タッチをするもccTouchBeganは、正常に反応します。
 しかし、ccTouchEndedは、タップしても反応せず、ブレークポイントを入れてもその場所を全く通過していません。
そのため、デバッグとれーすできず。

(2)その前の動作
CCTouchBeganは、記述してあるが、return YESのみ記載。
ccTouchEndedは正常に動作していた。ひよこをタップできていた。問題なく、動作OK。

(3)直前に記載追加したコードや内容
replacescene用シーンクラスを追加、ccTouchBeganに座標判定用のIF文を追加、CCAnime等を追加。

(4)検討、推測、調査
  1.前バージョンのプロジェクトコードを利用して、ccTouchBegan,ccTouchEndedの動作を確認する
  2.CCAnime等のコードを記述して動作を確認する。
  3.シーンクラスを追加して動作を確認する。replacesceneが悪さをしている可能性有り

(5)原因
  (4)の結果をまとめます。
 <1.前バージョンで動作の確認ができた場合>
 前バージョンで動作が可能で、現バージョンで動作不良の場合、現バージョンのコード記載が間違っていることになる。
 関数メソッドの記載順、コードの記載順を再確認してみる。
 どうしても原因がわからない場合は、前バージョンを、もとに改めてプロジェクトを作成してコードの入力をしなおしてみる。
 <実施状況>
 1.前バージョンのプロジェクトコードを利用して、ccTouchBegan,ccTouchEndedの動作を確認しました。
 2.CCAnime等のコードを記述して動作を確認しました。
 前バージョンで正常に動作します。
 次に 3.については、現バージョンの追加したシーンクラスを削除します。
 これで、現バージョンが正常に動作すれば、追加したシーンクラスが原因でタッチのイベントが正常に動作しないことがわかります。
 コメントにしましたが変化ありませんでした。
 原因がわかりました。
 

ccTouchEndedの誤記

でした。これが原因で、タッチのイベント取得できていませんでした。
ccTouchEndedを

ccTouchesEnded(誤記)

にしていたミスです。
コンパイルエラーも表示されていないことからそのまま、何も気にせずに使っていました。
ふとよく見ると、Touchではなくて、Touch*es*になっていました。
きちんとccTouchEndedにして、確認できました。
 追加したシーンクラスの影響ではありませんでした。
 なんともスペルミスとは。
熱中していると、他のことが見えませんね。

 <2.前バージョンでも同様の結果の場合>
 ccTouchBeganは、タッチ反応するので、ccTouchBeganにccTouchEndedに記載された内容を移してみる。
 また、ccTouchEndedは、これまで動作していたのだから、ccTouchBeganを削除してみる。
>>前バージョンでは正常に動作しましたので、この調査は打ち切ります。


(6)対策、回避策、別案
 対策は、

ccTouchesEnded(誤記)

を正常な、「ccTouchEnded」として記載しました。

(7)結論、今後の対応
 今後の教訓:
 動かないときは、ログを出力して、一旦、前のバージョンで確認し、その後、現バージョンを確認しましょう。
 そして、コンパイルエラーが表示されなくても、スペルミス、変数、メソッド関数、クラス名の誤記がないかを確認しましょう。


 
次は、ポーズの設定、別のシーン、2面、3面への切り替えです。
pauseポーズの設定は、簡単にcocos2dに用意されている pauseを使用しました。
方法は、
画面のある領域かポーズ用のボタンをタップするとポーズとなるようにします。
ここで、問題がありました。
標準のpauseでは、画面をタップできることです。当然ながらresumeする必要があるので、タップできなければなりません。
しかし、タップできるスプライト画像が、resumeのみのスプライト画像ならよいのですが、他のスプライト画像もタップできます。当然です。

つまり、ポーズにしたとき、Resumeボタンのみを押せると思っていると、画面の制止しているスプライト画像をタップできてしまいます。
ポーズと言うことなので、画面上のどこを触っても変化しないはず。これを期待したのですが、違ったようです。

そこで、pause用のフラグ変数を別途用意しました。
この値が0ならば、スプライト画像がタップできます。
この値が1ならば、スプライト画像の処理を無視するように条件判定を入れました。
また、NSTimerについては、resumeをしても再起動しませんので、再度NSTimerを設定しました。
<画像211>

もっとかっこよくスマートな方法は、
レッスンノートのように、一部のアニメーションを動作させながら、ポーズはもう少し勉強してからにします。

他にも
playsnackgames.com - Making delicious games. このサイトが参考になりそうです。
ポーズの問題は、単にシーンが切り替わるだけではなくて、アニメーションやタップの処理をある程度限定して、止めなければなりません。
そして、再開させる必要があることです。
意外にこれが難しいですね。
単に、ループで別の処理に移動させれば良いのでしょうか。



次に、シーンの切り替わりというかゲームの2面、3面への切り替えとゲームの進行を進めます。
ある一定数のひよこを救出できたら、次の面に移動します。
できれば、2面、3面と、他のシーンに切り替わることがわかるように、バックグラウンド画像を変更するか、面数をどこかに表示させたいと思います。
<画像212>

たとえば、
A.2匹助けます。
B.成功表示シーンに代えて、「1ミッション成功です。クリアしました。」
C.次の2面シーンに変わります。
D.2匹助けます。
E.成功表示シーンに代えて、「2ミッション成功です。クリアしました。」
F.次の3面シーンに変わります。
G.また、2匹助けます。
H.成功表示シーンに代えて、「ゲームクリア。おめでとう。」、1メニュ「Regame」、2メニュ「(他)」
I.(H)のメニューで分岐
 となるようにしてみます。


<<今後の予定>>
次の作業は次のようにしてみようかと思っています。
これくらいあれば、ゲームとしての機能が一通りそろったのではないでしょうか。

8ランキング表示、
9 サウンド作成、設定
11 ボーナスアイテムの出現
12 ボーナスアイテムの取得による各種変更、

以上

画像1/35 ガンヘッドコトブキヤ [KP190 ガンヘッド]


画像【新品】プラモデル プラモデル 1/144 RG RX178 ガンダムMk-II(エゥーゴ仕様) 「機動戦士Zガンダム」RG第7弾RX-78のガンダムの正統後継機登場RX-178 ガンダムMk-IIです。新規アドヴァンストMSジョイントを採用したムーバブル・フレームの可動性の自由度の高さ
posted by goodman at 20:23| Comment(0) | アイフォンiPhoneアプリ開発 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス: [必須入力]

コメント: [必須入力]

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。