
S2ファクトリーが日々のウェブサイトや
アプリの制作を通じて、
役に立ちそうな技術情報や趣味の話まで
幅広いテーマで発信しています。

ハーゲンダッツのCMに出たいです。
この記事は、社内イベント「お茶会」での発表内容をもとにまとめたものです。
今回は、弊社の wataru が、DXライブラリを使って作っている落ちものパズルゲームについて発表しました。
普段はバックエンドのシステム開発をしているのですが、最近は息抜きに、普段あまり触れることのない UI やゲームの実装を試しながら、高校時代に作った落ちものパズルゲームを少しずつ作り直しています。
というわけで今回は、現在の実装状況をはじめ、DX ライブラリを使った描画・入力処理や、今後試してみたいことについて紹介したいと思います。
高校生の頃、コンピュータ部の出し物として文化祭に展示しようと、C 言語と DX ライブラリを使って落ちものパズルゲームを作り始めました。
文化祭には間に合わなかったものの、その後も少しずつコードを修正。最終的には、一通り遊べる状態まで完成させました。
その後は長らく触っていませんでしたが、最近、ブロックの形状や回転状態を以前より整理して定義できそうだと思い、久しぶりに作り直してみることにしました。
現在は当時のコードを改修するのではなく、一から書き直しています。
現在は基本的な操作や処理を実装し、ひとまず遊べる状態まで進んでいます。
実装できているのは、主に次の機能です。
まだ作り直し始めたばかりなので、操作中のピースが意図しない形に変わったり、正しく回転しなかったりするバグも残っています。
今は、こうしたバグを直しながら基本動作を整えているところです。
DX ライブラリは、DirectX や Windows に関する複雑な処理を、比較的簡単な関数で扱えるようにした C++ 用のゲームライブラリです。C++ 用ではありますが、C 言語の知識を使って開発できます。
Windows には、画像や 3DCG、音声などを扱うための DirectX という API 群があります。DirectX の開発キットをそのまま使う場合、さまざまな設定や複雑なコードが必要です。DX ライブラリを利用することで、こうした処理を簡略化し、ゲーム本体の実装に集中しやすくなります。
DX ライブラリは 2001 年に公開され、現在も更新が続いています。Windows のほか、Android・iOS 向けのライブラリも配布されており、Nintendo Switch、PlayStation 4、PlayStation Vita にも対応しています。
※ 家庭用ゲーム機向けの利用には、各プラットフォームとの契約や「Play,Doujin!」への参加など所定の手続きが必要です。詳しくは、こちらをご覧ください。
扱える機能も幅広く、主なものだけでも次のような機能があります。
分類 | 主な機能 |
|---|---|
描画 | 線や図形、画像、文字、3D モデルなどの表示 |
画面 | 解像度やウィンドウモード、描画先の設定 |
入力 |
|
音声・動画 | 効果音や BGM、動画の再生 |
公式サイトには、各関数の使い方を確認できる関数リファレンスやサンプルプログラムも用意されています。
DX ライブラリには多くの機能がありますが、今回のゲームで主に使っているのは、画面表示と入力に関する機能です。
主な処理は次のとおり。
SetGraphModeで解像度や色数を指定。あわせて、ウィンドウモードで起動するよう設定LoadDivGraphで1枚の画像を複数に分割して読み込むScreenFlipで表画面に反映ブロックの描画には、LoadDivGraphを使用しています。これは、複数のブロックをまとめた1枚の画像を、指定したサイズと数に分割して読み込むための関数です。
分割した画像は、それぞれグラフィックハンドルと呼ばれる識別子で管理されます。描画時には現在のピースに対応する画像を指定し、形状データに沿って繰り返し表示することで、画面上にピースを描いています。画像を表示する処理は、各クラスから呼び出す構成です。
画面の描画には、ダブルバッファリングという方法を使っています。
まず、SetDrawScreenで描画先を裏画面に設定します。必要な描画が終わったところでScreenFlipを実行し、裏画面の内容を表画面へまとめて反映します。
この方法によって描画途中の状態が表示されることを防ぎ、画面のちらつきを抑えています。
今回は、ピースやフィールドをクラスに分け、データと処理の役割を意識しながらコードを書いています。
移動や回転までは比較的スムーズに進みましたが、落下や固定の処理を加えると、次のような部分が複雑になってきました。
前述のバグも、配列に格納したピースのデータが、どこかで書き換わっていることが原因のようです。
現在はバグの原因を追いながら、クラスの役割やデータの受け渡し方を少しずつ整理しています。今後の機能も追加しやすい形にしていくつもりです。
まずは、消したライン数に応じてレベルが上がり、落下速度も速くなっていく基本モードを完成させる予定です。
SE や BGM も追加したいと考えています。
その後は、遊び方の異なる複数のモードを実装したいと考えています。
いずれはネットワーク対戦にも挑戦してみたいと思っています。リアルタイムで進行するゲームでは通信の遅延が発生するため、それを目立たせない方法も考えてみたいところです。
さらに余裕があれば、ブラウザや Linux でも動かせるようにしてみたいです。別の環境へ展開するには、ゲームの進行を管理するロジックと、画面の描画や入力を処理する部分を分けておかなければなりません。
まずは Windows 版を作りながら、ピースのデータ構造や状態の持たせ方を整理し、ほかの環境にも移しやすい形にしていく予定です。
今回は、空いた時間に少しずつ作っている落ちものパズルゲームの現在の様子を紹介しました。
DX ライブラリを使って、描画や入力、ダブルバッファリングなどを自分で実装していくなかで、ゲームが動くまでの流れもあらためて確認できました。
まだ制作途中ですが、これからも息抜きとして少しずつ手を加え、まずは皆さんに遊んでもらえる状態まで仕上げたいと思っています。このゲームがひと段落したら、次はシューティングゲームにも挑戦してみたいです。
share

様々な分野のスペシャリストが集まり、Webサイトやスマートフォンアプリの企画・設計から制作、システム開発、インフラ構築・運用などの業務を行っているウェブ制作会社です。
案件のご依頼、ご相談、その他ご質問はこちらからお問い合わせください。

様々な分野のスペシャリストが集まり、Webサイトやスマートフォンアプリの企画・設計から制作、システム開発、インフラ構築・運用などの業務を行っているウェブ制作会社です。
案件のご依頼、ご相談、その他ご質問はこちらからお問い合わせください。