ページ 11

Androidの2Dゲームでジャンプしたい

Posted: 2012年11月16日(金) 22:06
by たこ焼き
お久しぶりです。
たこ焼きです。

現在イライラ棒アプリを参考に端末を傾けて操作する2Dゲームを作っています。
そこで端末を傾けると自機をジャンプするようにしたいのですが、以下の問題があります。

1.端末の初期の傾きに関わらずユーザーの意志で端末を傾けたことを感知しなければいけない。
2.自機をフレームごとに少しずつ上下させ、ジャンプしているようにしたい。

伝わり難い説明で申し訳ありませんがどうかよろしくお願いいたします。

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月16日(金) 22:24
by softya(ソフト屋)
1に関しては「加速度センサー」で加速値を検出すれば良いんじゃないでしょうか?
2は、そもそも上昇させることが出来るか問題です。方法はわかりますか?

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月16日(金) 23:12
by たこ焼き
返信ありがとうございます。

1についてですが最初から端末が少し傾いている場合に反応しないようにしたいです。
2はイライラ棒アプリのベクトルのところで学んだことから上昇だけ、下降だけならできますがある程度上昇したら下降しなければいけない上、それを何フレームかに分ける必要があることが問題です。

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月16日(金) 23:16
by softya(ソフト屋)
1.傾きと加速度は別の物でandroidは傾きと加速度センサーは別にあったはずですが?
そもそも加速度の意味を理解されていますか?

2.重力加速度を仮想的に再現します。これも加速度が出てきますね。

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月17日(土) 02:21
by Dixq (管理人)
まず1ですが、
1はつまり、任意のcurrent位置から端末回転後の角度が計算できなくて困っているということですね。
それであればこの辺参考になるのではないでしょうか。
http://www.binzume.net/diary/2010-07-24:A3

Androidはリファレンスが充実しています。
まずはセンサーのAPIについて公式リファレンスを読んで関数だけでも目を通しておくと楽だと思います。
http://developer.android.com/reference/ ... nager.html

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月17日(土) 14:00
by たこ焼き
返信ありがとうございます。

今まで加速度と傾きを一緒に考えていました。
傾きとして感知すればいいことはわかりましたが、それをどうソースに記述するのかがわかりません。
イライラ棒アプリのSensor.javaに追加するような形で傾きを感知する方法を教えてください。

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月19日(月) 22:19
by Dixq (管理人)
ではまずrotateはおいておき、加速度センサーから取得したx,y,zがどのように変化しているか確認して下さい。
Playerクラスの以下の部分を置換して下さい。

コード:

	//自機中心円を取得する
	public final Circle getPt(){
		return _cir;
	}

	private float _x, _y, _z;
	// ベクトルをセットする
	private void setVec(){
		_x = AcSensor.Inst().getX();
		_y = AcSensor.Inst().getY();
		_z = AcSensor.Inst().getZ();
		float x = -_x*2;	//加速度センサーの情報を取得
		float y =  _y*2;
		_sensorVec._x = x < 0 ? -x*x : x*x;	//2乗して変化を大袈裟にする
		_sensorVec._y = y < 0 ? -y*y : y*y;	//2乗すると+になるので、負ならマイナスを付ける
		_sensorVec.setLengthCap(MAX_SPEED);	//ベクトルの大きさが最大スピード以上にならないようにする		
		_vec.blend( _sensorVec, 0.05f );	//センサーのベクトル方向に実際の移動ベクトルを5%近づける
	}

	// 移動ベクトルの向いている方に動かす
	private void Move(){
//		_cir._x += _vec._x;	//移動ベクトル_vecが指す方向に移動させる 
//		_cir._y += _vec._y;
	}
	
	@Override
	public boolean onUpdate(){
		setVec();	//移動ベクトルをセットする
		Move();		//移動ベクトルが向いている方に動かす
		return true;
	}

	@Override
	public void onDraw( Canvas c ){
		Paint p = new Paint();
		p.setTextSize(100);
		c.drawCircle(_cir._x, _cir._y, _cir._r, _paint);
		c.drawText(String.format("x= %4.1f", _x), 50, 100, p);
		c.drawText(String.format("y= %4.1f", _y), 50, 200, p);
		c.drawText(String.format("z= %4.1f", _z), 50, 300, p);
	}
そして、マニフェストファイルのactivityタグに
「android:screenOrientation="portrait"」
を追加して下さい。

すると、以下のような実行結果が得られます。
[youtube][/youtube]
実際に端末であれこれ傾けてみてどのようにx,y,zが変化するか確認して下さい。
( http://dixq.net/Android/s02_05.html こちらに書いてある通りですが)

そうすれば、どのように修正すれば期待する動作ができるか見えてきませんか?

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月23日(金) 13:17
by たこ焼き
返信ありがとうございます。

教わったようにコードを書いたら上手く実行できました。
ですが、今回作りたいものはlandscapeで端末の上部を奥に傾ける動作を感知するものです。
そのため、加速度センサーだけに頼らずに傾きを知る必要があります。
※加速度センサーだけだと水平な場所においただけで反応してしまいます。
何度もすみませんがどうかよろしくお願いいたします。

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月23日(金) 19:12
by へにっくす
たこ焼き さんが書きました:ですが、今回作りたいものはlandscapeで端末の上部を奥に傾ける動作を感知するものです。
そのため、加速度センサーだけに頼らずに傾きを知る必要があります。
※加速度センサーだけだと水平な場所においただけで反応してしまいます。
何度もすみませんがどうかよろしくお願いいたします。
横から失礼します。
個人的には十分ヒントを教えてもらっていると思いますが。
ムービーをみる限り、縦向きの場合、奥に倒すとyが負になる。
加速度によらない傾きを得られているんじゃないの?
もう一度「加速度」という意味を考えてください。動かなければ0になるはずだよね?
これと同じ要領で、横向き(=landscape)にして奥に倒すとどうなるか?
を考えるとこまでいかないと。

その方法が分からないのでしょうか?
screenOrientationの値を変えるだけじゃないの?


何だか勘違いしていたのは私のようなので修正。(^^;
静止している状態である程度一定の値を得られているので、
ただ置いた状態から、奥に傾ける動作をしたときって、yの値が変化しているよね?
そこからユーザーの動作を検出できないかな?

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月23日(金) 20:22
by Dixq (管理人)
> そのため、加速度センサーだけに頼らずに傾きを知る必要があります。

何故でしょう?

> ※加速度センサーだけだと水平な場所においただけで反応してしまいます。

地球上にある物体は地球から重力を受けています。重力加速度は9.8[m/s^2]です。
従って、テーブルに置いているとZ方向に9.8と表示されます。
静止した端末のセンサーは「端末がどちらに引力で引っ張られているか」を示しているので、
携帯の上部を奥に傾けるとyが負になります。
yは正の向きに垂直なら9.8、逆さまなら-9.8を示します。
これを超えて回転する時は前述の通り、matrixで計算する必要があるかと思いますが、
ジャンプの検出位なら、このyの変化だけで実現できそうですが、ダメですか?

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年11月23日(金) 20:32
by Dixq (管理人)
センサーが示す値について、こちらを参考にどうぞ
http://developer.android.com/reference/ ... Event.html

android sdkはリファレンスが充実しているので、分からないことがあれば、こちらで情報を検索してみて下さい。

また、リファレンスの情報を探しやすくするextensionが便利なので、紹介します。
https://chrome.google.com/webstore/deta ... joldkfhoin
分からない関数があれば「検索ボタン→ad クラス名」などですぐに見つかるので愛用しています。

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年12月01日(土) 22:26
by たこ焼き
返信ありがとうございます。
(返信遅れてすみません)

Yの値の変化を使うことを考えましたが、やはり難しいようでした。
(端末の上部を奥に傾けるだけだとYの値は大きく変化しませんでした)

そのため、端末の回転角度を取得する必要があります。
イライラ棒アプリのSensor.javaに追記する形でどのように記述するべきでしょうか。

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年12月02日(日) 01:55
by Dixq (管理人)
> 端末の上部を奥に傾けるだけだとYの値は大きく変化しませんでした

何故でしょう、上のサンプルで9.8~-9.8までの値を示すことをお伝えしたはずですが・・。
また、加速度センサーではなく回転をと何度も言っていますが、回転情報は加速度センサーの情報から計算します。
(私が上でリンクを提示しています)
それから、どこまでたこ焼きさんが試されたのが分かりません。書いたコードの差分を示してもらうとアドバイスがしやすいです。

思いつき手法ですが、上で言った通り、yの差分を見るだけでそれなりに正確にジャンプの操作検出は出来ると思います。
実際に実装してみました。
これではダメですか?奥方向へグッと動かすと「ジャンプ!」と表示するサンプルです。
[youtube][/youtube]

使用したソースコードも置いておきます。
http://dixq.net/zip/bbs/Irairabar_jump.zip

Re: Androidの2Dゲームでジャンプしたい

Posted: 2012年12月02日(日) 10:37
by へにっくす
端末によって精度の違いがあるのかも?
9.8~-9.8にならないのであれば、どのぐらいの値になっているか示して下さい。
たこ焼き さんが書きました:(端末の上部を奥に傾けるだけだとYの値は大きく変化しませんでした)
もしかして、回転速度で出したいと思ってる?
今のままだと、ゆっくりでも急でも奥に傾けたら一定の値になるから使えないと?
そんなの一定の時間でサンプリングして、その差を求めればいいだけな気が。
たとえば1秒間隔でyの値を保持しておいて、その1秒の間に一定以上の値になればジャンプと判断するとか。
(softyaさんの言うこととかぶりますけど)

そういうことは考えましたか?
少なくとも、こちらにはその経緯が伝わってきません。
まさか掲示されたコードがそのまま使えると思っていたわけじゃないですよね?
考えて実際にコードに組み込んだのであれば、それを示して下さいね。

#厳密に横にぶれたらダメという話であれば、xの値の差も判定の処理に入れるだけですよね。