スポンサーサイト

--.--.--.--.--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

新しいゲーム作成中

2014.06.21.Sat.12:35
今日も朝からAndEngineこねくり回しているbaririnです。

もやし君も残すところステージ3-2、3-3だけとなりました。
バグを除外するとして、あとはマップデータを作成するたけとなったので、
新しいゲームのたたき台を作っています。

今回のゲームは数独です。

もやし君で覚えたTMXレイアウトの設定を流用すれば、
初期値が固定となるマップ情報は作りやすいだろうと考えて、一週間で作ってみよう的なね
クロスワードと悩んだんですが、簡単そうな方を選択です(^^;

基本的な作りは以下の3点
・TMXで数独マップ作成
・ロジック上で配列に格納
・タッチイベントで空白マスへ任意の数字を設定

集中して作ればたたき台レベルなら、この週末にリリースできるかな?
たぶん、いろんな不具合でリリース遅れるんでしょうけど(汗
スポンサーサイト

強制終了に関して

2014.06.15.Sun.22:03
アプリを試験プレイしていると、
『たまに』よくわからないエラーが発生することありませんか?

えぇ、私はいつものことです(汗

よくわからないってのは正しくないですね。
『私の知識では』わからないエラーが・・・ですね。

空飛べ(ryをテストプレイしていて、たまに強制終了が発生するんですよ。
で、ログを見てもいまいちわからないってので、ずいぶん前から放置していたものがあります。
定番ですが
『the連打試験!』
webシステムなんかだとsubmit時の連打試験は定番なんですが、
空飛べ(ryでもやってみたのですが、、、
やっぱりおかしくなるよ(泣

動き方異常でどうしたものか、プレイを続けるとエラー発生

まいった。
ログでは別スレッド上のエラーに見えるんだけど、意味わからん。。。

とりあえず、ダブルタップ対策を入れ込んだんだけど、
まだ発生することがある。
この週末にちゃんと調べてみたのですが、
どうやら原因ってのは、タップしたタスクが処理されるまでのタイムラグで矛盾が発生するため?
調べたけど、よくわかってないですw

よくわかってないけど、ちゃんと落ちずにフリーズされる症状がでるのはあまりにも見栄えが悪い。

ってことで、拾えていないエラーをすべて拾って、強制終了するように地味に修正
(ユーザビリティがないのは今は勘弁してください(TT

で、ぐぐってみると
UncaughtExceptionHandler
ってのを使えばよいらしい
http://www.adamrocker.com/blog/288/bug-report-system-for-android.html


私のゲームのベース部分は定番ですが
『AndEngineでつくるAndroid2Dゲーム』っての使ってるんで
mainActivityのonCreateScene()において
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler(this));
を生成してみました。
詳しい説明は上のサイトなど見てください。

ログとってみると、ちゃんと拾えてる♪
で、定番の終了処理でfinishさせてみたんですが、
強制終了後に再度アプリを起動してもフリーズしたままなんですよ

ここでどうしたものか悩んだんですが、
結果として
System.exit(0);
で終わらせることに・・・

これはやっぱりまずいのかな・・・
ライフサイクルを考えるとfinish()にすべきなんですけど、
ライフサイクルをandroidに任せると、いつDestroyされるかわからないし・・・

当分はこれで様子を見てみようと思います

unregisterEntityModifierの使い方

2014.05.22.Thu.22:59
先日の記事でSpriteに対するregisterEntityModifierの停止方法として
clearEntityModifiers()を紹介しましたが、

複数のregisterEntityModifierの中から一部の物だけを止める方法として、
unregisterEntityModifierとModifierの動きも記述してましす。

まずは参考ロジックです。

LoopEntityModifier lem = new LoopEntityModifier(
new SequenceEntityModifier(
new MoveXModifier(0.5f, getX(), getX()-100),
new MoveXModifier(0.5f, getX()-100, getX())));   //①左右に揺れる
AlphaModifier am = new AlphaModifier(3.0f, 0, 1);   //②徐々に表示される
MoveXModifier mxm = new MoveXModifier(3.0f, getX(), getX()-200);   //③左に移動
MoveYModifier mym = new MoveYModifier(3.0f, getY(), getY()-200);   //④上に移動

SequenceEntityModifier sem = new SequenceEntityModifier(am,mxm,mym);
//↑②、③、④の順に実行させる
Sprite.registerEntityModifier(sem);   //スプライトに登録
Sprite.registerEntityModifier(lem);   //スプライトに登録
Sprite.unregisterEntityModifier(sem);   //すでに登録されているsemのみを削除する。

このようなロジックを書く場合、
結果的に実行されるのは①だけとなります。

unregisterEntityModifierを行わない場合には
実行順は(②、③、④)と①が並行実行されます(ParallelEntityModifierを行うのと同じこと)

参考図書(AndEngineでつくるAndroid2Dゲーム)をまねると、
Sprite.registerEntityModifier(new ParallelEntityModifier(
new SequenceEntityModifier(②、③、④),
new LoopEntityModifier(①));
のようになるでしょうかね(たぶん

背景などはひとまとめにして記述するのもいいのですが、
敵の動きなど相対的に動きが変わるものには
後々EntityModifierを追加・削除したくなることがあります。

このような場合にはModifierを変数として持たせることでパーツ的に組み合わせることができます。
(フィールド変数に持たせればいろんなところから取り出せます)

eclipseでデバックする際に、Spriteを監視してみてください。
Spriteに格納されたModifierが配列(構造体?)として組み込まれているのがわかります。

画面エフェクトなどに使い勝手がいいですね。

ジャンプ処理

2014.05.17.Sat.14:00
もう初夏の陽気ですね
どうもすでに夏バテ気味のbaririnです。

さて、主人公のジャンプ処理に関してJumpModifierってのを発見しました。
ドキュメントを読めば一発でわかることだったのですが、ちゃんと読み込まないといけませんね。

もともとTimerHandler内でジャンプ処理を呼び出していたのですが、
うちの古いスマホさんでは画面描写の動きが重く、スマホの発熱量が多いんですよね。

で、TimerHndlerからジャンプ処理を切り抜いて、
onSceneTouchEventから直接ジャンプ処理を呼び出すようにしました。
さらに、ジャンプ処理をJumpModifierに任せることで、重力計算など煩雑なものはすべてAndEngineに喰ってもらうように変更。

JumpModifierはこんな感じ
JumpModifier jm = new JumpModifier(ジャンプ時間, 開始X座標, 開始Y座標, 着地X座標, 着地Y座標, 高さ);

もやし大戦のように主人公の開始座標、着地座標が同じ場合は

JumpModifier jm = new JumpModifier(2.0f, Sprite.getX(), Sprite.getY(), Sprite.getX(), Sprite.getY(), 100);
のようにするとその場でジャンプしてくれます。

ただ、2段ジャンプでは開始座標、着地座標が空中となるため、もやし君が空中を走るという困った事象が(--;
苦肉の策として、

Sprite.registerEntityModifier(new SequenceEntityModifier(
new JumpModifier(
1.0f,
開始X座標,開始Y座標,
着地X座標,着地Y座標,
100),
//地面まで落ち切りたい
new MoveYModifier(1.0f, Sprite.getY(), 地面のY座標)));
のように、ジャンプ処理後に無理やり地面まで叩きつけてます(汗

地面と接触した際には、Sprite.clearEntityModifiers();によりSpriteの動きを止めて地面の上にSpriteを再描写させればOK
(あれ?ブログ書いてて思ったけど、着地Y座標を地面のY座標にすれば落ち切ってくれるのかな?)

ちょっと無理やり感も否めませんが、TimerHandler内でのジャンプ処理を減らせたので気持ち動きが軽くなりました。

でも難点が一つ。。。

ジャンプ中に一時停止をするともやし君が地面にめり込みます(TT
Sprite.clearEntityModifiers()ではなく
Modifierを一時停止することってできないのかなぁ~と悩み中。。。

BGM再生 and SE再生

2014.04.30.Wed.18:29
BGM再生とSE再生とは別のクラスを使用する点に注意が必要です。

わかってしまえば余りにもバカバカしい話なのですが
2日もはまりましたorz

BGM再生に使用するクラスは
MusicFactory

SE再生に使用するクラスは
SoundFactory

私の場合は先にSEを組み込んでいたので、
BGMに関してもSEと同じSoundFactoryを使いまわしてしまえと考えてたのですが、
BGMファイルが読み込めても再生されないという状態に・・・

ためしにSE用のファイルを使用すると、ちゃんと再生されます。
なら音楽ファイルがだめなんだろうと見当違いの方向の調査、
音楽ファイルを数種類作成してならない・ならない・ならない・・・の繰り返しでした。

原因は上記で書いたMusicFactoryを使用しないといけないのですが、
一番の原因は私の思い込みです(汗

ちゃんとMusicFactoryを使用している例を掲載してるサイト様などあったのですが、
脳内変換ですべてSoundFactoryと認識してしまってました。

BGMとSEを使用するためには

public EngineOptions onCreateEngineOptions(){
engineOptions.getAudioOptions().setNeedsMusic(true);
engineOptions.getAudioOptions().setNeedsSound(true);
}

protected Scene onCreateScene(){
//BGM
MusicFactory.setAssentBasePath("music/");
//SE
SoundFactory.setAssentBasePath("se/");
}

public void prepareSoundAndMusic(){
bgmSound = MusicFactory.createMusicFromAsset(pMusicManager, pContext, pAssetPath);
enemyAttackSound = SoundFactory.createSoundFromAsset(pSoundManager, pContext, pAssetPath);
}

略してますが、ことごとくがmusicとsoundの違いです。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。