フィールドとの当たり判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cupa
記事: 117
登録日時: 2年前

フィールドとの当たり判定

#1

投稿記事 by cupa » 2年前

前の質問でもいったのですが・・・うまくいかず・・・

現在のコード
char.cpp

コード:

#include "../include/GV.h"

void ch_init() {
	ch.first_x = (FIELD_WIDTH - 50) / 2;
	ch.first_y = 500;
}

void calc_ch() {
	ch.cnt++;
	ch.img=(ch.cnt % 24) / 6;
}

void ch_move() {
	int joge_flag = 0, sayu_flag = 0;	//左右上下の押下フラグ
	double x, y, mx, my, naname = 1;	//x座標y座標、動いたx距離、動いたy距離
	double move_x[4] = {-4.0, 4.0, 0.0, 0.0}, move_y[4] = {0.0, 0.0, -4.0, 4.0}; //{左右上下}の移動スピード
	int input_key[4];	//左右上下のキー格納
	input_key[0] = CheckHitKey(KEY_INPUT_LEFT); input_key[1] = CheckHitKey(KEY_INPUT_RIGHT);	//左右方向のキー入力
	input_key[2] = CheckHitKey(KEY_INPUT_UP); input_key[3] = CheckHitKey(KEY_INPUT_DOWN);	//上下方向のキー入力
	
	
	/*
	//左右キ-が押されていなかったら
	for (int i = 0; i < 2; i++) {	//左右分のループ
		if (input_key[i] == 0) {	//もしi番目(左右)が押されていなかったら
			if (frame_cnt % 15 == 0) {	//もしframe_cntを15で割った余りが0ならば
				if (ch.img == NEUTRAL_CH_IMG_MAX) //もしキャラの画像が3(最大)だったのなら
					ch.img = FIRST_NEUTRAL_CH_IMG;	//元の番号に戻す
				ch.img++;	//キャラ画像をプラスする
			}
		}
	}
	
	if (input_key[0] == 1) {	//左方向キーが押されていたら
		ch.img = FIRST_LT_CH_IMG;	//画像をはじめの左向き画像に
		if (frame_cnt % 15 == 0) {	//もしframe_cntを15で割った余りが0ならば
			if (ch.img == LT_CH_IMG_MAX) //もしキャラの画像が11(最大)だったのなら
				ch.img = FIRST_LT_CH_IMG;	//元の番号に戻す
			ch.img++;	//キャラの画像番号をプラスする
		}
	} else if (input_key[1] == 1) {	//右方向キーが押されていたら
		ch.img = FIRST_RT_CH_IMG;	//左向きの初期値
		if (frame_cnt % 15 == 0) {	//もしframe_cntを15で割った余りが0ならば
			if (ch.img == RT_CH_IMG_MAX) //もしキャラの画像が8(最大)だったのなら
				ch.img = FIRST_RT_CH_IMG;	//元の番号に戻す
			ch.img++;	//キャラの画像番号をプラスする
		}
	}
	*/
	
	/*
	// 左右キーの入力の状況によって、アニメーションに使う画像の範囲を決める
	if (input_key[0] == 1) {	//左方向キーが押されていたら
		first_img = FIRST_LT_CH_IMG;
		last_img = LT_CH_IMG_MAX;
	} else if (input_key[1] == 1) {	//右方向キーが押されていたら
		first_img = FIRST_RT_CH_IMG;
		last_img = RT_CH_IMG_MAX;
	} else {	//左右キ-が押されていなかったら
		first_img = FIRST_NEUTRAL_CH_IMG;
		last_img = NEUTRAL_CH_IMG_MAX;
	}
	
	// アニメーションをする
	if (ch.img < first_img || last_img < ch.img) {	//前の状態が異なる範囲だったら
		//今の範囲の最初の画像にする
		ch.img = first_img;
	}
	if (frame_cnt % 15 == 0) {	//もしframe_cntを15で割った余りが0ならば (frame_cntは0で初期化してその後変更されないので、絶対0のはずだけど)
		if (ch.img == last_img) //もしキャラの画像が最大だったのなら
			ch.img = first_img;	//元の番号に戻す
		ch.img++;	//キャラの画像番号をプラスする
	}
	*/
	
	if(input_key[0] == 1)//左キーが押されていたら
            ch.img += 4 * 2;//画像を左向きに
    else if(input_key[1] == 1)//右キーが押されていたら
            ch.img += 4 * 1;//画像を右向きに
	
	for (int i = 0; i < 2; i++)	//左右二回分
		if (input_key[i] == 1) 	//左右どちらかの入力があれば 
			sayu_flag = 1;	//左右フラグを1にする
	for (int i = 2; i < 4; i++)	//左右二回分
		if (input_key[i] == 1) 	//上下どちらかの入力があれば 
			joge_flag = 1;	//上下フラグを1にする
	if (sayu_flag == 1 && joge_flag == 1) //どちらも入力があれば
		naname = sqrt(2.0);	//斜めを1√2に
	
	for (int i = 0; i < 4; i++) {	//左右上下の4回分繰り返す
		if (input_key[i] == 1) {	//i番目のキーの入力があれば
			x = ch.x, y = ch.y;	//現在の座標を取り敢えず代入
			mx = move_x[i], my = move_y[i];	//i番目の移動分をmx,myに代入
			x += mx / naname, y += my / naname;	//現在の座標と移動分を足す
			if (x < FIELD_WIDTH && x > 0 &&
				y < FIELD_HEIGHT && y > 0)
				ch.x = x, ch.y = y;
		}
	}
}
一番最後の部分が当たり判定の部分ですね。
みけCATさんに言われたとおり、||を&&にしたのですが、プレイヤーの周りに当たり判定ができて、動けません。
C言語の館(9章)では、||になっていたのですがどういうことでしょうか?
また、C言語の館は初期の位置がちゃんと下の方の真ん中で、どこで初期のx,yを定義しているのでしょうか?

度々質問してしまい、すみません。お願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: フィールドとの当たり判定

#2

投稿記事 by みけCAT » 2年前

cupa さんが書きました:
2年前
C言語の館(9章)では、||になっていたのですがどういうことでしょうか?

コード:

                        if(!(x<10 || x>FIELD_MAX_X-10 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら
                                ch.x=x , ch.y=y;//実際に移動させる
                        }
(https://dixq.net/rp/9.html より)

|| を使って「移動先が範囲外か」を判定し、! で論理を反転することで「範囲内か」を判定しているようですね。
cupa さんが書きました:
2年前
また、C言語の館は初期の位置がちゃんと下の方の真ん中で、どこで初期のx,yを定義しているのでしょうか?
first_ini 関数のようですね。
キャラクタの初期座標を設定します。


--ini.cppを変更--

コード:

#include "../include/GV.h"

//一番最初の初期化
void first_ini(){
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
}
(https://dixq.net/rp/7.html より)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

cupa
記事: 117
登録日時: 2年前

Re: フィールドとの当たり判定

#3

投稿記事 by cupa » 2年前

一度、C言語の館通りにやってみたのですが・・・
結果は変わらずプレイヤーの周りに壁があるような感じでその場から動けません。

初期座標の定義、提示していただきありがとうございます。

描画しているgraph.cppはこんな感じです・・・

コード:

#include "../include/GV.h"

// キャラクターの描画関係
void graph_ch() { 
	DrawRotaGraphF(ch.x, ch.y, 1.4f, 0.0f, ch_img[ch.img], TRUE, FALSE);
}

// 描画関係のメイン関数
void graph_main() {
	graph_ch();
}

cupa
記事: 117
登録日時: 2年前

Re: フィールドとの当たり判定

#4

投稿記事 by cupa » 2年前

試しにIF文を無くしてみたのですが、当たり判定処理がないのに同じような結果でした

cupa
記事: 117
登録日時: 2年前

Re: フィールドとの当たり判定

#5

投稿記事 by cupa » 2年前

すみません!前の返信(試しにIF文を~)のことが起こっていたのは、ch_init()を毎フレーム呼んでしまっていたからでした!

そして、フィールドとの当たり判定も条件式はあっていたようで、上記のことをずっと引きずっていたのでプレイヤーの周りに当たり判定があるようになっていたのだと思われます。

ただのケアレスミスで質問してしまいすみませんでした。ありがとうございました。

cupa
記事: 117
登録日時: 2年前

Re: フィールドとの当たり判定

#6

投稿記事 by cupa » 2年前

質問なのですが、C言語の館の条件式(!(~||~||~||~))は、
x(y)が10より小さかったり、x(y)がフィールドより大きかったりしなかったら実際に移動させる。(ch.x(y)=x(y))であっていますでしょうか?

また、!のあとを括弧で囲っていますが、それは括弧内をすべて反転させる、ということであっていますでしょうか?よろしくおねがいします

返信

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