ページ 11

ジャンプの処理について

Posted: 2011年3月24日(木) 20:31
by えん
2Dアクションゲームを作っている最中の者です。

二人キャラクタを表示させて、一方のキャラにもう一方が乗ると
下の方がジャンプした際に上のキャラが乗ったまんまにしたいのですが、
一方を①、もう一方を②とすると
②が①の上に乗って①がジャンプするとすり抜けないのですが、
①が②の上に乗って②がジャンプするとすり抜けてしまいます。

以下hit.cppの一部

コード:

void ch_hit_y(){
	int i, j;
	for(i=0;i<2;i++){
		for(j=0;j<32;j++){
			if(ch[i].x == ch[1-i].x+j && ch[i].y+31 == ch[1-i].y)//左下と上面
					ch[i].hit_down=1;			
			if(ch[i].x+31 == ch[1-i].x+j && ch[i].y+31 == ch[1-i].y)//右下と上面
					ch[i].hit_down=1;
		}
	}
}
以下char.cppの一部(ジャンプするボタンを押すと、jumpspeed+=15するようになっています)

コード:

void ch_move_y(){
	int i, j;

	for(i=0;i<2;i++){
		ch[i].jumpspeed -= 1; //重力

		if(ch[i].jumpspeed>0){
			for(j=0;j<ch[i].jumpspeed;j++){
				ch[i].y--;
				ch_hit_y();
			}
		}
		if(ch[i].jumpspeed<0){
			for(j=0;j>ch[i].jumpspeed;j--){
				ch[i].y++;
				ch_hit_y();
			}
		}

		if(ch[i].hit_down==1){
			ch[i].jumpspeed=0;
			ch[i].y=ch[1-i].y-32;
		}
		
		if(ch[i].y > FIELD_MAX_Y-32){  //床判定
			ch[i].jumpspeed = 0;
			ch[i].y = FIELD_MAX_Y-32;
		}
	}
}
何が原因なのか、わかる方はいらっしゃるでしょうか?

Re: ジャンプの処理について

Posted: 2011年3月24日(木) 23:08
by softya(ソフト屋)
処理の順番ですり抜けていると思われます。
ひとつの方法としては、
下のキャラのは上にキャラが乗っていることをフラグで覚えておく方法があります。
これは、落下移動処理時に足元にキャラがいたら足元のキャラに乗ってるよフラグを立てておきます。
で、踏まれているキャラはジャンプするときに、乗ってるよフラグがONなら上にいるキャラをそのまま同時に移動させるわけです。

Re: ジャンプの処理について

Posted: 2011年3月25日(金) 00:40
by えん
softya(ソフト屋) さんが書きました:処理の順番ですり抜けていると思われます。
ひとつの方法としては、
下のキャラのは上にキャラが乗っていることをフラグで覚えておく方法があります。
これは、落下移動処理時に足元にキャラがいたら足元のキャラに乗ってるよフラグを立てておきます。
で、踏まれているキャラはジャンプするときに、乗ってるよフラグがONなら上にいるキャラをそのまま同時に移動させるわけです。
先ほどのchar.cppを、

コード:

if(ch[i].jumpspeed>0){
			for(j=0;j<ch[i].jumpspeed;j++){
				ch[i].y--;
				if(ch[i].hit_up==1)  //ここ変更
					ch[1-i].y--; //ここ変更
				ch_hit_y();
			}
		}
と変えたところ、すり抜けがなくなりました。
お答えいただきありがとうございました。

ここからちょっと細かい話になってしまうのですが、
私の書いたchar.cppは必ずキャラ①→キャラ②の順に動かしているのですが、(for文が使えて楽なので)
多少コードがややこしくなっても踏み台にされてるキャラ→乗ってるキャラの順に動かした方が
簡単に書けますでしょうか?
踏み台キャラがジャンプ中、当たり判定があいまいになってしまうようで
乗っているキャラが踏み台キャラの上でジャンプできる時とできない時とまちまちになってしまいます。

プロの方はコードをきれいに、簡潔に書いているイメージがあって
なるべくややこしく書かないようにしよう!と思ってはいるのですが
初心者のうちは回りくどいものになってしまってもだいじょうぶですかね?

少し論点がずれてしまい申し訳ないですが、
お答えいただけるとありがたいです。

Re: ジャンプの処理について

Posted: 2011年3月25日(金) 01:17
by softya(ソフト屋)
プレーヤー処理を関数化して引数に動かす配列番号で呼び出しにして、Y座標の大きな方(下の方)を先に処理する様にするだけならさほど複雑に成らないと思います。
処理的にも、そのほうが素直になるので良いんじゃないでしょうか。