敵さんにHPを付けてあげたい

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

敵さんにHPを付けてあげたい

#1

投稿記事 by 葉月 » 14年前

また質問させていただきます。。。
今度は、敵のHPが0になった時に敵が消滅してくれるようにしたいんです!
一様、敵さんに攻撃はヒットするようにはできました。
ソースを載せるのでアドバイスお願いします。。。
わからない所は敵にHPをどう渡せば良いのかがわかりません。

コード:

/////////////////////////////////////////////
///...インクルード
/////////////////////////////////////////////

#include "FPSsample.h"
#include "player.h"
#include "Bullet.h"
#include "enemy.h"
#include <math.h>


////////////////////////////////////////////
///...マクロ定義(defineなど)
////////////////////////////////////////////

#define MAX_BULLET		(100)
#define MAX_DAMEJI		(1)					//弾のダメージ
#define LIMIT_UP			(2.0f)			//上移動限界
#define LIMIT_LEFT			(2.0f)			//左移動限界
#define LIMIT_RIGHT			(78.0f)			//右移動限界
#define LIMIT_DOWN			(24.0f)			//下移動限界


/////////////////////////////////////////////
//グローバル変数
/////////////////////////////////////////////

BULLET g_aBullet[MAX_BULLET];



/*-----------------------------------
 関数名 :InitBullet
  機能  :初期化
  引数  :void
  戻り値 :int
  -----------------------------------*/
void InitBullet()
{
	//配列の個数分ループ
	for(int nCntBullet = 0 ; nCntBullet < MAX_BULLET ; nCntBullet = nCntBullet + 1)
	{
		g_aBullet[nCntBullet].type = BULLETTYPE_PLAYER;
		g_aBullet[nCntBullet].bUse = false;
		g_aBullet[nCntBullet].fPosX = 0.0f;
		g_aBullet[nCntBullet].fPosY = 0.0f;
		g_aBullet[nCntBullet].fPosXOld = 0.0f;
		g_aBullet[nCntBullet].fPosYOld = 0.0f;
		g_aBullet[nCntBullet].fMoveX = 0.0f;
		g_aBullet[nCntBullet].fMoveY = 0.0f;
	}
}

/*-----------------------------------
 関数名 :UninitBullet
  機能  :
  引数  :void
  戻り値 :int
  -----------------------------------*/
void UninitBullet()
{
	;//今は空白
}

/*-----------------------------------
 関数名 :UpdateBullet
  機能  :位置更新
  引数  :void
  戻り値 :int
  -----------------------------------*/
void UpdateBullet()
{
	//配列の個数分ループ
	for(int nCntBullet = 0 ; nCntBullet < MAX_BULLET ; nCntBullet = nCntBullet + 1)
	{
		//構造体が使われているかどうか
		if(g_aBullet[nCntBullet].bUse)
		{
			//前回の位置に現在の位置を代入
			g_aBullet[nCntBullet].fPosXOld = g_aBullet[nCntBullet].fPosX;
			g_aBullet[nCntBullet].fPosYOld = g_aBullet[nCntBullet].fPosY;
			
			//現在の位置に移動量を加える
			g_aBullet[nCntBullet].fPosX = g_aBullet[nCntBullet].fPosX + g_aBullet[nCntBullet].fMoveX;
			g_aBullet[nCntBullet].fPosY = g_aBullet[nCntBullet].fPosY + g_aBullet[nCntBullet].fMoveY;

			//限界座標を超えているか?
			if(g_aBullet[nCntBullet].fPosX < LIMIT_LEFT || g_aBullet[nCntBullet].fPosX > LIMIT_RIGHT || g_aBullet[nCntBullet].fPosY < LIMIT_UP || g_aBullet[nCntBullet].fPosY > LIMIT_DOWN)
			{
				LOCATE((int)g_aBullet[nCntBullet].fPosXOld , (int)g_aBullet[nCntBullet].fPosYOld);
				printf(" ");		//前回の場所をクリア

				g_aBullet[nCntBullet].bUse = false;
			}
		}
	}
}


/*-----------------------------------
 関数名 :DrawBullet
  機能  :弾の描画
  引数  :void
  戻り値 :int
  -----------------------------------*/
void DrawBullet()
{
	//配列の個数分ループ
	for(int nCntBullet = 0 ; nCntBullet < MAX_BULLET ; nCntBullet = nCntBullet + 1)
	{
		//構造体が使われているかどうか
		if(g_aBullet[nCntBullet].bUse)
		{
			//弾のタイプごとに色を変化させる
			if(g_aBullet[nCntBullet].type == BULLETTYPE_PLAYER)
			{
				COLOR(LIME);
			}
			else
			{
				COLOR(PINK);
			}
			
			//前回の位置にある弾をクリア
			LOCATE((int)g_aBullet[nCntBullet].fPosXOld , (int)g_aBullet[nCntBullet].fPosYOld);
			printf(" ");

			//現在の位置に弾を表示
			LOCATE((int)g_aBullet[nCntBullet].fPosX , (int)g_aBullet[nCntBullet].fPosY);
			printf("=");
		}
	}
}

/*-----------------------------------
 関数名 :SetBullet
  機能  :弾発射
  引数  :void
  戻り値 :int
  -----------------------------------*/
void SetBullet(float posX , float posY , float moveX , float moveY , BULLETTYPE type)
{
	//配列の個数分ループ
	for(int nCntBullet = 0 ; nCntBullet < MAX_BULLET ; nCntBullet = nCntBullet + 1)
	{
		//構造体が未使用かどうか
		if(g_aBullet[nCntBullet].bUse == false)
		{
			//弾の発生座標
			g_aBullet[nCntBullet].fPosX = posX;
			g_aBullet[nCntBullet].fPosY = posY;
			
			//弾の移動量
			g_aBullet[nCntBullet].fMoveX = moveX;
			g_aBullet[nCntBullet].fMoveY = moveY;

			g_aBullet[nCntBullet].type = type;		//弾の種類
			g_aBullet[nCntBullet].bUse = true;		//構造体を使用中に変更

			break;
		}
	}
}

/*-----------------------------------
 関数名 :CheckCollisionBullet
  機能  :当たり判定処理
  引数  :void
  戻り値 :int
  -----------------------------------*/
bool CheckCollisionBullet(ENEMY *pEnemy)
{
		for(int nCntBullet = 0 ; nCntBullet < MAX_BULLET ; nCntBullet ++)
		{
			if(
			sqrt(
			pow(pEnemy ->fPosX- g_aBullet[nCntBullet].fPosX,2)
				+ pow(pEnemy ->fPosY- g_aBullet[nCntBullet].fPosY,2)
				) < 1
			)
			{
				//弾にあたっていたらHPを減らす
				pEnemy ->fHP--;
				return true;
			}
		}

		//敵の消滅処理
		if(pEnemy ->fHP <= 0 ) //敵のHPが0の時敵消滅
		{

			LOCATE((int)pEnemy -> fPosXOId, (int)pEnemy -> fPosYOId);//前回の位置
			printf(" ");
			LOCATE((int)pEnemy -> fPosXOId, (int)pEnemy -> fPosYOId - 1);//前回の位置の一つ上
			printf(" ");


			printf("わかり合えたと信じている...", pEnemy < 0);
		}


		return false;
}

/*---------------EOF---------------*/

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

Re: 敵さんにHPを付けてあげたい

#2

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

ここまで出来ているのならわからない方が不思議なんですが専門学校の課題でしょうか?
敵の消滅は、敵構造体のどの値を変更すれば良いのでしょうか?質問者さんが分からないと答え様がないのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: 敵さんにHPを付けてあげたい

#3

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

コード:

printf("わかり合えたと信じている...", pEnemy < 0);
ここは不自然に感じます。
そもそもpEnemy<0の結果を表示していないし、ポインタと整数を比較しています。
コンパイラの警告が出ませんか?
コードゴルフをしているわけではないですよね?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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