ページ 11

弾の描画について 2

Posted: 2009年11月20日(金) 21:53
by Ω
※前にも同じようなのを投稿してるので「2」です。解決した板で話すのもどうかと思い・・・

現在小さなシューティングを作ってます。少し前までは弾は絵で描画してましたが、
当たり判定でいろいろ面倒なので、「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 ;              // ソフトの終了
}

Re:弾の描画について 2

Posted: 2009年11月22日(日) 02:09
by チルチル
DrawCircle(T_Tama.x,T_Tama.y,T_Tama[Tamax].Range,GetColor(255,50,0),TRUE);

ここのT_Tama[Tamax].Rangeの所でTamaxを使っているからじゃないですか?

Re:弾の描画について 2

Posted: 2009年11月22日(日) 11:47
by Ω
直してみましたが、今度は弾が小さくなり、ですがバグは直りませんでした。
他の Tama の所を Tama[Tamax] にしてみたりしましたが、変化なしでした。
支障がなければ数字にする手もあるんですが、どうでしょうか?

Re:弾の描画について 2

Posted: 2009年11月22日(日) 12:41
by Cry
Tama[Tamax].RangeとかT_Tama[Tamax].Range
とアクセスしていますが数字に直すと
Tama[50].RangeとT_Tama[50].Range
としてるので配列のオーバーアクセスです。(宣言文でTama[50]だからTama[0 ~ 49]までです。T_Tamaも同じく)

あとTeki_Speedの定義文がコメントと違っていますよ。

Re:弾の描画について 2

Posted: 2009年11月22日(日) 19:53
by Ω
返答ありがとうございます。
Tama[Tamax] を Tama[0(数字)] にしたら直りました。

>>コメント
うっかりしてました。指摘ありです。