40pixのHPバーを最大HP、食らったダメージがいくつでも40pixを基準にして何pix減らすか求めたい

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

40pixのHPバーを最大HP、食らったダメージがいくつでも40pixを基準にして何pix減らすか求めたい

#1

投稿記事 by chalaza » 14年前

タイトルじゃ分かりにくいと思いますが、
黒い棒のマスクを作ってそこにしか描けないように緑色の棒を重ねて、体力が減るたびに緑の棒を左に動かして
HPバーをつくるときの計算のことで質問です。

まず、HPバーは横40pixで、その40pixを100パーセントとした場合、ダメージを受けて減った体力の量が何%になるか…という事なんですけど、
まず、MAXHPから現在のHPを引くことで減った量を計算して、それを『MAXHPを40で割った数』で割る…ということをしてみたのですが、
これでは例えばMAXHPが100で一回で10ダメージを食らうとしたときに、8回目でHPバーが0に到達してしまいます。

他にもいろいろ試したのですが、どれもうまくいきませんでした。よければ計算方法をお願いします。

コード:

void DrawStates(){

	//ステータス背景
	DrawGraph(16,288,StatesBar,TRUE);
	DrawGraph(128,288,StatesBar,TRUE);
	DrawGraph(240,288,StatesBar,TRUE);
	DrawGraph(352,288,StatesBar,TRUE);

	//キャラ顔1
	DrawGraph(128,288,HukeiFace,TRUE);

	//キャラ1
	DrawGraph(80,304,HPBack,TRUE);	//HPの文字と枠
	DrawGraph(80,320,MPBack,TRUE);	//MPの文字と枠
	DrawGraph(80,336,CPBack,TRUE);	//CPの文字と枠
	//ステータスマスク
	CreateMaskScreen();     // マスクここから
	DrawMask( 16, 288, StatesMask, DX_MASKTRANS_BLACK ); // マスク範囲のみを描画領域に
	//	初期座標84
	DrawGraph(84-((Player.HPMAX-Player.HP)/(Player.HPMAX/40)),314,HPBar,TRUE);	//HPバー(HPが減ると左にずれていく)
	DrawGraph(84,330,MPBar,TRUE);	//MPバー
	DrawGraph(84,346,CPBar,TRUE);	//CPバー

	DeleteMaskScreen(); // マスクここまで

	//キャラ2
	DrawGraph(80+112,304,HPBack,TRUE);
	DrawGraph(80+112,320,MPBack,TRUE);
	DrawGraph(80+112,336,CPBack,TRUE);
	//ステータスマスク
	CreateMaskScreen();     // マスクここから
	DrawMask( 128, 288, StatesMask, DX_MASKTRANS_BLACK ); // マスク範囲のみを描画領域に
	
	DrawGraph(84+112,314,HPBar,TRUE);
	DrawGraph(84+112,330,MPBar,TRUE);
	DrawGraph(84+112,346,CPBar,TRUE);

	DeleteMaskScreen(); // マスクここまで



}

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

Re: 40pixのHPバーを最大HP、食らったダメージがいくつでも40pixを基準にして何pix減らすか求めたい

#2

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

試してはいませんが、整数に丸める関係で誤差が出ている可能性があります。

コード:

84-((Player.HPMAX-Player.HP)/(Player.HPMAX/40))
これを

コード:

84-((Player.HPMAX-Player.HP)*40/Player.HPMAX)
このようにしてみたらどうですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: 40pixのHPバーを最大HP、食らったダメージがいくつでも40pixを基準にして何pix減らすか求めたい

#3

投稿記事 by YuO » 14年前

chalaza さんが書きました:

コード:

	DrawGraph(84-((Player.HPMAX-Player.HP)/(Player.HPMAX/40)),314,HPBar,TRUE);	//HPバー(HPが減ると左にずれていく)
恐らく,Player.HPMAXやPlayer.HPは整数型だと思いますが……。

その前提で,Player.HPMAXが100, Player.HPが90の時,
(100 - 90) / (100 / 40) = 10 / 2 = 5
となります。これは,整数で全てを計算しているために小数部が切り捨てられるためです。
40 * 2 = 80なので,100 - Player.HPが80になると,40px分HPバーがずれます。
このため,10のダメージを8回でHPバーが0に到達したのでしょう。

40 * (100 - 90) / 100
のように順序を変えると,
40 * 10 / 100 = 400 / 100 = 4
となり,正しく計算されます。
割り算には切り捨て操作が入るので,整数だけで計算する場合は桁あふれが起きない範囲ではかけ算優先で処理しないと,おかしなことが起きやすくなります。

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: 40pixのHPバーを最大HP、食らったダメージがいくつでも40pixを基準にして何pix減らすか求めたい

#4

投稿記事 by Tatu » 14年前

うまくいかない理由はみけCATさんとYuOさんが書いている通りです。

ゲージの表示を
無題.png
無題.png (21.43 KiB) 閲覧数: 2580 回
こんな風にしたいというのならばDrawRectGraphという関数を使ってみてはどうでしょうか。
この関数はグラフィックの指定矩形部分のみを描画する関数です。
使い方はDXライブラリ置き場 リファレンスページ
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
のグラフィックデータ制御関数のDrawRectGraphからご覧ください。

この画像のために作ったプログラムの描画関数は以下の通りです。

コード:

void gauge_graph(){
	//パラメータ表示
	DrawFormatString(0,0,0xffffff,"HP:%d/%d  DAMAGE:%d",hp,hp_max,damage);
	//青い枠表示(半透明にしているが今回は他の部分が黒なのであまり意味がない)
	SetDrawBlendMode(DX_BLENDMODE_ALPHA,100);
	DrawBox(20,20,200,100,0x0000ff,TRUE);
	SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);
	//HPゲージの枠
	DrawBox(59,59,161,81,0xffffff,FALSE);
	//HPゲージ
	DrawRectGraph(60,60,100-100*hp/hp_max,0,100,20,img_hp,FALSE,FALSE);
}

chalaza

Re: 40pixのHPバーを最大HP、食らったダメージがいくつでも40pixを基準にして何pix減らすか求めたい

#5

投稿記事 by chalaza » 14年前

40 * (最大HP - 現在のHP) / 最大HP
の順にしたらその通り綺麗に処理できました
ピクセル単位の計算なので小数が使えないですから式の変更しか方法がなかったですからね…
解決できました。ありがとうございました

閉鎖

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