弾の描画について 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 ; // ソフトの終了
}