プレイヤ-を中心にして周囲のオブジェを回転させようとしたのですが、うまくいきません。
//↓include
#include"DxLib.h"
#include"math.h"
//↓グロ-バル変数
double player_x;
double player_y;
double angle; //rad単位
//↓回転関数
void rotateXY(double* x,double* y,double angle){
double cos,sin;
cos = cos(angle);
sin = sin(angle);
*x = (cos * *x) * (-sin * *y);
*y = (sin * *x) * ( cos * *y);
}
//↓Objectクラス
Class Object{
private:
double x;
double y;
int hImg;
public:
void show();
}
void Object::show(){
int ax,ay;
ax = x - player_x;
ay = y - player_y;
rotateXY(&ax,&ay,angle);
DrawGraph((int)ax,(int)ay,hImg,true);
}
座標(x,y) = (player_x,player_y)を中心にしてObjectクラスで作成したオブジェクトの座標x,yを
angle(rad単位)分だけ回転させて画面に表示させたいのですが、中心がプレイヤーの座標ではなくおかしな
方向に回転してしまいます。
一応、目標としてはアクションゲームを作ろうと思っています。
プグラミング暦は最近で、Visual C++2010を使っています。
OSはWindows7です。
どなたか分かる方がいらっしゃいましたらご教授お願いします。
回転
Re:回転
座標(x,y)を原点を中心にθ度回転させた後の座標(dx,dy) //dはdestinationの意
は、
dx = cosθ * x - sinθ * y
dy = sinθ * x + cosθ * y
です
なので、
*x = (cos * *x) * (-sin * *y);
*y = (sin * *x) * ( cos * *y);
がおかしいかと思われますので注意してみてください
また計算前と計算後の座標が同じ場合、一行目でxの値が変化するので、
2行目の前にxを保存しておく必要があるので注意です
また蛇足ですが上の2行は行列で表現することも可能です。
は、
dx = cosθ * x - sinθ * y
dy = sinθ * x + cosθ * y
です
なので、
*x = (cos * *x) * (-sin * *y);
*y = (sin * *x) * ( cos * *y);
がおかしいかと思われますので注意してみてください
また計算前と計算後の座標が同じ場合、一行目でxの値が変化するので、
2行目の前にxを保存しておく必要があるので注意です
また蛇足ですが上の2行は行列で表現することも可能です。
Re:回転
返信ありがとうございます。
変数xは保存しておかないとダメでしたね(汗)
全く気づきませんでした。
そこあたりを訂正した後、再度コンパイルしたのですが、それでもおかしな向きへ回転してしまいました。
説明不足で言えてなかったのですが、プレイヤ-を常に画面の中心に表示しようとしていたため、描画関数を呼ぶ際に
DrawGraph((int)ax + Window_sizeX/2 ,(int)ay + Window_sizeY/2 ,hImg,true);
とウィンドウサイズの半分を描画先座標に足さなければいけなかったみたいです。それで再々コンパイルして、ようやくうまくいきました。
うしおさん、ありがとうございました!
変数xは保存しておかないとダメでしたね(汗)
全く気づきませんでした。
そこあたりを訂正した後、再度コンパイルしたのですが、それでもおかしな向きへ回転してしまいました。
説明不足で言えてなかったのですが、プレイヤ-を常に画面の中心に表示しようとしていたため、描画関数を呼ぶ際に
DrawGraph((int)ax + Window_sizeX/2 ,(int)ay + Window_sizeY/2 ,hImg,true);
とウィンドウサイズの半分を描画先座標に足さなければいけなかったみたいです。それで再々コンパイルして、ようやくうまくいきました。
うしおさん、ありがとうございました!