ページ 11

弾の動きとデータはどこに書く?

Posted: 2011年10月12日(水) 22:09
by アップル鈴木
現在作成中のシューティングゲームで数種類のメイン武器を使い分けられるようにしたいのですが、武器のデータ(攻撃力や連射力)と弾の動きをどこにどのように書けばいいか思いつきません。
龍神録の館14章「いろんな弾幕データを作ってみよう」が近いような気がするのですが、弾の登録などが違うので参考にしづらいです。
目標は下のような感じです。皆さんの知恵を分けてくださいm(__)m

・目標
動きやデータは別ファイルで管理(外部ファイルでも新しいcppファイルでも)
playerBullet.cppで弾の動き、攻撃力を管理
pulayer.cppで連射力や装填数、今の武器の種類を管理

大体の流れ

コード:

//main.cpp
//中略
Player.FireFlagSet();
for(i = 0; i < (100); i++)
        {
		if (PlayerBullet[i].CheckFlag(Player.GetFirefFlag())==true)//プレイヤーのファイアフラグと弾が開いてるかどうかチェック
		{
			PlayerBullet[i].FlagSet(Player.GetX(),Player.GetY());//フラグセットGetはそのまんまの意味です
			Player.FireFlagDown();//ファイアフラグおろし
			break;
		}
	}

for(i = 0; i < (100); i++)
{
		PlayerBullet[i].Move();//ショット移動
}
//後略

コード:

//player.cpp
//略
void CPlayer::FireFlagSet()
{
		switch(state){//state Playerの状態
		case ENTER://いるなら
			if(reloadcount<reload)//リロードがまだできていない時 ※reloadは武器異存
			{
			reloadcount++;//リロードカウント
			}
			else//できている時
			{
				if(rapidcount<rapid)//連射速度の判定 ※rapidは武器異存
				{
					rapidcount++;//まだならカウントし
					fireF=false;		//フラグを下げる fireF=ファイアフラグ
					if(chargeflag==true)//装填フラグがあれば
					{
						charge=chargeMAX;//(charge=装填数 武器異存)装填数を最大にし
						chargeflag=false;//フラグを下ろす つまり一度だけする
					}
				}
				else if(M_Button(1)>=1)//カウントを満たし、かつマウスが押されていたら処理開始 ※M_Button マウスについての自作関数です
				{
					fireF=true;//ファイアフラグを立て
					rapidcount=0;//連射速度のカウントを減らし
					charge--;//残弾を減らす
					if(charge<=0)//残弾0なら
					{
						reloadcount=0;//リロードカウントを減らし
						chargeflag=true;//装填フラグを立てる
						rapidcount=rapid-1;//連射速度判定を1回入れるための処理
					}
				}
			}
			break;
		default:
			break;
	}
}
//後略

コード:

//Playerbullet.cpp
//略
bool CPlayerBullet::CheckFlag(bool flagF)
	{
		if(flagF==true&&enterflag==false)return true;//プレイヤーのファイアフラグがtrueかつ自分がまだ出てないなら
	else return false;
	}
};
void CPlayerBullet::FlagSet(int playerx,int playery)//フラグ確認
{
	if(enterflag==false){//弾のフラグ
	enterflag=true;//発射フラグ立てる
	x=playerx;//初期位置
	y=playery;
	aimx=M_x();//マウスのx座標 狙っている場所
	aimy=M_y();//マウスのy座標
	count=0;
	
	}
}
void CPlayerBullet::Move()//移動 ※ここでケース文なりで動きを変えたい
{
	if(enterflag==true){//フラグonなら
		//ミサイル風の動き
       count++;
		if(count==1){radian=0;}
		if(count<16){y+=2;}
		if(count>=12&&count<=16){radian=(atan2((aimy-y),(aimx-x)))*(count-12)/4;}
		if(count>=16){
			x+=cos(radian)*speed;
			y+=sin(radian)*speed;
		}
	}
	if(x<0||x>640||y<0||y>480)enterflag=false;//画面外でフラグ0
}
//後略

・・・書いててわかりづらい気がしてきたのでソースファイルを添付しときます。DXライブラリをそちらで設定してくだされば動く・・・はずです。

Re: 弾の動きとデータはどこに書く?

Posted: 2011年10月12日(水) 22:21
by jay
そうですね~
ちょっと今は具体的なことを書くのはアレなので考え方だけ…

僕もシューティングゲームでいくつかの武器を使い分ける(厳密には少し違いますけどね)
ということをやったことがありますので参考にでもなれば

まずはプレイヤーの構造体にweponという変数を持たせます。
これがそのまま武器の種類に対応している訳です、例えば0ならホーミング弾、1ならレーザーといった具合ですね。

で、次に弾の構造体には座標や向きといった当然の情報に加えて
種類(上記のweponの値をそのまま代入)という情報を持たせます。
後は弾を登録するときに、weponの値に応じた情報(弾速や攻撃力など)を持たせてやります。
弾を移動させる関数では、弾の種類に応じて挙動(ホーミングなら近くの敵を追尾する、レーザーなら的に当たっても弾が消えずに貫通するなど)をするようにしてやってくださいね。

そして実際に弾を描画させるときにweponの値に応じた画像を描画させればそれっぽくなります。

文章だけでは少々分かりづらいかも知れませんね(苦笑)
とりあえず、やり方の一つとして参考にしてください。