Androidアプリ開発したい!

IT屋がGalaxySを手に入れてからAndroidに興味が湧き、いろいろと開発したりしてます。 GalaxyNexusがメイン機となり、ようやく普及し始めたAndroid4.0への関心が高いです。 仕事では、iPhone向けとかのソシャゲ作ってます。

Android開発

SRPGをクォータビューにしてみました。

クォータービュー

ついにやったった!念願のクォータービュー!!!

計算は結構本とか参考にしました。大体以下の構成。

  • グリッドは真っ白のひし形画像(長方形のサイズ)を並べて表示してる
  • 色は真っ白の画像に色をブレンドして表示してる
  • あと静止画だからわかりにくいけどちゃんとalphaを変えて点滅とかしてます。

device-2013-06-01-143702

フリックでマップ移動

どの方向(角度)向かってフリックしたかと、フリックの距離でマップを移動してます。

device-2013-06-01-143735

タッチした位置の判断

タッチ位置の座標とマップ移動距離からマップ座標を計算してます。

黒くなってるとこがタッチした場所です。

device-2013-06-01-144255

今後の動き

というわけで、以前に俯瞰ビューで結構作りこんだSRPGをクォータービュー対応して完成させていきますよっと!!!

AndEngine FPSが出ないとき

今回の趣旨

ちょいちょいスクリーンショットを載せていましたが、実は現在SPRGのゲームを作っています。

敵のターン以外は、特にタイマー制御とか使ってないので油断して自由に開発していたら、キャラクターを表示しまくるとガクッっとFPSが下がる現象がでたので、その時の対策とか備忘録です。

調査した内容

歩行アニメーション

まずこれを疑いました。たくさんキャラがいてみんな歩行アニメーションしているので、これを止めたらどうだろう?と思ってやってみましたが、反応なし。。。

AndEngineの大本にあるスレッドでうまく描画してるんだろうなぁーと予想。

オブジェクト数

プレイヤーキャラのクラスには、カットイン演出や攻撃エフェクトなど色々なSpriteを生成して非表示にして持っていました。これを減らしてみたところ、20FPSくらいだったのが25FPSに・・・あまり変わらない。。。

オブジェクトの生成タイミングをゲーム中に行うと結構固まるので、うまく別スレッドで生成するか起動時にやらないといけないので、これは仕方ないコストかと思います。

まあ、それでも確実に不要になるものはケースによって使わないことが確定するものは生成しないようにしましょう。

オブジェクトのサイズ

よくよく考えると、カットインとか色々あるからプレイヤーキャラのクラスは、Rectangleを画面いっぱいに引き伸ばしてベースのレイヤーみたいな感じにしていました。

この上に歩行グラとかカットインとか攻撃エフェクトをattachしてたのですが。。。まさか!!?

ええ、まさにこれでした。

すべてのプレイヤーキャラが画面いっぱいのオブジェクトを持っていたので、いくら透明にしていても描画ストレスになりますよね・・・

というわけでRectangleの縦横のサイズを最小限のサイズ(1グリッドのサイズ)にしたところ見事52FPSくらいに復活!!

ちゃんとさくさく動いてます。

透明だからって油断していましたが、逆に透明のほうが大変なのかな・・・

というわけでソースコードは特にないですがそんな感じでした。

device-2013-02-03-213953

素材提供:臼井の会
素材の二次利用、販売、再配布を禁じます。

AndEngineで文字入力のダイアログを表示する

AndEngineのソースを漁っていていたら中々便利そうなクラスがあったので、ちょっと試してみました。

StringInputDialogBuilder

String文字列を入力させるダイアログを簡単に生成するBuilderみたいです。

AndroidのリソースIDとコールバックを設定するだけで簡単に実装できました。

実装

大体こんな感じ。


コメントにもあるとおりToastとかDialogはUIスレッドでないと動かないので注意。

こういうエラー出ちゃいます。

FATAL EXCEPTION: UpdateThread
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.(Handler.java:121)

動かしてみた感じ

結構いい感じ。IMEはGoogle日本語IMEです。

device-2013-01-14-161319

device-2013-01-14-161340

入力系のウィンドウとか独自で作るのは嫌だなーと思ってたので、助かりました。他にもメニュー的なやつとかないのかな。。。あと画像が不要なテキストボタンSpriteクラスとかあればいいんだけど・・・

まあ、無ければ自分で作るしかないか。

ゲームエンジン側というかフレームワーク側のソースを追っていくのも慣れてきたのでガンガンいきますぞー

AndEngineのTextで改行させる方法

ええ、見事にハマりました。テキスト改行できないじゃん!

じゃあ自分でやるか!!!と思って独自実装で完成させた後にText.classみてたらAutoWarpとかなんかあるぞ。。。と俺の2時間返せー!!という状態に陥ったのでメモを残します。

あと、wiki文法で書いてみました。

Markdown対応しないかなぁ。

やりたかったこと

ノベルゲーム風な会話ウィンドウの作成。テキストを複数行に表示。

イマイチな実装方法

AndEngineのTextクラスをListでもっておいて、行毎にTextクラスの高さ分ずらして表示する。

※アンチパターンすぎる実装なので、全ソースは載せません。こんな感じという雰囲気だけ掴んで貰えればと

// 最大文字数でテキストウィンドウを作成
int textMaxLength = getMaxLength(talks);
int textMaxLine = getMaxLine(talks);
for (inti = 0; i < textMaxLine; i++) {
     Text talkText = new Text(16, 16, font, 
          getSizeToStr("-", textMaxLength), 
          new TextOptions(HorizontalAlign.LEFT), 
          baseScene.getBaseActivity().getVertexBufferObjectManager());
     
     talkText.setPosition(0, i * talkText.getHeight());
     talkTexts.add(talkText);
}

TextクラスのTextOptionsクラスについて

フィールド変数は、以下4つあります。

AutoWrap mAutoWrap;

テキストの折り返しについての設定。

  • AutoWrap.NONE : 自動折り返しなし、普通に「\n」で改行してくれる
  • AutoWrap.WORDS : 半角スペース毎に改行
  • AutoWrap.LETTERS : mAutoWrapWidthで指定した幅を超えたら改行
  • AutoWrap.CJK : 基本的にはLETTERSと同じで最後の行に空行を付与する感じなのかな?
float mAutoWrapWidth;

テキスト折り返しの基準となるWidthの設定。AutoWrap.LETTERSの時とAutoWrap.CJK時に有効。

float mLeading;

よくわからない。。。

HorizontalAlign mHorizontalAlign;

左寄せ、右寄せとかの設定。

  • HorizontalAlign.LEFT : 左寄せ
  • HorizontalAlign.RIGHT : 右寄せ
  • HorizontalAlign.CENTER : 中央寄せ

わからなかった奴は、分かり次第追記したいと思いますー。内容が間違ってたり謎の部分が分かる方は、コメントいただけると助かります!!!

実装した結果こんな感じ。

文章は外部テキストファイルとかを読み込むつもりなので、下手に文字数で改行とかされるよりこっちで改行文字入れたほうが扱い易いと思ったのでAutoWarp.NONEにしました。

device-2013-01-13-170653

何か( ー`дー´)キリッとしたセリフ吐いてますが、これはSAOのキリトさんの名言です。

あ、今回利用している画像について一応。

素材提供:臼井の会
素材の二次利用、販売、再配布を禁じます。

AndEngineのScene上でAndroid標準のToastを表示したいとき

あけましておめでとうございます。
まさか新年一発目の更新をするとは思ってもいませんでした。
普通に開発しててブログをアップして年越してることに気がついて追記しました(笑)

おそらく、ぐぐってちらっと寄る人が多く、
定期的に見てる人はほとんどいないと思いますが、
今年もよろしくお願いいたしますm(_ _)m

■Toastを表示したいとき

普通にgetBaseActivityをContextに呼べばいいのでは?と思ってやってみると見事にエラーで落ちました。
どうやらUIスレッド上でないとToastは呼べないみたいです(当たり前か!w)

というわけで、以下のようになります。

剣を振った時にトースト表示してみました。

device-2013-01-01-131339.png

■まとめ
 
AndEngineは、OpenGLベースで良い感じのゲームエンジンだと思います。
ゲームで必要な機能はほとんど実装できそうです。

あと、Android自体のActivityとかは維持しているので、
結構使い勝手はいいと思います。
(layout.xmlとか使えるのでWebViewとかも簡単におけるし!)

しばらくAndEngineで色々やってみようと思います。
 
持ってる端末
・Galaxy S root化済    (2.3.6)
・Galaxy Nexus          (4.1.1)
・GALAPAGOS A01SH (4.0.4)
・ONDA Vi10              (4.0.3) 
・iPod Touch           (iOS 6.0)
記事検索
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

  • ライブドアブログ