自宅で叀兞的なRTSをれロから䜜成するストヌリヌパヌト2「埩掻」続きGUI







箄1幎前、私の蚘事が出おきたした。これはこの蚘事の「 最初の郚分 」ず呌ぶこずができたす。 最初の郚分では、できる限り、熱心な開発者の困難な道を敎理したした。 これらの努力の結果、自宅で゚ンゞン、デザむナヌ、その他の最新の開発ツヌルなしで䜜成されたRTSゞャンル「 Land of Onimode 」のゲヌムができたした。 プロゞェクトでは、 C ++ずAssemblerが䜿甚され、メむンツヌルずしお私自身の頭が䜿甚されたした。



この蚘事では、私がどのように「蘇生者」の圹割を匕き受け、このプロゞェクトを「埩掻させる」こずを決めたかに぀いおお話したす。 独自のゲヌムサヌバヌの䜜成には、倚くの泚意が払われたす。



これは蚘事の続きであり、 ここから始たりたす 。



→ 蚘事の冒頭ゲヌムの埩掻

→ 蚘事の終わりネットワヌク



私のGUIに぀いお少し



GUIでは 、ゲヌムで䜿甚する必芁なすべおのコンポヌネントを䜜成する必芁がありたした。



1 テキストフィヌルド/ GStatic-テキストを衚瀺できたす。 さらに、テキストにはいく぀かのプロパティがありたす-テキストの色ずフォントはどこでも倉曎できたす。 最初は、私はこの機䌚が必芁かどうか確信が持おたせんでしたが、それは有甚以䞊のものであるこずが刀明したした。







2 入力フィヌルド/ GEdit -1行のテキスト゚ディタヌ。 Windowsの同様のコンポヌネントず同様の機胜を実珟しようずしたした。 最終的に、圌はクリップボヌドでの䜜業も远加したした。 ラむセンスキヌを入力するだけで、これを匷制されたした。







3 / GButtonボタンは、マりスのホバリングず抌䞋に応答する通垞のボタンです。







4 グラフィックボタン/ GButtonImage-通垞のボタン。倖芳のみが4぀のグラフィックむメヌゞによっお決たりたす通垞の状態、マりスの䞋、抌されお非アクティブ。







5 フラグフィヌルド/ GCheckBox -YES / NOの原則にチェックマヌクを付けるこずができるフィヌルド。 フィヌルドの右偎に説明がありたす。







6リスト/ GListBoxは単なるテキスト文字列のリストです。 リスト内の任意の行を遞択できたす。







7 ドロップダりンリスト/ GComboBox-コンポヌネントは入力フィヌルドのように芋え、リストを開く远加のボタンがありたす。 線集を無効にするず、ドロップダりンリストを䜿甚しおのみフィヌルド倀を遞択できたす。 䞀般的に、これは、 入力フィヌルド 、 リスト、およびボタンの 3぀のコンポヌネントを䞀床に含むため、実装甚の「ダム」コンポヌネントです。







8 Configurator / GDiscretBox-コンポヌネントは、 音量やマりス速床などのレベルを調敎するために䜿甚されたす。







9 Picture / GPicture-このコンポヌネントを䜿甚するず、同じサむズのグラフィックむメヌゞをいく぀でもダりンロヌドしお、衚瀺甚にそれらを遞択できたす。







10 ツリヌ/ GTree-ノヌドで構成される耇雑なコンポヌネントで、内郚には他のノヌドが存圚する堎合がありたす。 䞀般に、難点は、階局党䜓を䜜成できるこずです。これもグラフィカルに衚瀺する必芁がありたす。 アむコンを䜿甚するこずもできたす。







11 ポップアップメニュヌ/ GMenu-右クリックするず通垞Windowsに衚瀺されるメニュヌの類䌌物。 䞻な難点は、マルチレベルメニュヌを䜜成する胜力にありたす。







12 ダむアログボックス/ GDialog-他のコンポヌネントをその䞭に配眮するためのタむトル付きたたはタむトルなしのりィンドり。



13 Message / GMessageBoxは、タむトル、テキスト、およびOKおよびCancelタむプのボタンの存圚に基づいお自動的に構築されるダむアログボックスの特殊なケヌスです 。







14 Scene / GScene-ダむアログボックスの特殊なケヌスで、通垞はモニタヌの領域党䜓をカバヌしたす。 シヌンの背景画像を蚭定し、他のコンポヌネントを䞊に配眮できたす。 シヌンコンポヌネントは垞に存圚したす。 実際には、メニュヌ画面の倉曎は、さたざたなシヌンの倉曎です。







䞀郚のコンポヌネントには1぀の重芁な機胜がありたす。コンポヌネントりィンドりに収たらない可胜性がある任意の量の情報が含たれおいる堎合がありたす。 これは、 Text Box 、 List 、およびTreeコンポヌネントに適甚されたす。 この堎合、スクロヌルバヌを䜿甚しおコンポヌネントのコンテンツをスクロヌルする必芁がありたす。 耇雑さでは、スクロヌルバヌの実装は通垞、コンポヌネント自䜓の実装の耇雑さを超えおいたす。



GUI実装のいく぀かのより重芁なポむント





ゲヌムメニュヌの再描画に぀いお



メニュヌの背景画像をなじみのないアヌティストからリモヌトで泚文したした。 最初の段階では、圌は私のゲヌムが奜きだったずいう事実だけで団結しおいたしたが、ゆっくりず私たちの関係は非垞に友奜的になりたした。



長い間、メニュヌの背景に䜕を衚瀺するかを決定するこずはできたせんでした。 ゲヌムには2぀のレヌスがあり、1぀は宇宙船で飛行し、2぀目はただ匓から射撃しおいるため、これら2぀の抂念を背景画像で぀なぐ方法は明確ではありたせんでした。 いく぀かの写真が拒吊された埌、「フレスコ画」ずアむデアが議論されたこずを思い出したした。 その結果、「フレスコ画」は「掞窟壁画」に倉わり、比范的簡単に描くこずができたした。 高床な技術から、メニュヌは定期的に「掞窟絵画」をスキャンし、新しいものを発芋するスキャナヌを受け取りたした。 ダむナミクスを远加するために、メニュヌの右偎に3぀の装食的なコンポヌネントを挿入したした。これらのコンポヌネントは、垞にある皮の暎力的な掻動を行いたすが、その意味は私にはあたりわかりたせん。 䞀般的に、宇宙飛行士が宇宙服を通しお寺院の入り口を芋るずいう考え方でしたが、私の意芋では、この芖芚効果は埗られたせんでした。







メニュヌのシヌン間の遷移の瞬間に、「ズヌムむン」の効果をプログラムしようずしたした。 そしお、ここでは、私は望たしい目暙を達成するこずができたようです。少なくずも個人的には、「芳察者」が前進しおおり、実際には寺院の䞭に入っおいるずいう印象を受けたす。



メニュヌの問題が解決した埌、ゲヌムのアップグレヌド甚のアむコンの倖芳に戞惑いたした。 この「ugさ」は非垞に印象的であるため、この圢匏でこれを残しおはならないこずを理解したした。



既存のアむコンの倖芳が私を非垞に憂鬱に振る舞う理由を明確にするために、それらの倖芳を瀺したす。







蚘事の最初の郚分から次のように、アヌティストはプロゞェクトが完成するずっず前にプロゞェクトを去りたしたが、アむコンを実際に扱った人はいたせんでした。



再描画埌、同じアむコンの新しいバヌゞョンは次のようになりたした。







このオプションは、䜿甚に非垞に適しおいるように思えたす。 ずころで、ゲヌムにはそのようなアむコンがたくさんありたす-箄80個です。 幞いなこずに、それらの倚くは倖芳が䌌おいたした。たずえば、 第1レベルの鎧ず第2レベルの鎧は、䞀郚の詳现ず背景色のみが異なりたす。



フォント



Windowsフォントを䜿甚するこずは今では䞍可胜になっおいたす。 それで、あなたは再び䜕かをいじらなければなりたせんでした。 最も明癜なオプションは、画像の圢匏でフォントを事前生成し、この画像の各文字の座暙をテキストファむルに個別に保存するこずです。 次に、これらの座暙がわかれば、キャラクタヌを1぀ず぀描くこずができたす。 幞いなこずに、数幎前、私はそれを行う小さなナヌティリティを䜜成したした。 ナヌティリティはここからダりンロヌドできたす 。





感情うヌん、スクリヌンショットで巊から䞋に気付いたずころです... 2006幎にすでにそれをやったこずがわかりたした。そしお、それほど時間が経っおいないように思えたした。



ナヌティリティの䜿甚方法はほが明確だず思いたす。 フォントずその特性、およびテクスチャの長さを遞択したす。 カヌニングフィヌルドに1を入力するこずをお勧めしたす。そうしないず、キャラクタヌが觊れ始める可胜性があり、これは完党に悪いです。 ナヌティリティはテクスチャをTGAファむルずしお保存し、画像自䜓はアルファチャンネル䞊にあるため、アルファチャンネルを衚瀺しないプログラムでは空癜の癜いシヌトが䜜成されたす。 それでも、画像はアルファチャネルに存圚したす。



結果のテクスチャは、別のりィンドりで確認できたす。 䞀般に、結果が倚少なりずも快適になるたで蚭定を詊し、テクスチャを保存したす。







サヌドパヌティのAPIなしで簡単に保存できるため、 TGA圢匏を䜿甚したした。



蘇生ゲヌム



Windowsスタむルのテヌマを䜿甚したGUIが倚少なりずも「息を吹き始めた」ずき、぀いにWindows 8/10でゲヌムの蘇生を開始する機䌚を埗たした 。 しかし、初期段階では、自分のネットワヌクを持っおいなかったため、ゲヌム自䜓のやり盎しを開始できたせんでした。 そのため、マップ゚ディタヌを䜿甚しお蚈画を実装し始めたした。 圌はネットワヌクやこれたでのGUIを必芁ずしたせんでした。たた、 DirectInputを䜿甚せず、マりスずキヌボヌドから暙準のWindowsメッセヌゞを介しおすべおのデヌタを受け取りたした 。 しかしその埌、圌は積極的にアセンブラを䜿甚しおゲヌムオブゞェクトを描画したした。



そしお、小さなこずから始めるのは論理的でした。なぜなら、もし私がすべおを台無しにし始めたら、そこに「終わりが芋぀からない」ず理解したからです。 䞀般に、プロゞェクトからDirectX h-ファむルを再床削陀したしたが、䜜業の範囲を評䟡するだけでなく、この䜜業も行う必芁がありたした。



たず、 IDirectDrawSurfaceサヌフェス䞊のすべおのポむンタヌをGSurfaceOL自身のサヌフェスぞのポむンタヌに眮き換えたした。 GSurfaceOLクラスで、 DirectDrawサヌフェスの動䜜を゚ミュレヌトするこずになっおいる関数を远加したした。



 long BltFast(unsigned int dwX, unsigned int dwY, GSurfaceOL* lpDDSrcSurface, RECT* lpSrcRect, unsigned int dwFlags);
      
      





このアプロヌチは、コンパむラヌによっお生成される゚ラヌの数をすぐに倧幅に削枛したした。これは、自分のサヌフェスずそれらに察する関数の䞡方が存圚するためです。



次に、残りの゚ラヌ数癟件をすべお調べ、特定の各ケヌスを分析したした。 幞いなこずに、ほずんどの゚ラヌは同じ理由で発生したため、同じ゜リュヌションを泚意深く適甚するだけで枈みたした。



䞀般的には、珟圚のように思えたすが、゚ディタヌからDirectXぞのすべおの参照を削陀するこずができたのは玄1週間前です。 さらに、関数が機胜するのに時間がかかり、最終的に、最初の重芁な結果が埗られたした。



ここで簡単に説明したように、すべおがそれほど単玔ではないこずは明らかであり、倚くの堎合、進行を非垞に遅くするいく぀かの小さな困難に盎面しなければなりたせんでした。 たずえば、これはすでに機胜しおいる゚ディタヌのスクリヌンショットですが、欠陥があり、赀い䞋線で曞き留めおいたす。







アセンブラヌによっお描画されたセグメントで構成される寿呜むンゞケヌタヌは、画像が非垞にがやけおいるこずを瀺しおいたす。 ポむントが最終段階にあるこずに気づくたで、私は長い間愚かでした。最終段階はDirectXによっお制埡されおいたした。



先ほど蚀ったように、RAM内の16ビットの衚面に画像党䜓をペむントしたした。 たた、 DirectXを介しお既にビデオメモリにフルスクリヌンサむズでA1R5G5B5テクスチャを䜜成したした最初はX1R5G5B5圢匏を䜿甚しおいたしたが、幞いなこずに、䞀郚のコンピュヌタヌはこの圢匏を理解しないこずに気付きたした次に、 DirectXテクスチャでLockを実行したす-a、およびmemcpy関数を䜿甚しおRAMからテクスチャをコピヌしたす。 Unlockを介しおDirectXのテクスチャをリリヌスし、実際には、 DirectXの暙準テクスチャでむメヌゞを取埗したす。 そしお今、それは2぀のテクスチャ付き䞉角圢の圢で描くこずができたす。 確かに、このテクスチャのサむズは16ビットで、画面の解像床は24ビットです。 しかし、ここではDirectX9が最䞊䜍にあるこずが刀明したした。問題なく䞉角圢のレンダリングの瞬間に色倉換を実行したす。 最初に、この倉換を自分で行っおRAMからセカンダリビデオバッファヌに盎接デヌタを移動しようずしたこずを認めなければなりたせんが、 DirectXず比范した結果は私を満足させたせんでした。



だから、がやけた画像のためにすべおを説明し始めたした。 だから...最初、私はこのチェヌンの問題を持続的に怜玢したした。 しかし、セカンダリバッファヌからプラむマリぞのむメヌゞの最終転送を実行するDirectX関数Presentが正しく構成されおいないこずが刀明したした。



私にずっお、この関数は次のように芋えたした。



 device_3d->Present(NULL, NULL, NULL, NULL);
      
      





ただし、りィンドりモヌドでは、最初の2぀のパラメヌタヌにNULLを指定できたせん。ここでは、「from」ず「where」の長方圢がコピヌされたす。 急いで、 Present関数をフルスクリヌン゜リュヌションからコピヌしたしたが、NULLを䜿甚するのは非垞に普通でした。



そしお、そのような些现なこずは垞に出くわすので、プログラマの仕事の評䟡は明確な時間枠には向いおいたせん-どんな些现なこずでも開発を無期限に遅らせるこずができたす。 個人的には、「芋かけの甚語に3を掛ける必芁がある」ずいうルヌルを垞に守っおきたした。 開発者の䞻なタスクは、「できるだけ早く゚ラヌを修正する」こずではなく、「1぀の゚ラヌを修正するずきに新しい゚ラヌを䜜成しないこず」です。 箄1幎間ゲヌムを手探りしお、ゲヌム自䜓にはほずんど觊れたせんでしたがネットワヌクむンタラクションずメニュヌを陀く、普遍的な「シェル」を䜜成する間接的なタスクを解決しただけです。



゚ディタヌを起動した埌、私は぀いにゲヌムに移りたした。 しかし、ここでは、あるものを別のものに眮き換えるだけでなく、それをやり盎す必芁がありたした。 総䜜業量ははるかに重芁でした。 メニュヌは、コンポヌネントの配眮が類䌌しおいるにもかかわらず、ほが完党にやり盎されたした。 たくさん改善できたこずを願っおいたす。



しかし...私はすでにGUIに぀いお十分に話し合ったので、今床はこの蚘事をシェルでの䜜業に関するドキュメントに倉えるか、誰かが必芁ずするかもしれないずきにこのトピックを残す必芁がありたす。



しかし、私はネットワヌクにずどたるこずにしたした。 前回の蚘事では、 ネットワヌクに぀いお非垞に簡単に説明し、RTSに関連するネットワヌクゲヌムの機胜に関しおは、ネットワヌクの盞互䜜甚を䜜成するこずにあたり泚意を向けたせんでした。 たた、前回の蚘事の読者の䞭には、この䞻題に関する少量の情報を埌悔しおいる人もいるこずに気付きたした。 したがっお、今回は、むンタヌネットサヌバヌずネットワヌククラむアントの蚘述に䜿甚した原則を説明するこずにしたした。 私の意芋では、この資料は「本質を理解する」こずを決めた人に比べおはるかに「過酷」です。



→ 蚘事の冒頭ゲヌムの埩掻

→ 蚘事の終わりネットワヌク



All Articles