2014年12月31日水曜日

講座記事をアップしました「ゲームループとシーンについて」

最近動画作成と講座記事作成がメインになってます。

AndEngine講座第3回をアップしました。
第3回:ゲームループとシーン - ほっぽこ開発Andengine講座:

動画版はこちら

今回はプログラミング作業は無く、考え方の説明だけです。
ゲームプログラミングをしたことがあれば聞いたことがあると思います「ゲームループ」もしくは「メインループ」を、AndEngineではどう処理するかについてを説明しています。

図をぐりぐり動かしてたら作業時間がかなり長くなってしまいました。大変でしたが面白いです。
動画作成とゲームエンジンを使ったゲーム開発は、結構類似点があって最近とても興味深いと感じます。

そろそろ講座でもゲーム制作に入っていきたいです。簡単なミニゲームを作ろうかと思ってます。

2014年12月26日金曜日

AndEngineのGLES2でClipEntityを使う

講座の方で記事を書きました。

Entityのうち四角い領域を切り出す(クリップ)機能を持つClipEntityの使い方です。
AndEngineのGLES2AnchorCenterでしか使えなかったものですが、GLES2でも使える方法があったので調べてみました。
詳しくはClipEntityで四角を切り出して表示 - ほっぽこ開発Andengine講座: にて。

2014年12月20日土曜日

AndEngine講座はじめました。

AndEngineの使い方とかを紹介するページを作りました。

ほっぽこ開発Andengine講座

今後内容を増やせていけたらと思います。

また、講座内容を動画にもしてみました。


AndEngineの知名度、あがればいいなあ。

2014年12月12日金曜日

メインPCがお亡くなりになった件

題名のとおりの悲しいお知らせです。

開発に使っていたLinuxのデスクトップPCですが、先程ハードディスクがお亡くなりになりました。
ギリギリ1回だけ起動できたので何とか開発に関わるファイルは残すことができました。
新しいハードディスクの調達するまでは本格的な開発は難しいです。
逆に新作リリース直後のこのタイミングで助かったとも言えますが。

嘆いていても仕方ないので、出来ることでいろいろやってみようと思います。
サブのWindowsノートPCを使って1からAndengineの開発環境の構築とか。
記事にできたらいいなあと思います。

2014年12月7日日曜日

新作アプリ「無限もぐら」リリースしました!

前作「ゆっくり崩し」のリリースから約5ヶ月。ほっぽこ開発が贈るAndroidゲームアプリ第2弾!
無限もぐら
をリリースしました!


本作はもぐら叩き風のゲームとなっています。

もぐらを叩いて、レベルを上げて、より大量のもぐらを叩く。という暇つぶしゲームです。
通常のもぐら叩きとは違い、制限時間や反射神経の要素が全くありません。
どちらかというと梱包材のプチプチを一気に潰すような、そんな爽快感があふれるゲームです。

スクリーンショット


開発に関して

本作も、前作「ゆっくり崩し」と同様に、Andengineを使って開発しました。OpenGLの機能を使った高速な描画がなければ、この大量のもぐらは表現出来なかったと思います。色々工夫はしましたが、2012年の端末でも1000匹以上のもぐらを40fpsで描画できたので、やはりAndengineも、もっと広く知られるべきだと思いました。

パフォーマンス的な部分では色々工夫はしましたが、開発の大部分は前作と共通の作業だった気がします。思い出したり調べなおしたりする作業が結構あったので、その部分をあらかじめまとめることで、もっと早い開発ができたらいいなぁ。と思いました。

お借りした素材

前作の効果音はすべてSofTalkで作成したゆっくりボイスでしたが、本作では効果音素材を以下のサイトからお借りしました。高音質で使いやすい効果音が沢山あります。

効果音ラボ - フリー、商用無料、報告不用の効果音素材をダウンロード:

2014年12月6日土曜日

日本語や空白を含むテキストをTwitterに共有するIntentの使い方

アプリからTwitterに投稿したい場合、暗黙的Intentを使ってテキストを共有する方法があります。ですが、メモ帳などのアプリもテキストの共有先として候補に出てきてしまいます。

Android - Twitterに共有するIntentの書き方 - Qiita:
では、共有したいテキストをパラメータとして、Twitterの共有用URLに渡す方法が紹介されています。
ですがURLの文字列には、日本語や空白をそのまま含めることはできません。
このような文字列はエンコードする必要があります。

文字列のURLへのエンコードはURLEncoder.encode()というメソッドを使います。これを使ってtwitterにテキストを共有します。コードは以下のような感じ。

これで、簡単にtwitterにテキストを共有できます。

参考リンク

Android - Twitterに共有するIntentの書き方 - Qiita:
URLエンコーディング のしかた - Android アプリ の 研究所 アンドロイド ナビ:

2014年12月5日金曜日

大量のEntityをGenericPoolを使って再利用する

シューティングゲームの弾幕や、アクションゲームで敵を倒した際に敵に重なるように表示される得点のような、「表示する機会は多いけど、すぐに画面から消えるオブジェクト」を考えます。

Andengineでは画像を表示するならSprite、テキストならTextクラスのオブジェクトを生成します。

ですが、オブジェクトの生成は重くなるので、大量のオブジェクトを「必要になったら生成。不必要になったら削除。」といった処理で利用しているとFPSが落ちてしまいます。

このようなオブジェクトはAndengineのGenericPoolを使って再利用することで処理を軽くすることができます。

GenericPoolのイメージ

「Pool」とは泳ぐプールの他に「蓄える」といった意味があります。つまりGenericPoolはオブジェクトを蓄えておくのに利用するクラスということです。

ここでは、Spriteをシューティングゲームの弾として使っている場合を考えます。
シューティングゲームの弾は画面上に沢山現れますが、その全てはすぐに画面外に出て行ったり、キャラクターに当たったりして画面から消えます。
このようなゲームでは弾のSpriteをGenericPoolで再利用する場合、以下のような処理になります。

  1. 弾を画面上から消す際に、そのSpriteのオブジェクトを削除せずに、GenericPoolに格納する。
  2. 次に、新しいが必要になった際に、新しいSpriteオブジェクトを生成せずに、GenericPoolに格納されているSpriteを取り出す。
  3. GenericPoolが空の時に弾が必要な場合は、GenericPoolにSpriteオブジェクトを作らせる。
ここで、プールに格納することをRecycle。プールから取り出すことをObtain。新しくオブジェクトを作ることをAllocateといいます。

GenericPoolでの弾の再利用のイメージ

2014年12月1日月曜日

Andengineで透明度指定が上手く行かない場合の対処方法

AndengineでTextをフェードアウトする処理が上手く行かないことがあり調べたところ、解決方法が見つかったので残しておきます。

症状

Textの透明度をsetAlpha()で指定しても、「完全に透明」か「完全に不透明」にしかなりませんでした。
setAlpha(0)で完全に透明になり、それ以外の値では、値にかかわらず完全に不透明になってしまいます。「半透明にできない」とも言えますね。図はInkscapeで作成したイメージです。
Textが半透明にできない!
stackoverflowでの質問と、その質問記事でリンクされている公式フォーラムに原因と解決方法がありました。

2014年11月29日土曜日

TouchAreaBindingとは

Sceneには
public void setTouchAreaBindingOnActionDownEnabled(final boolean pTouchAreaBindingOnActionDownEnabled)

public void setTouchAreaBindingOnActionMoveEnabled(final boolean pTouchAreaBindingOnActionMoveEnabled)
というメソッドがあります。

ソースには
Enable or disable the binding of TouchAreas to PointerIDs (fingers).
という説明があります。訳すと
「タッチ領域のポインタID(指)への束縛を有効化、無効化する」 という感じでしょうか。
いまいちよく分からないので調べてみました。

タッチ領域の束縛とは

通常、タッチ領域(SpriteとかRectangleとか)に指を触れ、領域外までドラッグするとその領域のイベントは実行されなくなります。
しかし、タッチ領域がポインタIDに束縛されると、指をドラッグしてタッチ領域の外に出ても、指を離すまで、その領域のタッチイベントが実行され続けます。
これがタッチ領域の束縛です。

そして、この束縛が領域のタッチ時に行われるようにするのが
setTouchAreaBindingOnActionDownEnabled(true)
で、束縛が、領域外から指をドラッグして領域内に入った時に行われるようにするのが
setTouchAreaBindingOnActionMoveEnabled(true)
というわけです。
タッチ領域の束縛

2014年11月26日水曜日

ブログ始めました

Androidゲームアプリを個人制作している者です。

公式サイトとしてwikiサービスを使っているのですがbloggerの存在を知って興味を持ったので、こちらでも試してみようと思いブログを始めることにしました。

このブログについて

公開しているAndroidアプリに関してや、利用しているゲーム制作ライブラリ「Andengine」について等を書いていくつもりです。

「こんなアプリ作ってるよ」とか「こういう風にアプリ作ってるよ」という感じです。あと制作に関わる覚書等。