初めて書き込むので稚拙な部分もあるかと思いますが、なにとぞよろしくお願いします。
現在専門学校での課題でゲームを作っています。コンパイラはC++で、OSはwindowsXPです
口頭ではなかなか伝わりづらいと思ったので、画像を作ってみました
2つの画像をこのように円運動させたいんですが、一応今の知識で実装はできました
ですが向かい側の画像の配置や、画像を増やすと全部変数を手打ちしなおさないといけないこともあり、もっと便利な関数が作れないものかなと思い質問させて頂きました
できれば、
void Circle(int x, int y, float radius, float speed);
関数名(中心点の座標X, 中心点の座標Y, 半径, 回るスピード);
このような関数をつくれればと思っています。
皆さんの意見を聞かせていただけませんでしょうか
よろしくお願いします
2Dにおける円運動
-
チルチル
Re:2Dにおける円運動
>void Circle(int x, int y, float radius, float speed);
え~と関数内で行いたい動作は何ですか?
座標の取得でしょうか?描画でしょうか?
とりあえず任意の数の座標を等間隔で円運動させたいなら一例としては
x,中心X座標
y,中心Y座標
&X,結果を代入する変数
&Y,結果を代入する変数
Num,何個目の座標か
MAX,座標の数
Cycle,一周する時間
Reach,半径
Count,カウンタ
わかりにくかったら添付したコードで確認してください
今はどうやって実装しているのかとか
具体的に何に使うのか教えていただければ
もう少しマシなのも作れますが・・
え~と関数内で行いたい動作は何ですか?
座標の取得でしょうか?描画でしょうか?
とりあえず任意の数の座標を等間隔で円運動させたいなら一例としては
void Circle(int x,int y,int &X,int &Y,int Num,int MAX,int Cycle,int Reach,int Count){
float Angle=PI2/Cycle*Count+PI2/MAX*Num;
X=x+cos(Angle)*Reach;
Y=y+sin(Angle)*Reach;
}一応説明するとx,中心X座標
y,中心Y座標
&X,結果を代入する変数
&Y,結果を代入する変数
Num,何個目の座標か
MAX,座標の数
Cycle,一周する時間
Reach,半径
Count,カウンタ
わかりにくかったら添付したコードで確認してください
今はどうやって実装しているのかとか
具体的に何に使うのか教えていただければ
もう少しマシなのも作れますが・・
-
Dixq (管理人)
Re:2Dにおける円運動
ちゃちゃっと作ってみました。
もしDXライブラリで実行出来たらやってみてください。
http://dixq.net/zip/bbs/RotateSample.zip
とりあえず2種類回転させる方法があると思うので、2種類でやっています。
cp1とcp2で回転のさせ方が違います。
もしDXライブラリで実行出来たらやってみてください。
http://dixq.net/zip/bbs/RotateSample.zip
とりあえず2種類回転させる方法があると思うので、2種類でやっています。
cp1とcp2で回転のさせ方が違います。
#include <math.h>
#include "Lib/DxLib.h"
#define PI 3.141592654f
#define PI2 (PI*2)
typedef struct{
float x,y; //座標
float ox,oy;//回転の中心
float T; //周期
float Range;//半径
}Point_t;
void RotatePoint(const float ox, const float oy, float *x, float *y, const float angle){
float tx = *x - ox, ty = *y - oy;
*x = tx * cos( angle ) - ty * sin( angle ) + ox;
*y = tx * sin( angle ) + ty * cos( angle ) + oy;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int Cnt=0;
Point_t cp1={120,240,320,240,240,}, cp2={520,240,320,240,180,200};
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while( !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE) ){
RotatePoint( cp1.ox, cp1.oy, &cp1.x, &cp1.y, PI2/cp1.T );
cp2.x = cp2.ox + cos( PI2/cp2.T*Cnt ) * cp2.Range;
cp2.y = cp2.oy + sin( PI2/cp2.T*Cnt ) * cp2.Range;
DrawCircle( cp1.x, cp1.y, 10, GetColor(255, 0, 0), TRUE );
DrawCircle( cp2.x, cp2.y, 10, GetColor( 0,255,255), TRUE );
DrawCircle( 320 , 240 , 5 , GetColor(255,255,255), TRUE );
Cnt++;
ScreenFlip();
}
DxLib_End();
return 0;
}
cp1はRotatePointという自作関数で回転させています。
引数の説明です。
ox : 回転させたい中心点x
oy : 回転させたい中心点y
x : 回転させる点x
y : 回転させる点y
angle : 回転させる角度
これで(ox,oy)を中心にx,yを角度angleほど回転させることが出来ます。
あとは普通に中心点を基準にsinとcosで計算する方法もあります。
それがcp2です。
難しい事は何もしてないです。
単に角度からx成分、y成分を出して、Rangeの半径を掛けているだけです。-
MNS
Re:2Dにおける円運動
C++ということなので、クラスなどを使っているのであれば
まあ、あまり良い設計とは言えないでしょうね・・・。
class Object
{
float mX; //X座標
float mY; //Y座標
float mAngle; //現在の角度
public:
void Circle(int x, int y, float radius, float speed)
{
mAngle += speed;
mX = x + cos(mAngle) * radius;
mY = y + sin(mAngle) * radius;
}
float GetX(){ return mX; }
float GetY(){ return mY; }
Object() :mX(0.0), mY(0.0), mAngle(0.0)
{}
};あくまでシノニムさんが示された関数を尊重する形にするとこうなりますが、まあ、あまり良い設計とは言えないでしょうね・・・。