斜め移動の計算式について
Posted: 2011年8月13日(土) 19:59
現在DXライブラリを使用してシューティングゲームを作っています。斜め移動を取り入れたいのですが、うまくいかず困っています。
キャラクタの位置 = キャラクタの位置 + 1 / √2 × キャラクタの移動量
というのは調べてわかったのですが、横軸では右が+の方向、左が-の方向、縦軸では上が-の方向、下が-の方向というのに合わせて「1/√2×キャラクタの移動量」の部分の足し算、引き算を変えました。
結果、右上の移動はうまくいったのですが、
・左上の移動速度が速い
・右下、左下に移動できない(左右の移動のみになってしまう)
という問題が発生し、原因がわかりません。計算式が間違っていると思うのですが、どこがおかしいのでしょうか?
移動量は1です。
よろしくお願いします
キャラクタの位置 = キャラクタの位置 + 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);
}