体力ゲージについて

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

体力ゲージについて

#1

投稿記事 by samusu0905 » 10年前

ボスの体力ゲージを右側のY座標に表示してゲージを削るところまでは出来ました。
ボスの体力ゲージは緑のゲージを赤のゲージの上に重ねて表示しています。
そこでやりたい事は、ボスがプレイヤーの弾に衝突した時に、体力ゲージの緑のゲージを先に減らして、
緑のゲージが無くなったら赤のゲージも減る処理がしたいのですが、どう書けばいいですか?

コード:

#include <stdio.h>		//C言語
#include "gs.h"			//学内ライブラリィ
#include "def.h"		//共通定義
#include "Graphics.h"	//グラフィック


//宣言-------------------------------------------


//参照-------------------------------------------
extern gsTexture sRed;			//赤のグラフ
extern gsTexture sGreen;		//緑のグラフ
extern gsTexture sNumText;		//数字の文字
extern gsTexture sEnemy2;
extern OBJ gEnemy2[ENEMY2_MAX];


//グラフを表示-----------------------------------------------------
void GraphicsDrawBox( int x, int y, int size1, int size2)
{
	//赤色で下地を描く
	gsDraw2DEx( sRed, x ,y ,16, size2, 0x80ffffff );
	

	//緑で上に描く
	if( size2 > 0)
	{
		gsDraw2DEx( sGreen, x, y, 16, size1, 0x80ffffff);
	}
}

コード:

#include <stdio.h>					//C言語
#include "gs.h"						//学内ライブラリィ
#include "def.h"					//共通定義
#include "Boss1.h"					//ボス
#include "Graphics.h"				//グラフィック処理


//変数宣言----------------------------------------------------------------
OBJ gBoss1;							//ボスの構造体


//変数参照----------------------------------------------------------------
extern gsTexture sBoss1;			//ボス1
extern gsTexture sBoss1Damage;		//ボス1ダメージ
extern gsTexture sBossText;			//ボスの文字
extern int gScore;					//スコア


//開始------------------------------------------------------------------------------------------------
void Boss1Start(void)
{
	gBoss1.flg = OFF;				//存在しない設定
}


//メイン処理-------------------------------------------------------------------------------------------
void Boss1Main(void)
{
	//存在しなければ
	if( gBoss1.flg == OFF)
	{
		Boss1Set();					//発生
	}
	//存在すれば
	else
	{
		Boss1Move();				//移動
		Boss1InScreen();			//移動範囲の制限
		Boss1Damage();				//ダメージ
		//Boss1Shot();				//弾を発射
	}
}


//表示---------------------------------------------------------------------------------------------
void Boss1Draw(void)
{
	//存在しなければ中止
	if( gBoss1.flg == OFF)
	{
		return;
	}

	//通常の状態
	if( gBoss1.timer == 0)
	{
		gsDraw2D( sBoss1, (int)gBoss1.x, (int)gBoss1.y);			//ボス
	}
	//ダメージ中なら
	else
	{
		//通常と交互に表示処理を行う
		if( gBoss1.timer%2 == 0)
		{
			gsDraw2D( sBoss1, (int)gBoss1.x, (int)gBoss1.y);		//通常
		}
		else
		{
			gsDraw2D( sBoss1Damage, (int)gBoss1.x, (int)gBoss1.y);	//ダメージ中
		}
	}

	//HPを表示
	gsDraw2D( sBossText, 1020, 10);			//ボス文字
	GraphicsDrawBox( 1020, 80, gBoss1.HP/2, 500 );//ボスHP
	GraphicsDrawBox( 1020, 80, gBoss1.HP/2, 500 );//ボスHP
}


//発生----------------------------------------------------------------------------------------
void Boss1Set(void)
{
	//スコアが4500小さいでは発生しない
	if( gScore < 4500)
	{
		return;			//何もしない
	}

	gBoss1.flg = ON;				//存在させる
	gBoss1.x = 300;					//X座標を設定
	gBoss1.y -= 300;				//Y座標を設定
	gBoss1.dir = 3;					//左右に移動
	gBoss1.HP = 1000;				//HPを設定
}


//移動----------------------------------------------------------------------------------------
void Boss1Move(void)
{
	//上から下に移動
	if( gBoss1.y <= 0)
	{
		gBoss1.y += 3;		//下に移動
	}
	else
	{
		gBoss1.x += gBoss1.dir;		//左右に移動
	}

}


//移動範囲の制限------------------------------------------------------------------------------
void Boss1InScreen(void)
{
	//左方向
	if( gBoss1.x < 120)
	{
		gBoss1.dir += 3;				//右に移動
	}
	else
	//右方向
	if( gBoss1.x > 640)
	{
		gBoss1.dir -= 3;				//左に移動
	}
}


//ダメージ-------------------------------------------------------------------------------------
void Boss1Damage(void)
{
	//ダメージ中なら
	if( gBoss1.timer > 0)
	{
		//加算し、50超えるとダメージ終了
		gBoss1.timer++;
		if( gBoss1.timer > 50)
		{
			gBoss1.timer = 0;
		}
	}
}
上のコードがボスの体力ゲージを表示させるために書いたグラフィック処理とボスの処理です。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 体力ゲージについて

#2

投稿記事 by h2so5 » 10年前

具体的に何が分からないのですか?

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

Re: 体力ゲージについて

#3

投稿記事 by samusu0905 » 10年前

上手く説明できませんが。具体的に言うと、ボスがダメージを受けたときに,体力ゲージを緑ゲージから減らしていって
緑ゲージが無くなったら次に赤いゲージを減らすと言った処理が分かりません。これ以上は説明しずらいですね。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 体力ゲージについて

#4

投稿記事 by h2so5 » 10年前

では現在の体力を引数として、その時の緑ゲージと赤ゲージの長さをそれぞれ出力する関数を作れますか?
単純にロジックの問題です。

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

Re: 体力ゲージについて

#5

投稿記事 by samusu0905 » 10年前

緑と赤のゲージの長さをそれぞれ出力ですか? 申し訳ないですが、書いてもらえますか?
具体的にどんな感じに書けばいいのか教えてください。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 体力ゲージについて

#6

投稿記事 by h2so5 » 10年前

ロジックが分からないのですか?それともC言語が分からないのでしょうか。

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

Re: 体力ゲージについて

#7

投稿記事 by samusu0905 » 10年前

今考えましたが、かなり難しいです。
h2so5さんが言いたいのは、設定したHPを引数にして、緑と赤のゲージそれぞれの長さを体力に合わせて出力するってことですよね?

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

Re: 体力ゲージについて

#8

投稿記事 by samusu0905 » 10年前

ロジックですね。C言語はわかります。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 体力ゲージについて

#9

投稿記事 by h2so5 » 10年前

例えば体力が合計で1000で、緑・赤ゲージの長さがそれぞれ500ピクセルだとすると、

体力 ≧ 500 のとき
 緑ゲージの長さ: (体力 - 500) ピクセル
 赤ゲージの長さ: 500ピクセル

体力 < 500 のとき
 緑ゲージの長さ: 0 ピクセル
 赤ゲージの長さ: (体力) ピクセル

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

Re: 体力ゲージについて

#10

投稿記事 by samusu0905 » 10年前

この処理ってどのコードに書けばいいですか?
ボスの処理でしょうか?それともグラフィック処理でしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 体力ゲージについて

#11

投稿記事 by h2so5 » 10年前

ボスにとってはゲージが何個あるかは関係ないのでグラフィック上の処理ですね。

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

Re: 体力ゲージについて

#12

投稿記事 by samusu0905 » 10年前

あの色々と質問攻めで申し訳ないですが、

体力 ≧ 500 のとき
 緑ゲージの長さ: (体力 - 500) ピクセル ←緑ゲージの長さとピクセルの間にある:これってなんですか?
 赤ゲージの長さ: 500ピクセル ←ここも同じ処理内容が書いてありますが。

体力 < 500 のとき
 緑ゲージの長さ: 0 ピクセル
 赤ゲージの長さ: (体力) ピクセル

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 体力ゲージについて

#13

投稿記事 by h2so5 » 10年前

https: //ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AD%E3%83%B3_(%E8%A8%98%E5%8F%B7)
コロン(colon)は、欧文の約物のひとつ「:」である。

(中略)

説明・言い換え。「X: Y」は、「X、つまりY」「X、言い換えるとY」、あるいは文中でなく単独で使われた場合は「XはYである」と意訳できる。

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

Re: 体力ゲージについて

#14

投稿記事 by samusu0905 » 10年前

いえ、あのコロンなのは知っています。
もしかしてコロンを間に書けばいいんですか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 体力ゲージについて

#15

投稿記事 by h2so5 » 10年前

ええと、このコロンはあくまで自然言語の記号として等価であることを示すために使っているだけであって、プログラミング言語や数式とは関係がないのです。実際C言語で実装するときは=を使うことになると思いますが。

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

Re: 体力ゲージについて

#16

投稿記事 by samusu0905 » 10年前

すみません、良く分からないのでプログラムを簡単に書いてもらえませんか?
そうすればできると思います。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 体力ゲージについて

#17

投稿記事 by h2so5 » 10年前

コード:

if (hp >= 500) {
    green_length = hp - 500;
    red_length = 500; 
}
else {
    green_length = 0;
    red_length = hp; 
}

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

Re: 体力ゲージについて

#18

投稿記事 by samusu0905 » 10年前

有難うございます。

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

Re: 体力ゲージについて

#19

投稿記事 by samusu0905 » 10年前

今プログラム書いていて何となくですが、わかってきました。
グラフィック処理で処理を行えばいいわけですね。
回答有難うございました。

閉鎖

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