変な円形の弾幕

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tune

変な円形の弾幕

#1

投稿記事 by tune » 14年前

お世話になっております。tuneです。

今回は自作してみた”弾幕っぽいもの”がなんか気持ち悪い動きをしてしまうので、それについて質問させていただきます。

とりあえず、コードはこちらです。

コード:

#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です。

匿名希望の774さん

Re: 変な円形の弾幕

#2

投稿記事 by 匿名希望の774さん » 14年前

void endan(float x[],float y[],float vx[],float vy[])で一番最初に変数radを0に初期化してください。
それで治ります。
変数が初期されていないために起きたものですので今後は注意してください。

tune

Re: 変な円形の弾幕

#3

投稿記事 by tune » 14年前

ありがとございました!!

正常の動きになりました。
今後、気をつけたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る