アクションゲームのジャンプについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オーカー

アクションゲームのジャンプについて

#1

投稿記事 by オーカー » 8年前

ジャンプの実装について
マリオのようなジャンプを実装しようと思い
http://d.hatena.ne.jp/Gemma/20080517/1211010942
上のページの内容を使ってみたんです
たぶんMario.yにいまの座標を入れるんでしょうけど

これMario.y=0のときは[0,10,19, 27, 34, 40, 45,・・・
となりますが
Mario.y=10のときは[20, 32, 43, 52, 60, 67, 73,・・・
となって無駄に高くジャンプしてしまいます
どうすればいいんでしょう?

というか使い方が間違ってるんでしょうか?
(まあ普通は下に行く程座標が大きくなるから逆にしないといけないんでしょうけど)

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: アクションゲームのジャンプについて

#2

投稿記事 by h2so5 » 8年前

ソースを見ないと何とも言えません。

また、マリオはハードの関係でこのような実装になっているようなので、
PCでマリオのようなジャンプを実装したいのなら、この方法にこだわる必要はないと思いますよ。

maru
記事: 150
登録日時: 9年前

Re: アクションゲームのジャンプについて

#3

投稿記事 by maru » 8年前

参照先のコードを貼っておきます。

コード:

y_temp = Mario.y;
Mario.y += (Mario.y - Mario.y_prev) + F;
Mario.y_prev = y_temp;
Fはジャンプしたとき10で空中では-1とするようです。
このコードは今の位置と前回に位置の差(つまり、その速度)に力を加える(加速・減速)ことにより
速度を求め、今の位置に加える(速度による移動を行う)ことによって次の位置を求めるものです。

Mario.y=Mario.y_prev=0で処理を開始すると、確かに結果は[0,10,19, 27, 34, 40, 45,・・・となる
はずですが、Mario.y=Mario.y_prev=10で処理を開始すると、結果は[10, 20, 29, 37, 44, 50, 55,・・・
となるはずです。これがそうなっていないということは、...
単純に考えるとMario.y_prevの初期値が正しくないんではないかと。

オーカー

Re: アクションゲームのジャンプについて

#4

投稿記事 by オーカー » 8年前

えーとですね
どうなるかを知りたかったので単純に

コード:

int y;
int y_p;
int F;

void Jump(void){
	int temp = y;
	y += ( (y - y_p) + F);
	y_p = temp;
}

void main(void){
	y=;

	Jump();
	printf("%d\n",y);
	F=10;
	Jump();
	printf("%d\n",y);
	F=-1;
	for(int i=0;i<30;i++){
		Jump();
		printf("%d\n",y);
	}
}
としました。

あと質問が悪かったようなんですが
たとえばF=10をF=3とし
y=0で処理すると0,3,4,5,6,6,5,3,0となりますが
y=2で処理すると4,9,13,16,18,19,19,18,16,13,9,4となります
このとき
y=0のときの最大ジャンプ距離は6で
y=2のときの最大ジャンプ距離は17ですよね?
もしこのまま時機のy座標をそのまま用いて実装しますと
たとえばマリオで地面のブロックからのジャンプと少し上のブロックからのジャンプで
飛ぶ距離が違うことになってしまうという問題が起きてしまうモノですから
どうしたものかと・・・

maru
記事: 150
登録日時: 9年前

Re: アクションゲームのジャンプについて

#5

投稿記事 by maru » 8年前

y_pが前回の座標を保存しています。
14, 17, 21行でのJump呼び出し時にy_pの値がいくつになっているかを考えましょう。

オーカー

Re: アクションゲームのジャンプについて

#6

投稿記事 by オーカー » 8年前

ああなるほど
わかりました

maru
記事: 150
登録日時: 9年前

Re: アクションゲームのジャンプについて

#7

投稿記事 by maru » 8年前

オーカー さんが書きました:ああなるほど
わかりました
本当に理解出来たのでしょうか?でしたら前のコードをどのように変えたのか書いてみてください。
フォーラムルールにも
また、解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい
とあります。

閉鎖

“C言語何でも質問掲示板” へ戻る