ページ 11

斜め移動の計算式について

Posted: 2011年8月13日(土) 19:59
by ゾン
現在DXライブラリを使用してシューティングゲームを作っています。斜め移動を取り入れたいのですが、うまくいかず困っています。

キャラクタの位置 = キャラクタの位置 + 1 / √2 × キャラクタの移動量
というのは調べてわかったのですが、横軸では右が+の方向、左が-の方向、縦軸では上が-の方向、下が-の方向というのに合わせて「1/√2×キャラクタの移動量」の部分の足し算、引き算を変えました。

結果、右上の移動はうまくいったのですが、
・左上の移動速度が速い
・右下、左下に移動できない(左右の移動のみになってしまう)
という問題が発生し、原因がわかりません。計算式が間違っていると思うのですが、どこがおかしいのでしょうか?

移動量は1です。
よろしくお願いします

コード:

#include "DxLib.h"
#include "player.h"
#include "keyboard.h"
#include <math.h>

//player内のグローバル変数
static int p_img[32], p_image;
static int px, py;

//初期化
void Player_Initialize(){
	//画像読み込み、初期配置
	LoadDivGraph("char1.png", 32, 8, 4, 32, 48, p_img);
	p_image = p_img[24];
	px = 320;  py = 240;
}

//動きの計算
void Player_Calc(){
	double cx, cy, root2;
	root2 = sqrt(2.0);  //root2はルート2(平方根)

	if(Keyboard_Get(KEY_INPUT_RIGHT) > 0){
		px++;
		p_image = p_img[(px % 32) / 8 + 16];
	}else if(Keyboard_Get(KEY_INPUT_LEFT) > 0){
		px--;
		p_image = p_img[(px % 32) / 8 + 8]; 
	}else if(Keyboard_Get(KEY_INPUT_UP) > 0){
		py--;
		p_image = p_img[(py % 32) / 8 + 24];
	}else if(Keyboard_Get(KEY_INPUT_DOWN) > 0){
		py++;
		p_image = p_img[(py % 32) / 8 + 0];
	}
	//右上
	if(Keyboard_Get(KEY_INPUT_RIGHT) > 0 && Keyboard_Get(KEY_INPUT_UP) > 0){
		cx = px;  cy = py;
		cx = cx + 1 / root2;  cy = cy - 1 / root2;  //上下左右に比べて1/ルート2の速さに
		px = (int)cx;  py = (int)cy;  //cx,cyの値を小数点以下切捨てでpx,pyに戻す キャスト演算子
		p_image = p_img[(px % 32) / 8 + 28];
	}

//-----------------------------わからない部分--------------------------------------------
	//左上
	if(Keyboard_Get(KEY_INPUT_LEFT) > 0 && Keyboard_Get(KEY_INPUT_UP) > 0){
		cx = px;  cy = py;
		cx = cx - 1 / root2;  cy = cy - 1 / root2;
		px = (int)cx;  py = (int)cy;
		p_image = p_img[(px % 32) / 8 + 20];
	}
	//右下
	if(Keyboard_Get(KEY_INPUT_RIGHT) > 0 && Keyboard_Get(KEY_INPUT_DOWN) > 0){
		cx = px;  cy = py;
		cx = cx + 1 / root2;  cy = cy + 1 / root2;
		px = (int)cx;  py = (int)cy;
		p_image = p_img[(px % 32) / 8 + 12];
	}
	//左下
	if(Keyboard_Get(KEY_INPUT_LEFT)> 0 && Keyboard_Get(KEY_INPUT_DOWN) > 0){
		cx = px;  cy = py;
		cx = cx - 1/root2;  cy = cy + 1/root2;
		px = (int)cx;  py = (int)cy;
		p_image = p_img[(px % 32) / 8 + 4];
	}

}

//描画
void Player_Graph(){
	DrawGraph(px, py, p_image, TRUE);
}

//終了処理
void Player_Finalize(){
	DeleteGraph(p_image);
}



Re: 斜め移動の計算式について

Posted: 2011年8月13日(土) 20:10
by h2so5
1 / √2 ってだいたい 0.7 くらいなので、
座標に加算した後、intにキャストして小数点以下を切り捨ててしまったら値は変化しないのでは?

Re: 斜め移動の計算式について

Posted: 2011年8月13日(土) 20:37
by non
0.7増加しても、intしたら、0なので増加しない。

Re: 斜め移動の計算式について

Posted: 2011年8月13日(土) 20:50
by ゾン
ご指摘ありがとうございます

double型変数cx,cyの値を保持したまま計算を続けられるように変更してみました。
しかし、これが原因ではなかったようです。引き続きどなたかご教授をお願いします

コード:

#include "DxLib.h"
#include "player.h"
#include "keyboard.h"
#include <math.h>

//player内のグローバル変数
static int p_img[32], p_image;
static int px, py;

//初期化
void Player_Initialize(){
	//画像読み込み、初期配置
	LoadDivGraph("char1.png", 32, 8, 4, 32, 48, p_img);
	p_image = p_img[24];
	px = 320;  py = 240;
}

//動きの計算
void Player_Calc(){
	int naname_flag = 0;  //斜め入力が続いているかどうか判定
	double cx, cy, root2;
	root2 = sqrt(2.0);  //root2は√2

	if(Keyboard_Get(KEY_INPUT_RIGHT) > 0){
		px++;
		p_image = p_img[(px % 32) / 8 + 16];
		naname_flag = 0;
	}else if(Keyboard_Get(KEY_INPUT_LEFT) > 0){
		px--;
		p_image = p_img[(px % 32) / 8 + 8];
		naname_flag = 0;
	}else if(Keyboard_Get(KEY_INPUT_UP) > 0){
		py--;
		p_image = p_img[(py % 32) / 8 + 24];
		naname_flag = 0;
	}else if(Keyboard_Get(KEY_INPUT_DOWN) > 0){
		py++;
		p_image = p_img[(py % 32) / 8 + 0];
		naname_flag = 0;
	}
	//右上
	if(Keyboard_Get(KEY_INPUT_RIGHT) > 0 && Keyboard_Get(KEY_INPUT_UP) > 0){
		if(naname_flag == 0){
			cx = px;  cy = py;
			naname_flag = 1;
		}
		cx = cx + 1 / root2;  cy = cy - 1 / root2;  //上下左右に比べて1/ルート2の速さに
		px = (int)cx;  py = (int)cy;  //cx,cyの値を小数点以下切捨てでpx,pyに戻す キャスト演算子
		p_image = p_img[(px % 32) / 8 + 28];
	}

//-----------------------------わからない部分--------------------------------------------
	//左上
	if(Keyboard_Get(KEY_INPUT_LEFT) > 0 && Keyboard_Get(KEY_INPUT_UP) > 0){
		if(naname_flag == 0){
			cx = px;  cy = py;
			naname_flag = 1;
		}
		cx = cx - 1 / root2;  cy = cy - 1 / root2;
		px = (int)cx;  py = (int)cy;
		p_image = p_img[(px % 32) / 8 + 20];
	}
	//右下
	if(Keyboard_Get(KEY_INPUT_RIGHT) > 0 && Keyboard_Get(KEY_INPUT_DOWN) > 0){
		if(naname_flag == 0){
			cx = px;  cy = py;
			naname_flag = 1;
		}
		cx = cx + 1 / root2;  cy = cy + 1 / root2;
		px = (int)cx;  py = (int)cy;
		p_image = p_img[(px % 32) / 8 + 12];
	}
	//左下
	if(Keyboard_Get(KEY_INPUT_LEFT)> 0 && Keyboard_Get(KEY_INPUT_DOWN) > 0){
		if(naname_flag == 0){
			cx = px;  cy = py;
			naname_flag = 1;
		}
		cx = cx - 1/root2;  cy = cy + 1/root2;
		px = (int)cx;  py = (int)cy;
		p_image = p_img[(px % 32) / 8 + 4];
	}

}

//描画
void Player_Graph(){
	DrawGraph(px, py, p_image, TRUE);
}

//終了処理
void Player_Finalize(){
	DeleteGraph(p_image);
}



Re: 斜め移動の計算式について

Posted: 2011年8月13日(土) 21:14
by h2so5
ゾン さんが書きました: double型変数cx,cyの値を保持したまま計算を続けられるように変更してみました。
問題はそこではありません。

px = (int)cx; py = (int)cy;
この部分で切り捨てられてしまいます。

座標を保持しているpx, py をdouble型にして、
DrawGraphに渡す時にキャストするといいでしょう。

Re: 斜め移動の計算式について

Posted: 2011年8月13日(土) 21:30
by ゾン
ご指摘いただいたところを直したところ、正常な動作になりました。
ありがとうございました