今回は自作してみた”弾幕っぽいもの”がなんか気持ち悪い動きをしてしまうので、それについて質問させていただきます。
とりあえず、コードはこちらです。
#include "DxLib.h"
#define PI 3.14159
#include<math.h>
#define BN 50 //弾の数
#define R 10 //弾の半径
//プロトタイプ宣言
void endan(float x[],float y[],float vx[],float vy[]);
char Key[256];
float rad_step = PI*2/BN; //弾と弾の角度の間隔
float rad = 0;
int blue = GetColor( 0 , 0 , 255 ) ; // 青色の値を取得
float speed = 2;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
//弾の座標を格納する配列
float x[BN],y[BN];
float x2[BN],y2[BN];
float x3[BN],y3[BN];
float x4[BN],y4[BN];
//弾の速度を格納する配列
float vx[BN],vy[BN];
float vx2[BN],vy2[BN];
float vx3[BN],vy3[BN];
float vx4[BN],vy4[BN];
int way[BN]; //弾の向き
//座標の初期化
for(int i=0;i<BN;i++) x4[i] = x3[i] = x2[i] = x[i] = 320;
for(int i=0;i<BN;i++) y4[i] = y3[i] = y2[i] = y[i] = 240;
for(int i=0;i<BN;i++) way[i] = 0;
int cnt=0;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
endan(x,y,vx,vy);
if(cnt>20)
endan(x2,y2,vx2,vy2);
if(cnt>40)
endan(x3,y3,vx3,vy3);
/* //コメントを外すと変な動きをする。
if(cnt>60)
endan(x4,y4,vx4,vy4);
*/
cnt++;
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
void endan(float x[],float y[],float vx[],float vy[])
{
for(int i=0;i<BN;i++)
{
rad += rad_step;
vx[i] = cos(rad) * speed;
vy[i] = sin(rad) * speed;
/* //跳ね返り(左右のみ)
if( (x[i]-R)<0 && x[i]>0) way[i] = 1;
if( (x[i]+R)>640 && x[i]<640) way[i] = 2;
if(way[i] == 1) vx[i] = -vx[i];
if(way[i] == 2) vx[i] = -vx[i];
*/
x[i] += vx[i];
y[i] += vy[i];
DrawCircle( x[i] , y[i] , R , blue , TRUE ) ;
}
}
問題なのはmain()関数の中にあるwhileループのcnt変数によって制御されているendan()関数です。
3つ目までのendan()関数はきちんと動いている気がするのですが、4つ目のif(cnt>60)のendan(x4,y4,vx4,vy4)をコメントから外して
関数を動かしてしばらくするとすべての弾が変な動きをしてしまいます。
画面の中心にもどってきてぐにゃぐにゃします。
原因が自分ではよくわかりませんでした。
それと、跳ね返りは今のところ気にしないでください。
あとで、弾が画面のふちで跳ね返るようにしたいだけなので。
開発環境はBCC Developerです。