dixqさんの作られたエルシャダイの動画で斜め移動するときのsin,cosの使い方はわかりました
また過去にこのフォーラムに投稿された記事(リンク貼りたいんですが見つかりませんでした)を参考にこういうプログラムを作りました
#include "DxLib.h"
#include <math.h>
#define BALL_MAX 200
#define PI 3.14159265358979
#define PI2 PI*2
//円周率の二倍は360度に等しく、よく使うと考えられるのでここで定義してしまう
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return -1;
SetDrawMode( DX_DRAWMODE_BILINEAR );
typedef struct{
int flag;
double x,y;
double spd,angle;
}ch_t;
ch_t ball[BALL_MAX];
char key[256];
int white=GetColor(255,255,255);
int user_spd=4;
int frame=0;
//初期化、[for関数]内で初期化してるからこれはおk
for(int i=0;i<BALL_MAX;i++){
ball[i].flag=0;
ball[i].x=0;
ball[i].y=0;
ball[i].spd=0;
ball[i].angle=0;
}
SetDrawScreen(DX_SCREEN_BACK);
while(ProcessMessage()!=-1){
frame+=1;
clsDx();
ClearDrawScreen();
GetHitKeyStateAll(key);
//弾のフラグをオンにする。
//このとき弾の情報を一緒に入れておくことにより
//毎ループ中央の座標が弾の座標として代入されることがなくなる
//なお、単位円の円周はPIではなくPI2である。
if(key[KEY_INPUT_X]){
for(int i=0;i<BALL_MAX;i++){
ball[i].flag=1;
ball[i].x=320;
ball[i].y=240;
ball[i].spd=user_spd;
ball[i].angle=i*PI2/BALL_MAX;
}
}
if(key[KEY_INPUT_RIGHT] && frame%7==0){
user_spd+=1;
}
else if(key[KEY_INPUT_LEFT] && frame%7==0){
user_spd-=1;
}
for(int i=0;i<BALL_MAX;i++){
if(ball[i].flag==1){
ball[i].x+=ball[i].spd*cos(ball[i].angle);
ball[i].y+=ball[i].spd*sin(ball[i].angle);
}
}
//弾の描画
for(int i=0;i<BALL_MAX;i++){
if(ball[i].flag==1){
DrawCircle(ball[i].x,ball[i].y,3,white,TRUE);
}
}
if(frame==60){
frame=0;
}
printfDx("%d",user_spd);
ScreenFlip();
}
DxLib_End();
return 0;
}
ここからが本題なのですが、ぐるっと円を描くようなプログラムの作り方がよくわかりません
アルゴリズムというのでしょうか?処理の手順はこんなの考えました
初期化とか
↓
ぐるっとと描く円の中心座標は(320,240)
↓
上の座標を円の中心にして半径が30で角度が0*PI2の点を求め点をかく
↓
同じように1/8*PI2の座標の点を求め点をかく
↓
同じように2/8*PI2の座標の点を求め点をかく
↓
(中略)
↓
同じように8/8*PI2の座標の点を求め点をかく
↓
画面に円が描かれている!
こういうのを考えたのですがプログラムがエラーはでないが思ったとおりの実行結果になってくれません
上に出した奴を改造した感じで誰か書いてくれませんか?
よろしくお願いします
あとこれは激しく関係ないことなんですが掲示板の模様替えとかされましたか?
黒と白の2色表示で見づらいのですが私だけでしょうか?
ちなみにfirefox4.01です
こちらもよろしくお願いします