・HUD(´・ω・`)? 残り体力、シールド、弾薬数、武器選択スロット、「*どくね*」でお馴染み 金魚の糞どものストーキング状況・・・などなど、HL2のゲーム画面には HUDに色んな情報が表示されてます。 これらの表示もVGUIのコントロールクラスをペタペタ貼り付けて実現 しているんですよ。 で、興味を持ったアナタがHUDって何の略かと検索してみたら・・・やたらV6の映画タイトルがヒットします。 |
||
・どこに貼るの? 「VGUIコントロールの新規追加例」では GAME UI DLLパネルを親にFrameクラスを使ってウインドウの表示を行う際、 GAME UI DLLパネルのハンドル(vgui::VPANEL)を取り出して利用しました。 GAME UI DLLパネルも含めた主要パネルのハンドルをゲットする方法を復習すると。 HUDとして使用するパネル(各種VGUIコントロールを配置する親パネル)はCLIENT DLLパネル の子コントロールのビューポートパネルになります。 「じゃあ、そのCLIENT DLLパネルから子コントロールを辿ってビューポートパネルにアクセスすりゃいいの?」 といきたいところですが、出来ません。親から子を辿るにはCLIENT DLLパネルのハンドルではなく、 CLIENT DLLパネルのポインタが必要です。 「そんじゃあCLIENT DLLパネルに子コントロール貼り付けてそのクラスからGetParent()を実行すりゃCLIENT DLLパネルのポインタが取れるんじゃない?」 これもできまへん。 こっちでは子コントロールから親のCLIENT DLLパネルハンドルは取れるようですが、 VPANEL GetVParent() こっちだとNULLが返ってきちゃいます。 Panel *GetVParent() 要するに「主要パネルはお前らの勝手にはさせねえよ」ってことでしょう。 結局ビューポートパネルにはどうアクセスすんだよっていうと g_pClientMode->GetViewport() コレですわ。 |
||
・ペタコンペタコン おっしゃ、好きなコントロールをビューポートパネルにペタコンペタコン 貼ってきゃいいんだな〜、なんて調子に乗って「hajimeteno VGUI」を ビューポートパネルに貼り付けたら。あらやだ、移動したり、撃ったりできないやん。 Uzeeee! というわけでポップアップタイプのコントロールのように、それ自身がフォーカスを取得して マウスやキーボード操作の入力を受付けてしてしまうようなコントロールを貼り付けると非常に 邪魔臭いです。せいぜいチャットメッセージ入力時に使うぐらいですかね。 通常、HUD部品パネルの新規宣言/定義〜実行時作成処理までの流れを大雑把に分けると以下のような形になります。
さらに乱暴に分けると
こんだけなら、オラ、何だか出来そうな気がしてきたぞ。 |