配列で画面に複数の弾丸を表示したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Chalaza

配列で画面に複数の弾丸を表示したい

#1

投稿記事 by Chalaza » 14年前

ガンシューティングのような連射できる弾を敵に撃たせたいのですが、弾丸の配列を作ってfor分で複数表示しようとしても
1つまでしか表示できませんでした。
Enemy_Initializeですべての弾丸のフラグを0にしてから始めて、
Ningyo->Shotという変数が1になった瞬間にfor文で弾丸の初期位置設定をしてFlagを1にする。
Flagが1の弾だけ表示されながら左に動くという設定のつもりなのですが、どこが原因でしょうか?

コード:

#include "DxLib.h"
#include "Enemy.h"
#include "Player.h"
#include "KeyBoard.h"

extern int CameraX;
int WaterBlueShotImage;

void Enemy_Initialize(Ningyo_t *Ningyo, NingyoTama_t *NingyoTama){

	LoadDivGraph( "Image/Chara/Ningyo.png" , 6 , 6 , 1 , 144 , 144 , Ningyo->DivImage );//画像の分割読み込み
	WaterBlueShotImage = LoadGraph("Image/Shot/WaterBlueShot.png");
	Ningyo->Enter=0;
	Ningyo->Flag=0;
	Ningyo->JumpPower=0;
	Ningyo->Jump=0;
	Ningyo->JumpAccel=0.4;
	Ningyo->RakkaCount=0;
	Ningyo->Count=0;
	Ningyo->ShotCount=0;
	Ningyo->ShotAnime=0;
	NingyoTama->Flag[0]=0;
	NingyoTama->Flag[2]=0;
	NingyoTama->Flag[2]=0;
	NingyoTama->Flag[3]=0;
	NingyoTama->Flag[4]=0;
	NingyoTama->Flag[5]=0;
	NingyoTama->Flag[6]=0;
	NingyoTama->Flag[7]=0;
	NingyoTama->Flag[8]=0;
	NingyoTama->Flag[9]=0;
	NingyoTama->Flag[10]=0;
}

//敵の出現条件
void Enemy_Enter(Player_t *Player,Ningyo_t *Ningyo){

	if( Player->X>=256 && Ningyo->Enter==0 && Ningyo->Flag==0 ){
		Ningyo->Enter=1;

	}

}
//移動パターン
void Ningyo_Pattern(Ningyo_t *Ningyo, NingyoTama_t *NingyoTama){

	Ningyo->ViewX = Ningyo->X-CameraX;

	//初期位置&フラグ
	if(Ningyo->Enter==1){
		Ningyo->Flag=1;
		Ningyo->X=400+CameraX;
		Ningyo->Y=384;
		Ningyo->Image=Ningyo->DivImage[0];
		Ningyo->Enter=0;
		Ningyo->Count=0;
		Ningyo->RakkaCount=0;
	}
	//フラグが1の間だけ処理
	if(Ningyo->Flag==1){
		Ningyo->Count++;
		//ジャンプ
		if(Ningyo->Count==1){
			Ningyo->JumpPower = 18;
			Ningyo->Jump=1;
			Ningyo->Image=Ningyo->DivImage[0];
		}
		//ジャンプ中は落下させる
		if(Ningyo->Jump==1){
		Ningyo->Y-=(int)Ningyo->JumpPower;
		Ningyo->JumpPower-=Ningyo->JumpAccel;
		}
		if(Ningyo->JumpPower<=0 && Ningyo->RakkaCount<=16){//アニメ
			Ningyo->RakkaCount++;
			Ningyo->Image = Ningyo->DivImage[(Ningyo->RakkaCount%24)/8+1];
		}
		//地面についたら着地
		if(Ningyo->Jump==1 && Ningyo->JumpPower<0 && Ningyo->Y+144>=320){
			Ningyo->Jump=0;
			Ningyo->JumpPower=0;
			Ningyo->Image = Ningyo->DivImage[4];
		}
		//一定間隔で2発まだらに撃つ
		if(Ningyo->Count>=120){
			if(Ningyo->Count%180==0 || Ningyo->Count%150==0 ){
				Ningyo->Shot=1;
				Ningyo->ShotAnime=1;
			}
		}
		//撃つ瞬間に弾の初期設定(ここが原因?)
		if(Ningyo->Shot==1){
			for(int i = 0; i < 10; i++)
			{
				if(NingyoTama->Flag[i] == 0)
				{
					//弾の初期化
					NingyoTama->Flag[i] = 1;

					NingyoTama->X[i] = Ningyo->ViewX-32;
					NingyoTama->Y[i] = Ningyo->Y+96;


				}
			}
		}
		Ningyo->Shot=0;
		if(Ningyo->ShotAnime==1){//8フレームだけ撃ってる画像に
			Ningyo->ShotCount++;
			if(Ningyo->ShotCount<=8)
				Ningyo->Image=Ningyo->DivImage[5];
			if(Ningyo->ShotCount>8){
				Ningyo->Image=Ningyo->DivImage[4];
				Ningyo->ShotCount=0;
				Ningyo->ShotAnime=0;
			}
		}
		//弾の移動
		for(int i = 0; i < 10; i++)
		{
			if(NingyoTama->Flag[i] == 1)
			{
				NingyoTama->X[i] = NingyoTama->X[i] - 7;
				
				if(NingyoTama->X[i] > 512 || NingyoTama->X[i] < -64)
				{
					//弾が範囲をオーバーしたら削除

					NingyoTama->Flag[i] = 0;
				}

				NingyoTama->Img[i] = WaterBlueShotImage;
			}
		}
	}
}
//敵描画
void Enemy_Draw(Ningyo_t Ningyo, NingyoTama_t NingyoTama){

	//人魚
	DrawGraph( Ningyo.ViewX, Ningyo.Y , Ningyo.Image, TRUE ) ;
	for(int i = 0; i < 10; i++)
		{
			if(NingyoTama.Flag[i] == 1)
			{
				DrawGraph( NingyoTama.X[i],  NingyoTama.Y[i], NingyoTama.Img[i], TRUE );
			}
		}
}

ふりかけ

Re: 配列で画面に複数の弾丸を表示したい

#2

投稿記事 by ふりかけ » 14年前

フラグが0の弾丸を見つけて、フラグを1に変えた後にbreak文でfor文を抜けてください。
おそらく一発しか発射されないのではなく10発が重なっています。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 配列で画面に複数の弾丸を表示したい

#3

投稿記事 by beatle » 14年前

気になった点

コード:

    NingyoTama->Flag[0]=0;
    NingyoTama->Flag[2]=0;
    NingyoTama->Flag[2]=0;
    NingyoTama->Flag[3]=0;
NingyoTama->Flag[1]の初期化が見当たりません。
それから、NingyoTama->Flag[10]=0;として10番目までアクセスしてますが、Flagはちゃんと11個以上の
配列になってますか?
こういう、添字だけ異なる場合はfor文を使うといいです。

コード:

for (int i = 0; i < 11; ++i) // 11個の配列の初期化
{
    NingyoTama->Flag[i] = 0;
}

Chalaza

Re: 配列で画面に複数の弾丸を表示したい

#4

投稿記事 by Chalaza » 14年前

弾が全部重なっていたようです。break文でうまく1発ずつ表示されるようになりました。
ついでに初期化をfor文にしてコードもすっきりしました。ありがとうございました。

閉鎖

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