質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

2回答

4244閲覧

UIゲージの実装について

yuukuriuttto

総合スコア24

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2016/12/10 05:59

###前提・実現したいこと
こんにちは。私は現在専門学生一回の学生です。
現在チーム制作を行っており、自分が担当しているのはUIのゲージなのですが
ゲージの向きは縦で中身が段々と減るといった処理があるのですがどのような方法で
処理をすればいいか教えていただきたいです。自分が試してみた方法は1枚絵を下の処理で縮ませた方法です。
使用しているツールなどはdirectx9とvisual stdio2013です。
使用言語はC言語です。

###該当のソースコード

for (int a = 0; a < 20; a++) //小さくすることはできたが一気に小さくなる { InsideUi[0].y -= g_Player.UiY - 20.0f; InsideUi[1].y -= g_Player.UiY - 20.0f; } Draw_Obj(g_pTexture[UI_TEX], InsideUi);

###試したこと
for文で回して中身を減らすことはできましたが一気に減ってしまって上手にできませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
C言語 directx9 visual studio2013

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

  • どのようにゲージを描画すべきか
  • ゲージが一気に小さくなるのはどう対処したらいいか

2つの質問が含まれているみたいなので、まず「一気に小さくなる」問題の方について回答します。
※自分はDirectXでゲーム等作ったことがないので上に解答できないというのもありますが…笑

ゲージの中身の描画と、値の変動を別で考えてみましょう。
上のサンプルをそのままで考えるなら、描画関数は以下のようなものになると思います。

C++

1void DrawGauge(int param) 2{ 3 // サンプルからゲージの高さが20段階であると仮定してます 4 int count = 20 - param; 5 InsideUi[0].y = /* 最大の値に戻す */ 6 InsideUi[1].y = /* 最大の値に戻す */ 7 for (int a = 0; a < count; a++) 8 { 9 InsideUi[0].y -= g_Player.UiY - 20.0f; 10 InsideUi[1].y -= g_Player.UiY - 20.0f; 11 } 12 13 Draw_Obj(g_pTexture[UI_TEX], InsideUi); 14}

まず、この書き方で、引数paramを0~20の固定値で変更してみて希望の高さの描画になっているでしょうか?
好きな高さで描画できていなければ関数を見直してください。
好きな高さのゲージが描画できることが最初の目標になります。

これで、ゲージの好きな高さを描画できていれば、次は何にそってゲージが動くのかということを考えます。

何のゲージかはっきりわかっていないので、ゲームである、という想定で説明します。
ゲームなら、ゲージが変動している間にも入力などは受け付けなくてはならないはずです。
例えば、60FPSのゲームで、1秒に1段階ずつ減っていくのであれば、ゲージに対応するparamの値を60FPS毎に1減算する処理をかきます。目的に合わせてどう変動していくのかを考えてみてください。

処理が上手く動くようになってデザインを変えたい時は、改めてDrawGauge関数の中身を編集すれば良いです。
こうやって、描画とゲージの意味を分けてプログラミングしてみてください。

投稿2016/12/14 02:46

編集2016/12/14 02:49
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuukuriuttto

2016/12/15 07:46

ご回答ありがとうございます。好きな高さ 好きな位置には描画できました。これはゲームのゲージです。いまいち60fps毎に1減るという処理が調べても分からなかったのですが、どのようにすればいいのでしょうか?また、参考になるサイトなど教えていただけるとありがたいです。
haru666

2016/12/15 08:39

現在、ゲームの時間的な進行をどのように管理しているでしょうか?好きな高さのゲージを表示できるようになったなら、次にしなくてはならないことは、「どんな時にゲージの値が変動するか」を考えることです。 例えば、毎秒1ずつゲージが減っていくのであれば、1秒ごとに値を減らす処理をどこかに書けばいいことになります。それを、ゲームの進行状態の管理方法と合わせて実装します。   現在、ゲームの進行については制御していないでしょうか?   私が例にあげた60FPSというのは、これもゲームの進行状況を制御するのに昔からよく使われている方法です。1秒間に60回画面更新をするという意味です。60フレーム=1秒であるとすることで、1フレームあたりの変化をどのようにするかでゲームの挙動全体を制御していました。例えばアクションゲームで、ジャンプボタンを押したら次のフレームからジャンプが始まり、72フレームで着地するように弧を描くようにします。こうすると72/60=1秒強で地面に着地することができます。毎フレームの計算内容が決まっているので、ゲームの動作が重たくてもゲームの動作が軽い時と変わらない結果にすることもできました。(例えば72フレームが1秒強で終わっても、2秒弱で終わっても、ゲームの進行状態は72フレーム分しか進まないようにできました。) 例えば20秒で規定のコースを走り抜けるゲームを作っているとします。もしもゲームの動作が遅いとキャラクターが動くのは遅くなるのに、実時間で20秒たったらゲームオーバーになってしまうと困りますよね。もしもゲームが想定の半分のスピードしかでていなかったら、タイマーもゆっくり半分のスピードで40秒かけてカウントしなければいけません。   1秒ごと、というのは、1秒たったと判断した時、という意味ですから、60FPSなら60フレームを1秒と判断する、ということですから、ゲームの進行が60回行われた毎に1カウントを下げれば1秒に1ずつゲージを低くしていくことができます。 FPSの実装については、以下の2つのサイトを見てもらえばいいかなと思います。 https://ledyba.org/2011/09/03205432.php https://ja.wikibooks.org/wiki/ゲームプログラミング#fps.E3.81.AE.E7.AE.A1.E7.90.86 FPSそのものは今回の話とは直接関係がないのでこれぐらいで横に置いておくとして。   どうでしょう、ゲーム内の時間をどこかで管理していますか?今現在まったく管理していないなら、それをどのように管理するかを、チームの皆で一度決めた方が良いと思います。
yuukuriuttto

2016/12/15 09:48

「どんな時にゲージの値が変動するか」は仕様が固まっているので大丈夫です。例として挙げるならゲージの上限は100で「0.5秒間に1減る」「弾を撃つと5減る」のような仕様です。時間の管理ですがよく見るとmain.cppで管理していました。
haru666

2016/12/15 11:33

mainループがありましたかね。弾を撃っても減るし、時間でも減るんですね。   0.5秒に1ずつ減らしていくのは、例えばですが以下のようにします。 1.mainループ1回の時間を調べ、何ループ(=フレーム)を1秒とするかを決める ※これは今後同じような処理を作るために共通化する必要があるのでとても重要 ※メインループを作った人がいるなら、その人の中にもう決まった1秒のフレーム数があるかも 2.ゲージ用のフレーム数のカウンタを付ける。ゲームが進行中の場合に、1フレームごとにカウンタを1増やす。 3.カウンタが0.5秒分(1の半分の数)をカウントするごとにゲージを1減らす   2,3をまとめて関数にでもしておくとよいと思います。 チームで作っているものなので、カウンタを増減させるにふさわしい場所を模索してみてください。例えば、「弾を撃つ処理の前に1減らすのか、玉を撃った後に1減らすのか」は結構重要な決め事ですからね。
guest

0

描写命令をfor文内に入れれば解決するのではないかと思います
現状ですと全部計算してから描写しているのでループ一回ごとに描写しなければいけないはずです
ループの時間はSleepとか使えばいいかと思います
directXは使ったことがないのでうまくいくかは確認できませんが…

投稿2016/12/10 13:01

iwanote

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuukuriuttto

2016/12/15 07:39

回答ありがとうございます!参考にさせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問