弾の描画について 2
Posted: 2009年11月20日(金) 21:53
※前にも同じようなのを投稿してるので「2」です。解決した板で話すのもどうかと思い・・・
現在小さなシューティングを作ってます。少し前までは弾は絵で描画してましたが、
当たり判定でいろいろ面倒なので、「DrawCircle」で描画することにしました。しかし、
なぜか敵の弾が規則的・瞬間的にでかくなります。代入位置とかいろいろ試してみましたが
検討がつきません。誰かお願いします。 以下プログラム
現在小さなシューティングを作ってます。少し前までは弾は絵で描画してましたが、
当たり判定でいろいろ面倒なので、「DrawCircle」で描画することにしました。しかし、
なぜか敵の弾が規則的・瞬間的にでかくなります。代入位置とかいろいろ試してみましたが
検討がつきません。誰かお願いします。 以下プログラム
#include "DxLib.h" #define Z_image 2 //自機画像の数 2 #define T_image 2 //敵機画像の数 2 #define Tamax 50 //弾の最大数 50 #define Zhp 100 //自機のHP 100 #define Thp 50 //敵機のHP 50 #define T_Speed 20 //自弾の速度 20 #define Teki_Speed 10 //敵弾の速度 15 typedef struct{ int x,y,hp,Mhp,Range; }Ziki_date; typedef struct{ int x,y,hp,Mhp,Range; }Teki_date; typedef struct{ int x,y,Flag,Range; }Tama_date; typedef struct{ int x,y,TFlag,Range; }T_Tama_date; char Key[256]; int count=0,C=0,TC=0; Ziki_date Ziki; Teki_date Teki[20]; Tama_date Tama[Tamax]; T_Tama_date T_Tama[Tamax]; //ここから関数宣言―――――――――――――――― //この辺Fps設定 長いので切る //―――――――――――――――――――――――― int Seach_Tama(){ //使われてない弾のサーチ int i; for(i=0; i<Tamax; i++){ if(Tama.Flag==0) return i; } return -1; } //―――――――――――――――――――――――― int Seach_T_Tama(){ //使われてない敵弾のサーチ int i; for(i=0; i<Tamax; i++){ if(T_Tama.TFlag==0) return i; } return -1; } //―――――――――――――――――――――――― void Shot_Tama(){ //自機 int i; if(C<5)C++; //もしCが5以下だったらCに+1 else if(Key[KEY_INPUT_Z]==1){ //↑でCが5以上になったら起動 C=0; if((i=Seach_Tama())!=-1){ Tama.Flag=1; //フラグを立てる Tama.x =Ziki.x; //自機の座標代入 Tama.y =Ziki.y; Tama.x +=7; Tama.y +=10; //弾のx・y軸補正 } } } //―――――――――――――――――――――――― void Shot_T_Tama(){ //敵機 int i; if(TC<5)TC++; else if(Teki[0].x>0){ //Tekiのx座標が0以上だった時起動 TC=0; if((i=Seach_T_Tama())!=-1){ T_Tama.TFlag=1; //フラグを立てる T_Tama.x =Teki[0].x; //自機の座標代入 T_Tama.y =Teki[0].y; T_Tama[i].x +=7; //弾のx軸補正 T_Tama[i].y +=8; //弾のy軸補正 } } } //―――――――――――――――――――――――― int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ Ziki.x =320; //自機に座標を代入 Ziki.y =240; Ziki.hp =Zhp; //自機のHP Ziki.Mhp=Zhp; Teki[0].x =640; Teki[0].y =120; Teki[0].hp =Thp; Teki[0].Mhp=Thp; int Ziki_image[Z_image],Teki_image[T_image],Count; //自機画像を入れる箱とCountを宣言 if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理 ///////////////////////////////////////////////////////////////////////// SetDrawScreen(DX_SCREEN_BACK); //裏画面に設定 LoadDivGraph("Ziki.png",2,2,1,20,26,Ziki_image); //画像を読み込ませる LoadDivGraph("Teki.png",2,2,1,20,26,Teki_image); for(int i=0; i<Tamax; i++){ Tama[i].Flag =0; Tama[i].x =Ziki.x; Tama[i].y =Ziki.y; T_Tama[i].TFlag=0; T_Tama[i].x =Teki[0].x; T_Tama[i].y =Teki[0].y; } ///////////////////////////////////////////////////////////////////////// while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){ Ziki. Range=6; Tama[Tamax]. Range=2; Teki[0]. Range=6; T_Tama[Tamax].Range=2; fps(); //fpsを固定&表示 count++; wait_fanc(); if(Teki[0].x> -30)Teki[0].x-=10; if(Teki[0].x==-30)Teki[0].x=800; if(Key[KEY_INPUT_LEFT]==1) Ziki.x-=4; //↑と似たような移動定義があと3つ Shot_Tama(); for(int i=0; i<Tamax; i++){ if(Tama[i].Flag==1){ if(Tama[i].y>0)Tama[i].y-=T_Speed; else Tama[i].Flag=0; DrawCircle(Tama[i].x,Tama[i].y,Tama[Tamax].Range,GetColor(0,255,255),TRUE); } } Shot_T_Tama(); for(int i=0; i<Tamax; i++){ if(T_Tama[i].TFlag==1){ if(T_Tama[i].y<500)T_Tama[i].y+=Teki_Speed; else T_Tama[i].TFlag=0; DrawCircle(T_Tama[i].x,T_Tama[i].y,T_Tama[Tamax].Range,GetColor(255,50,0),TRUE); } } DrawGraph (Ziki.x,Ziki.y,Ziki_image[0],TRUE ); DrawGraph (Teki[0].x,Teki[0].y,Teki_image[0],TRUE); ScreenFlip(); } ///////////////////////////////////////////////////////////////////////// DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }