C/C++縦スクロールゲーム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
samusu0905
記事: 336
登録日時: 5年前

C/C++縦スクロールゲーム

#1

投稿記事 by samusu0905 » 5年前

縦スクロールのゲームを作ってます。そこでなんですが、プレイヤーに炎を放射させる処理をしたいのですが、
上手くいかないです。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;		//存在しなくする
	}
}
こんな感じです。
わかりやすいプログラムお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 8年前
住所: 東海地方
連絡を取る:

Re: C/C++縦スクロールゲーム

#2

投稿記事 by softya(ソフト屋) » 5年前

> わかりやすいプログラムお願いします。
こちらの掲示板では作ってもらうではなく、作り方をレクチャーするって方針で運営しております。
基本的にはご自身で作ると言うことを忘れないで下さいね。

>炎を放射して連射をループさせることができませんでした。最終的には連射をループさせる処理です。

前にも言われたと思いますが、samusu0905さんの言われるループは意味が通じません。
ループでは無く炎なので再放射だと思いますが、ループの一言ですませるには情報が余りに不足なのです。
1.現状の問題を明確に書き出してください。
2.ループという言葉以外で発生条件を明確に説明してください。 代名詞の「あれ」と同じぐらい曖昧な説明なのです。
「あれがうまく行きません」と言われても答えようがないのです。

【補足】
タイトルには質問内容を書いてくださいね。
「C/C++縦スクロールゲーム」は補足的な情報で、主題は炎が思うように連射できない。だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6198
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: C/C++縦スクロールゲーム

#3

投稿記事 by みけCAT » 5年前

samusu0905 さんが書きました:

コード:

//移動----------------------------------------------------------------------
void FireMove(void)
{
    int i;
    
    for( i=0; i<FIRE_MAX; i++)
    {
        //存在すれば
        if( gFire[i].flg == ON)
        {
            gFire[i].y -= 5;            //上に移動
        }
    }
}

コード:

//移動範囲の制限の実施------------------------------------------------------------
void FireInScreenOne(int i)
{
    //上方向
    if( gFire[i].y > GS_WINDOW_WIDTH )
    {
        gFire[i].flg = OFF;     //存在しなくする
    }
}
また移動方向と消える条件の整合性が取れていないですね。
こんな感じで、両方判定すればエンバグする可能性が減ると思います。

コード:

//移動範囲の制限の実施------------------------------------------------------------
void FireInScreenOne(int i)
{
    //上下方向
    if( gFire[i].y > GS_WINDOW_WIDTH || 0 > gFire[i].y )
    {
        gFire[i].flg = OFF;     //存在しなくする
    }
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6198
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: C/C++縦スクロールゲーム

#4

投稿記事 by みけCAT » 5年前

さらに、縦方向だからGS_WINDOW_WIDTHではなくGS_WINDOW_HEIGHTと比較した方がいいのではないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

samusu0905
記事: 336
登録日時: 5年前

Re: C/C++縦スクロールゲーム

#5

投稿記事 by samusu0905 » 5年前

そのとおりですね。プログラムを参考に書いたらできました。
教えていただき有難うございました!
これからは、タイトルの件名をもっと明確に記述したいと思います。

閉鎖

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