アクションゲームの当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

アクションゲームの当たり判定について

#1

投稿記事 by 夢幻ノ月夜 » 5年前

大体の当たり判定はできているのですが
横からブロックに当たるとブロックの上にワープしてしまうバグが治りません
判定部分のコードを貼っておきますので間違い等ありましたら教えてください

コード:

if(IsHit(pl.x,pl.y+16)!=0){
		pl.x=int(pl.x/32)*32+32;
	}
	if(IsHit(pl.x+31,pl.y+16)!=0){
		pl.x=int(pl.x/32)*32;
	}

	if(IsHit(pl.x,pl.y+32)==1||IsHit(pl.x+31,pl.y+32)!=0){
		pl.vy=0;
		pl.y=int(pl.y/32)*32;
		pl.Istouch=true;
	}else{
		pl.vy+=1;
		pl.Istouch=false;
	}

	if(IsHit(pl.x,pl.y)==1||IsHit(pl.x+31,pl.y)!=0){
		pl.vy=0;
		pl.y=int(pl.y/32)*32+32;
	}
※IsHit関数は座標を引数に取り、そのマップ座標のマップチップ番号を返します
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Re: アクションゲームの当たり判定について

#2

投稿記事 by 夢幻ノ月夜 » 5年前

順番を変えたり条件を変えたりしたら治りました
自己解決ですみません
ここにコード貼っときますね

コード:

pl.x+=pl.vx;

if(IsHit(pl.x+1,pl.y+30)!=0 || IsHit(pl.x+1,pl.y+1)!=0 ){
		pl.x=int(pl.x/32)*32+32;
}
if(IsHit(pl.x+30,pl.y+30)!=0 || IsHit(pl.x+30,pl.y+1)!=0 ){
	pl.x=int(pl.x/32)*32;
}

pl.y+=pl.vy;

if(IsHit(pl.x+1,pl.y+32)!=0||IsHit(pl.x+30,pl.y+32)!=0){
	pl.vy=0;
	pl.y=int(pl.y/32)*32;
	pl.Istouch=true;
}else{
	pl.vy+=1;
	pl.Istouch=false;
}


if(IsHit(pl.x+1,pl.y+1)!=0||IsHit(pl.x+30,pl.y+1)!=0){
	pl.vy=0;
	pl.y=int(pl.y/32)*32+32;
}
※移動も順番変えました
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 10年前
住所: 北海道札幌市
連絡を取る:

Re: アクションゲームの当たり判定について

#3

投稿記事 by Dixq (管理人) » 5年前

pl.xが何型か知りませんが、計算過程でintにキャストする必要ありますか?
オフトピック
なお夢幻ノ月夜君のような中学生は学生ではなく「生徒」と呼びます。
高校までは中等教育機関なので、大学生から学生と呼びます。

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Re: アクションゲームの当たり判定について

#4

投稿記事 by 夢幻ノ月夜 » 5年前

Dixq (管理人) さんが書きました:pl.xが何型か知りませんが、計算過程でintにキャストする必要ありますか?
オフトピック
なお夢幻ノ月夜君のような中学生は学生ではなく「生徒」と呼びます。
高校までは中等教育機関なので、大学生から学生と呼びます。
マップチップの大きさが32*32pxなので無理やりintにして位置補正してます
毎回ゲーム作ろうとするたびに壁にぶち当たる

閉鎖

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