« 泰我:小学校卒業 | メイン | ウェブ »

2010年3月27日

ゲーム作成

Misile.jpg

最近、なぜかソフトウェアが作りたくてしょうがない。
思うに、若いころは仕事で毎日ロジカルなアルゴリズムを考えて、それをどうハードウェアとしてインプリするのか毎日頭を唸らせていたのだが、歳を取ってくると、そのような仕事は若い者に任せ、自分はどうでもいい?管理に追われる。
まぁ、プロジェクト管理にも相当ロジカルな思考は必要だが、同じロジカルでもちょっと分野と範囲が違う。

そういうこともあり、何かロジカルな思考をする場はないかと探し、さすがに個人レベルでのハードウェア設計は無理があるので、結局ソフトウェアを作成でそれを実現している気がするのである。

で、冒頭の画像であるが、子供向けに久々にゲームを作ってみた。
昔、大学生時代は、自分でたくさんのゲームを作っては、みんなと遊んでいた。
当時はPC-8801/9801の時代で、グラフィックもしょぼいのだが、アイデア勝負で幾つか面白いものを作った記憶がある。

Managed Direct X

実のところ、最近ごく一般のWindowsアプリばかり作っていたので、最近ゲームではどういった開発環境で行えばよく分からなくなっていた。
また、自分の好みはC++だが、最近、C#を好んで使っている。
簡単に調べた限りでは、C#でManaged DirectXという組み合わせでゲームが作れるらしいことが分かった。

さっそくDirectX SDKを落としてきて環境を揃え、Visual C#でゲーム作成に取り掛かったのだが、その作り、基本アルゴリズムが非常に懐かしかった。
というのも、最近のVisual Basic/C++/C#などの開発環境でのWindowsアプリ開発はオブジェクト指向が徹底しており、全てイベント・ドリブンでプログラミングする。つまり、何かボタンをクリックしたりして、なんらかのイベントが発生して初めてそれに対応する関数が呼び出されて動作する。単にプログラムを起動しただけだと、開発者がプログラムした部分は一切動作しないのである。

これは逆に言えば、ボタンを押されたことを検知したり、それに対応してボタンが凹むように見せたり、マウスがどこでどう動いたかは、全てWindowsプログラムのベースの部分で面倒を見てくれるということだ。通常開発者は、その辺の細かいところは一切関知せず、ボタンが押された後のことだけをプログラムすれば良いようになっている。

しかし、DirectXベースでゲームの開発となるとガラッと様相が変わる。
ウィンドウだけあげるから、あとは全部自分でしてね・・・という感じである。
これは、毎度毎度一定周期(通常1/60秒)ごとに、自分自身でボタンを含めて、ありとあらゆるものを描かなければならないのである。当然マウスがどこでどうなっているのかも自分で調べなければならない。

これが懐かしい。
昔のMS-DOSベースのゲームは全てこうだった。画面全体をポンと渡されて、後はご自由にという世界である。

XNA Framework

ところが、かなり完成に近づいたところで色々と調べているうちに、Manged DirectXはもうなくなり、XNA Frameworkに取って代わると書いてあるではないか!?
しまった、事前の調査が甘かった。

どうも、Microsoftはゲーム開発者向けにXNA FrameworkなるものをVisual C#向けに提供しており、簡単にWindows/X-Boxのゲーム開発ができるようになっているらしい。
今さら古いManaged DirectXなんかやっててもしょうがない。さっそくXNAへ乗り換えだ。

移植が面倒だなと思っていたが、同じVisual C#ベースであり元々DirectX 9cを容易に使えるようにしたものであるので、移植は1時間ほどであっけなく完了。

おぉ!Managed Direct Xの時より動きが滑らかだ!
さすがにゲーム専用の開発環境だ。

Game.jpg Game2.jpg
左:敵のミサイルが当たって負けたところ。右:山が一撃で吹き飛ぶ、超大型ミサイルのアイテムもあるのだ!

ってなわけで完成。
先に書いたとおり、ボタンから始まり何から何まで1/60秒ごとに書き直している。もう面倒なので、ボタンが押されても凹んだりしない。
ちゃんとネットワークで対戦できる(ま、一人で遊んでもよいが・・・)。

プログラム自身はたったの30KB程度しかないのだが、画面の通り、爆発映像にエライ気合を入れており、Particle Illusionで作った凝った爆発アニメセルが120枚分など、グラフィックデータやサウンドが3MB弱もあったりするのが、チトバランスが悪い。それにしても山のグラフィックをもう少し何とかすれば、かなり見てくれは良くなるはずだが・・・面倒。
それと、まだちょっとバグっているようだが、子供たちが遊ぶ分には問題がないので、もう直さない。

それにしても、XNAにもネットワーク機能が用意されているのだが、Windows Liveと密接に結びついてて、普通の人にとっては制限多すぎ。結局.NET Frameworkの普通のネットワーク・クラスを使用した。この辺、もう少し考えてほしいな>Microsoft!

というわけで、気が向いたら遊んでみてください。
ただし、DirectX 9cがインストールされ、グラフィックス・アダプタがPixcel Shader/Virtex Shader共に1.1のサポートが必要(5-6年前のSiS搭載の古いノートPCだと動かないかも)。
なおネットワークはUDPで、ポート60020を使っているので、Firewallソフトが動作している場合は該当ポートを除外してください。

DirectX ダウンロード (既にDirectXがインストールされている場合は不要)

XNA3.1 Runtime (必須)

ミサイルゲーム本体 (zip:2.8MB)

既知問題:ネットワークはUDPを採用しており、パケット・ロストは考慮していないので、なんらかの理由でロストすると、延々と相手のパケットを待つためそこで止まります。Firewallの警告が出たりすると確実にパケットが届いていないので、動かなくなります。その場合はゲームを再起動してください。

投稿者 abeshin : 2010年3月27日 23:13

コメント

コメント投稿




   保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)