ページ 1 / 1
ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 15:32
by samusu0905
ボスの体力ゲージを緑ゲージと赤ゲージの2色で区別する方法についてですが、表示ができてもやはり緑ゲージを減らしてから赤ゲージを減らすという順番で処理を行いたいのですが、それがまだ出来ていません。
C言語でプログラムを詳しくお願いします。これ以上の説明はできないので。
コード:
//炎とボス1の衝突判定-------------------------------------------------------------------------------
void CollisionFireBoss1(int f)
{
//ボス1が存在すれば
if( gBoss1.flg == ON)
{
if( gFire[f].x+FIRE_XSIZE > gBoss1.x && //炎の右>ボス1の左
gFire[f].x < gBoss1.x+BOSS1_XSIZE && //炎の左<ボス1の右
gFire[f].y+FIRE_YSIZE > gBoss1.y && //炎の下>ボス1の上
gFire[f].y < gBoss1.y+BOSS1_YSIZE) //炎の上<ボス1の下
{
gBoss1.timer = 1; //ダメージ中
gFire[f].flg = OFF; //存在しない
gsPlaySound( sBombSE, LOOP_OFF);//ボス1のダメージ
//ボス1が存在しなかったら
if( gBoss1.HP <= 0)
{
gBoss1.flg = OFF;
if( gBoss1.flg == OFF)
{
gScore += 200; //ボーナス点加算
}
}
}
}
}
衝突判定処理のところで書いた方がいいかと思っています。
プログラムを書いていただければあり難いです。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 16:35
by h2so5
申し訳ありませんがこれでは丸投げしているのと同じですので、回答しようがありません。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 16:42
by usao
あまりにも唐突すぎて話の意味がわかりません.
で,本題に関してですが,
>衝突判定処理のところで書いた方がいいかと思っています。
というのは,何のことですか?(「何を」衝突判定処理のところに書くという意味ですか?)
↑にリンクを示したトピックでは
>今プログラム書いていて何となくですが、わかってきました。
>グラフィック処理で処理を行えばいいわけですね。
という話になっているようですが…?
あと,続き物の話なのであれば,
せっかく前回コードで例示してもらっているのですから,まずはそれを組み込んでみてはいかがでしょう?
そのような検討を既にされているということであればその状態のコード
(前回のトピックで得られた回答内容をヒントにして書いてみたコード)
を提示されると良いのではないでしょうか.
[追記]
今回の提示コードはそういった箇所を抜粋したものにはなっていないように見受けますので.
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 17:00
by usao
>ボスの体力ゲージを緑ゲージと赤ゲージの2色で区別する
これって,↓のようなことがやりたいということですよね?
HPが減っていくにしたがって,
[hr]
HPが100%のときはゲージは緑一色:
緑緑緑緑緑緑緑緑緑緑
↓
HPがちょっと減ると減った分が赤で表示される:
緑緑緑緑緑緑緑赤赤赤
↓
例えばHPが50%まで減った段階でゲージは赤一色になる
赤赤赤赤赤赤赤赤赤赤
↓
さらに減った場合はゲージ自体が短くなる:
赤赤赤赤赤
↓
瀕死:
赤
[hr]
みたいな.
で,ゲージの描画方法としては
赤の長方形を最初に描画して,その上に緑の長方形を重ねる形で描画する という方法を採られている,と.
故に,↑に書いたような表示を実現するためには
赤と緑のゲージ(長方形)それぞれの描画すべきサイズを現在のHP残量から算出できればよく,
その方法に関しては前回コード例付きで示されています.
↓
…では,今回の問題点は何になるのでしょう?
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 17:09
by Tatu
これ以上の説明ができない理由は何でしょうか。
saumsu0905さんがやりたいことに似ている演出を
しているゲームを例に挙げることもできませんか?
自分で説明できないような処理を実装するのは難しいです。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 17:10
by h2so5
usaoさんの補足
前回のトピックで僕が回答したゲージのロジックの動作は以下のようなものです。
■■■■■■■■■■■■■■■■■■■■■■■
↓
■■■■■■■■■■■■■■■■■■■■■■■
↓
■■■■■■■■■■■■■■■■■■■■■■■
↓
■■■■■■■■■■■■■■■■■■■■■■■
↓
■■■■■■■■■■■■■■■■
↓
■■■■■■■■■■
↓
■
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 17:12
by samusu0905
色々とご迷惑をお掛けしました・・。
これが前回のコードです
コード:
//グラフを表示-----------------------------------------------------
void GraphicsDrawBox( int x, int y, int size1, int size2)
{
//赤色で下地を描く
if( size2 > 0)
{
gsDraw2DEx( sRed, x ,y ,16, size2, 0x80ffffff );
}
//緑で上に描く
if( size2 > 0)
{
gsDraw2DEx( sGreen, x, y, 16, size1, 0x80ffffff);
}
}
コード:
//表示---------------------------------------------------------------------------------------------
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/4, 1000/2); //ボスHP
}
「分かってきた」ってのは本当です。
ですが、ボスの体力ゲージを緑と赤の2色に区別するのが出来なくて困っています。
ボスとプレイヤーの弾が衝突して体力ゲージを減らす処理です。
グラフィック処理に書けば大丈夫かなとは思ったんですが、やってもできませんでした。
そこで衝突判定の処理で、ボスとプレイヤーの弾の衝突判定のところにプログラムを書けばうまく動作するかと思いました。
ですが、衝突処理でどんなC言語をかけばいいのかよくわからなかったんです。
自分もてっきり解決でいいかなと軽い気持ちで投稿してしまいました。
これからはわかったからと言って直ぐに解決するのを注意します。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 17:25
by samusu0905
皆さんの言う通りです。
自分はNo.4とNo.6のような処理がしたいのです
usaoさん>>確かに前回h2so5さんが書いた通りにやりましたが、動作してくれませんでした。
他に分かりやすいプログラムはないですか?
Tatuさん>>似たようなゲームですか?そうですね、例えるとロックマンの横スクロールゲームでボスの体力ゲージの減り方に似ていますね。ゲームの例えも出せずに本当に申し訳ございません。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 17:52
by softya(ソフト屋)
前に言った言葉をあえて再び言うならば、「上手くいかない」や「動作しない」は何ら必要な情報を含んでいません。
「あれがあれでした」と言うぐらい曖昧な情報です。
うまく組み込んだのに動かない → 主観的な感想に過ぎません。ちゃんと組み込んでいれば動くはずです。客観的に分かる情報を提供してください。
他に分かりやすいプログラムはないですか? → 何処が分かりづらかったのか説明していません。
掲示板の有効活用をお願いします。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 17:56
by Tatu
usaoさんとh2so5さんの書いている内容で問題ないようですね。
赤ゲージの右に緑ゲージを表示して緑ゲージが無くなったら攻撃方法が変化し、
その後赤ゲージがなくなるという東方妖々夢のような演出をしたいとか
そういうことなのかなと思っていました。
>ロックマンの~
ロックマンのゲージってそんな減り方でしたっけ?
ダメージに応じてゲージが減るだけだったような気がするのですが。
確認のため、動画を探していたら
ダメージを与えたら、体力ゲージがダメージ分だけ赤に変わり、
その後、赤い部分が徐々に減るというのがありました。
同じシリーズの作品でも演出が変わるという事はありえるので
作品名まで書いたほうがより正確になります。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 17:57
by usao
うーん…段階を経て実現していく方が理解しやすいかもしれませんね.
例えばですが,今やろうとしている表示方法ではなくて…
(1)一本の一色のゲージで表示する方式:
HP100%
■■■■■■■■■■
↓
HP60%
■■■■■■
↓
HP10%
■
みたいなのであればご自身で実装可能でしょうか?
(この段階ではゲージを一個の矩形で描画します)
これが可能であれば,これを
(2)50%を境に色分けして表示
HP100%
■■■■■■■■■■
↓
HP60%
■■■■■■
↓
HP10%
■
のように変更することはできますか?
(この段階で矩形を2個描画する形になります)
ここまでできるのであれば,
(3)最終状態
あとは(2)での緑側の矩形の描画位置(左端)を
ゲージの一番左端位置にオフセットしてやれば最終的な所望の動作になりますよね.
いきなり最終段階を実現するのが難しい場合,
こんな感じで少しづつ進めてみると良いかと思います.
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 18:25
by samusu0905
softyaさん>>これ以上でこの質問の項目に関係しているプログラムはありませんよ。
どこが分かりずらかったのか>>それはh2so5さんのプログラムです。特に、ボスの体力を引数にして2色のゲージの長さに合わせるというところもそうです。まず体力を引数にしてそれぞれのゲージに合わせるというのは具体的にどうすればいいのかなどです。そして、一番の問題は体力ゲージの方なんですが。まず緑のゲージを1000%に合わせる、そして赤のゲージも1000%に合わせるところです。後、ボスがプレイヤーの弾と衝突したら緑ゲージを減らす、緑が0%(無くなったら)赤ゲージを減らしてゲージを全部完全に消す処理です。usaoさんが書いた通りです。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 18:33
by softya(ソフト屋)
samusu0905 さんが書きました:softyaさん>>これ以上でこの質問の項目に関係しているプログラムはありませんよ。
どこが分かりずらかったのか>>それはh2so5さんのプログラムです。特に、ボスの体力を引数にして2色のゲージの長さに合わせるというところもそうです。まず体力を引数にしてそれぞれのゲージに合わせるというのは具体的にどうすればいいのかなどです。そして、一番の問題は体力ゲージの方なんですが。まず緑のゲージを1000%に合わせる、そして赤のゲージも1000%に合わせるところです。後、ボスがプレイヤーの弾と衝突したら緑ゲージを減らす、緑が0%(無くなったら)赤ゲージを減らしてゲージを全部完全に消す処理です。usaoさんが書いた通りです。
これを質問の最初に書きべき事柄ですね。
必要な情報が出せていないと言うのはこの事です。
あとは、他の皆さんにお任せします。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 18:34
by samusu0905
Tatuさん>>回答有難うございます。
自分はロックマンなどのボスゲージは自分がやろうとしているゲージの処理に似ているのではないかとおもったんですが。
usaoさん>>回答有難うございます。
一本というより、もう緑と赤のゲージを重ねた感じにしています。
後は、ロックマンのボスゲージの減り方に似たようにするだけです。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 18:36
by samusu0905
softyaさん>>すみませんね・・。確かに自分も思いました。分からないことを最初に書くべきだと。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 18:59
by usao
>一本というより、もう緑と赤のゲージを重ねた感じにしています。
えっと,
その重ねた感じで描画するコード が 現状うまく動いていないのであって,
なおかつ その修正方法あるいは何が間違っているのか,といったこと がわからない
から困ってるんですよね?
なので,その重ねた感じで描画する方法について考えるのが難しい のであれば,
とりあえず最初は 実現が簡単な=わかりやすい 方法を実装し,
それを足がかりにして徐々にその最終目標に向かう形に修正していく道筋でやってみたら
(ひとつひとつ問題をクリアしていったら)
わかりやすくて良いのでないですか?
という提案をしているのですよ.
例えば,私の前投稿の(1)の内容が実現できるのであれば,その段階で
・ゲージの描画長さを現HPに基づいて決める(とりあえずの)演算方法
・その演算をどこに書くのか ということ
等がその時点でクリアできるわけですよね.
({ゲージを2つに分ける,それを重ねて書く}といった残された課題とは切り離して
いくつかの問題だけを考えることができるということ.)
もちろん その提案通りに取り組んでみるかどうかはあなたの自由ですので,
解決にむけて他のシナリオで取り組んでも当然構いません.
ただ,私からはどうやってもこれ以上わかりやすい話を提案できそうにありません.
[追記]
ところで,このような形で 取り組む,取り組まない という話とは別に,
「(1)までは余裕です」とか「(2)までは自信を持ってできると言い切れます」とかいう話があれば
他の回答をされる方もやりやすいと思いますので,そこらへんの雰囲気を表明されてみると良いかもしれません.
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 19:31
by samusu0905
usaoさん>>回答有難うございます。
「重ねた感じで描画するコード が 現状うまく動いていない」これは違いますよ。
重ねた感じで描画するのは出来ていますよ。それに、重ねたあとに緑のゲージだけ動いています。
動いていないのは赤のゲージだけです。赤のゲージが動いてくれればいいのですが・・。
先ほど自分が提示したコードだと緑のゲージだけが動いています。
赤のゲージは緑のゲージが無くなった後に動かすようにしたいです。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 19:38
by samusu0905
usaoさんの言う通り、一歩ずつ段階をクリアしていきます。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 19:52
by usao
>「重ねた感じで描画するコード が 現状うまく動いていない」これは違いますよ。
>重ねた感じで描画するのは出来ていますよ。それに、重ねたあとに緑のゲージだけ動いています。
おっと,用いた言葉がうまくなかったのでしょうかね.
私の投稿において 「重ねた感じで描画するコード」 と書いた部分は
「No.4やNo.6のような動作を実現しようとして書いたコード」(あなたがやりたいことを実装したつもりのコード)
と読み替えてください.
それで意味が伝わると思います.
さて,それとは別にあなたのコードについて言えば,
赤い矩形は GraphicsDrawBox() 内で描画されており,その矩形サイズは引数size2で指定されるものと思います.
それに対して,この関数を呼びだす側のコードではこの引数として
1000/2
という定数が指定されていますから,HPに関係なく常に一定のサイズになるのは当たり前かと思います.
(前回のトピックで h2so5さんが回答されたコードでは 赤グラフのサイズも計算されており,定数ではありませんよね?
h2so5さんの回答では,HP最大値を1000とした場合の例 であり,おそらくこの点があなたのプログラムのボスの最大HPとは値が異なっているのでしょうが,
その計算の考え方(内容,意味)を,あなたの場合に当てはめればよいのです.)
あと,多分,緑の側も現状ではHPの現象減少に伴ってサイズが小さくなってはいくだろうけれども,
No4やNo6の意味ではうまくいってないんじゃないかな.
(緑の方はHPが半分になった時点で描画サイズが0にならなければならないハズなのだけど,
HP/4 という引数指定では,描画サイズが0になるのはHPが0になったときでしょうから.)
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 20:08
by samusu0905
usaoさん>>回答有難うございます。そうですね。h2so5さんの回答はあくまで例えですね。内容と処理を自分に合わせればいいわけですね。もう一度やり直してみます。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 21:18
by samusu0905
あの、出来ればh2so5さんのプログラムを参考に、usaoさんが僕のコードを使ってプログラムを書いてみてくれませんか?
もう一度コード載せますね。今度はh2so5さんのプログラムも含めて書き加えました。
コード:
//表示---------------------------------------------------------------------------------------------
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); //ボス文字
if( gBoss1.HP >= 2000)
{
size2 = gBoss1.HP - 30;
size2 = 1000;
}
else
{
size2 = 0;
size2 = gBoss1.HP;
}
GraphicsDrawBox( 1020, 80, gBoss1.HP/4, 2000/2); //ボスHP
}
コード:
//グラフを表示-----------------------------------------------------
void GraphicsDrawBox( int x, int y, int size1, int size2)
{
//赤色で下地を描く
if( size2 > 0)
{
gsDraw2DEx( sRed, x ,y ,16, size1, 0x80ffffff );
}
//緑で上に描く
if( size2 > 0)
{
gsDraw2DEx( sGreen, x, y, 16, size1, 0x80ffffff);
}
}
ボスの処理は書き加えましたが、グラフィック処理は書き加えていませんので。
これだと答えをそのまま教えてくださいって言ってるように感じるかもしれませんが、そうしていただくと有り難いです。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 21:55
by samusu0905
因みに緑と赤のゲージの長さは同じで、size1(X座標のサイズ)、size2(Y座標のサイズ)も同じです。
自分もh2so5さんの書いてあったプログラムを確認する限り、緑ゲージの長さも赤ゲージの長さもsize1,2(X,Y座標のサイズ)も同じなので、どうプログラムで表せばいいのか分かりません。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月16日(水) 23:50
by milfeulle
みなさんがプログラムを書きたがらないのは、samusu0905さんにロジックを考えてもらいたいからですよ! ロジックがわからないのか、文法がわからないのか話を切り分けたいですしね。だから簡単に「プログラムを書いてください」といわないでください・・・。samusu0905さんに考えていただきたいというのがこの掲示板のいいところですからね!
まず、色々な考えがあると思いますが、void GraphicsDrawBox( int x, int y, int size1, int size2)を使ったとして話を進めていきましょう。この関数は、位置x, yを起点として赤size1, 緑size2の長さの矩形を描画します。このような処理をGraphicsDrawBoxに書いてください。
オフトピック
他にも、体力の割合を関数に渡して、それを元にゲージを描画するという方法もあります。私ならこの方法を用いますが、今回の問題とは別ですね。〔追記〕また、本来はこの関数は赤と緑でそれぞれ長さを指定して描画することが目的なので、引数の名前としてsize1, size2とするのは好ましくありません。例えばize_red, size_greenのように使うときにわかりやすいように識別すると後でバグに遭遇しにくくなりますよ!
この関数を用いれば、例えば緑60%, 赤100%のような状態をGraphicsDrawBox(1020, 80, 500, 300)のように呼び出して描画できます。
続いて問題の緑・赤の描画について考えてみましょう。これは体力に割合について、2つの場合に分かれています。
(i) 50%以上の場合
赤100%固定で、緑については、HPが50%時0%、HPが100%の時100%となるように描画
(ii) 50%未満の場合
赤について、HPが50%の時100%、HPが0%の時0%となるように描画、緑は0%固定
これは別に実際に画面に描画しなくても、以下の問題と同じロジックとなります。以下の空欄(条件A, 式A, B, C, D)に適切な式がかければ、それと同等の考えでGraphicsDrawBox関数の第3, 4引数に値を渡せることと思います。これはC言語の問題では無いはずです。
問 : 入力xがあって、xは0以上100以下の整数である。この入力に対し、2つの整数r, gを返す。x >= 50のときはr = 100, gはx = 50のとき0, x = 100のとき100となるように比例する。x < 50のときはg = 0, rはx = 50のとき100, x = 0のとき0となるように比例する。このようなプログラムを作成しなさい。
解答フォーマット :
コード:
#include <stdio.h>
int main() {
int x;
int r, g;
int ret = scanf_s("%d", &x);
// 本来は入力のエラー処理がここに来ます
if(条件A) {
r = 式A;
g = 式B;
}
else {
r = 式C;
g = 式D;
}
printf("r = %d, g = %d", r, g);
return 0;
}
出力例 : x = 60のときr = 100, g = 20
どうでしょうか? 頑張って埋めてみてください!
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月17日(木) 09:28
by usao
>usaoさんが僕のコードを使ってプログラムを書いてみてくれませんか?
私は今回「あなた自身が試行錯誤と理解の結果,答えにたどり着くこと」を目的として回答しています.
なので,これはできかねます.そういうスタンスです.申し訳ないですが.
(常に一定のスタンスを取れているというわけではないですが…今回はそういう姿勢で回答している感じ)
オフトピック
ダイレクトにコードを書くタイプの方も結構おられるようですので
そいう方向を期待したいならばそういう回答を待つ手もあるとは思います.
ただ,こう言っては何ですが,今回のお話はかなり簡単なものです(四則演算ですし)ので,ご自身で片づけてしまった方が早いかと思います.
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月17日(木) 13:05
by samusu0905
milfeulleさん>>回答有難うございます。
自分も考えているプログラム書いているつもりなのですが。どのようなプログラムを書けば良いのかが本当に分からなかったんです。プログラムの例を有難うございます。さっそく埋めてみますね。
usaoさん>>回答有難うございます。
無理やりコードを要求してすみませんでした。この「C言語なんでも質問~掲示板」は確かに、その人が自分で考えてできなくなった所を教える為の掲示板でしたね。 でも、自分は皆さんに色々とC言語プログラミングを教わっているので、とても良い勉強になっています。
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月18日(金) 01:09
by samusu0905
あれから色々と試しました。その結果、ゲージを緑から順番に削る処理はやめにしました。
その代わり、ボスの体力ゲージの色を区別することにしました。
最初のゲージ
↓
「 薄い緑を描画 」
↓
ゲージが半分になったら
↓
「 濃い緑に色を変える 」
↓
ゲージが半分よりさらに減ったら
↓
「 赤色に変える 」
↓
ゲージが無くなったらボスは存在しない
という処理に変えました。
色々と自分も悩みましたが、最終的にはこのような処理結果となりました。
一応これで、自分の作っているゲームではステージ1を作り終えたところです・・。
この後はステージ2,3と連続で作っていく予定です。
もし作りながらまた困った事があればトピックに載せますのでよろしくお願いします!!
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月18日(金) 08:49
by softya(ソフト屋)
milfeulleさんに対して大変失礼だと思いますので、すくなくとも回答をお願いします。
処理を変えたのは出来なかったからでしょうか?
Re: ボスの体力ゲージを色で区別する方法について
Posted: 2014年4月28日(月) 17:31
by samusu0905
いえ、milfeulleさんの処理方法だと自分のプログラムに合わなかったからです。
だから処理を変えたんです。