上手くいかないです。for文で複数の炎を放射することはできても、連射が出来ません。
やりたいことは、炎を放射したときに炎の連射タイマーを設定してタイマーが0なら放射可能な状態にして、
タイマーが0以上なら放射不可能な状態にする処理をしたいと思っています。もっとも分かりやすく説明すると、
最初はタイマーを0に、そして放射したと同時に一度タイマーに1を加算して放射不可能にする。
1加算されたときに、if文でタイマーが0以上(放射不可能な状態)ならばタイマーをgFIreTimer++;にして加算します。
そして、タイマーが8または6を超えるとタイマーを0にして放射可能な状態に戻すという処理です。
以上がやりたい処理です。自分もここに説明を書いた通りにやりましたが、
炎を放射して連射をループさせることができませんでした。最終的には連射をループさせる処理です。
ここにプログラムを提示させます。
//********************************************************************
// 炎
//********************************************************************
#include <stdio.h> //C言語
#include "gs.h" //学内ライブラリィ
#include "def.h" //共通定義
#include "Fire.h" //炎
//宣言--------------------------------------
OBJ gFire[FIRE_MAX]; //炎の構造体
int gFireTimer; //炎放射タイマー
//参照--------------------------------------
extern gsTexture sFire; //炎
//開始----------------------------------------------------------------------
void FireStart(void)
{
int i;
for(i=0; i<FIRE_MAX; i++)
{
gFire[i].flg = OFF; //存在しない(初期設定)
}
gFireTimer = 0; //炎放射タイマー
}
//メイン処理----------------------------------------------------------------
void FireMain(void)
{
FireMove(); //移動
FireInScreen(); //移動範囲の制限
FireSetTimer(); //発生するタイマー処理
}
//表示----------------------------------------------------------------------
void FireDraw(void)
{
int i;
//炎の数ループ
for(i=0; i<FIRE_MAX; i++)
{
//存在すれば
if( gFire[i].flg == ON)
{
gsDraw2D( sFire, gFire[i].x, gFire[i].y); //炎
}
}
FireDrawDebug();
}
//デバッグ表示--------------------------------------------------
void FireDrawDebug(void)
{
char str[100];
sprintf(str, "gFireTimer=%d", gFireTimer);
gsDrawText(5, 20, str);
}
//発生----------------------------------------------------------------------
void FireSet(int x, int y)
{
int i;
//放射できないなら処理を終了
if( gFireTimer > 0)
{
return;
}
//炎の数ループ
for( i=0; i<FIRE_MAX; i++)
{
//存在しなければ
if( gFire[i].flg == OFF)
{
FireSetOne(i,x, y); //発生の実施
break; //ループを抜ける
}
}
}
//発生の実施-----------------------------------------------------------------
void FireSetOne(int i ,int x, int y)
{
gFire[i].flg = ON; //存在させる
gFire[i].x = x; //X座標を設定
gFire[i].y = y; //Y座標を設定
gFireTimer = 1; //放射できないタイミングにする
}
//発生するタイマー処理------------------------------------------------------
void FireSetTimer(void)
{
if( gFireTimer > 0) //撃てないなら
{
gFireTimer++; //タイマー
if( gFireTimer > 8) //8を超えると
{
gFireTimer = 0; //タイマーを0にして撃てるタイミングにする
}
}
}
//移動----------------------------------------------------------------------
void FireMove(void)
{
int i;
for( i=0; i<FIRE_MAX; i++)
{
//存在すれば
if( gFire[i].flg == ON)
{
gFire[i].y -= 5; //上に移動
}
}
}
//移動範囲の制限------------------------------------------------------------
void FireInScreen(void)
{
int i;
for(i=0; i<FIRE_MAX; i++)
{
//炎が放射されていれば
if(gFire[i].flg == ON)
{
FireInScreenOne(i); //移動範囲の制限の実施
}
}
}
//移動範囲の制限の実施------------------------------------------------------------
void FireInScreenOne(int i)
{
//上方向
if( gFire[i].y > GS_WINDOW_WIDTH )
{
gFire[i].flg = OFF; //存在しなくする
}
}
わかりやすいプログラムお願いします。