Windows API Code Packによるアプリ開発 番外編2 ~シューティングゲームに何分でタスクバーの機能をつけられるか?~

マイクロソフトの田中達彦です。
単に説明しているだけも何なので、昔作ったアプリケーションにプレグロス バーとアイコン オーバーレイの機能を何分で追加できるかを試してみました。

今回使用するアプリケーションは、僕の最初の著書である「実践プログラミング 入門編」の第9章~第11章で作成するシューティングゲームです。本については、こちらのブログをご覧ください。
シューティングゲーム自体は、こんな感じです。

本が出たのが2006年の2月ですので、このシューティングゲームはVisual Studio 2005で作成されています。
使用しているフレームワークは、.NET Framework 2.0です。
このプロジェクトファイルを持ってきて、Windows 7のタスクバーの機能を追加してしまいます。
はたして何分くらいで実装できるのでしょうか?

[実装するもの]
このシューティングゲームは、飛行機みたいな機体をカーソルキーで操り、スペースキーを押すことによって弾を出し、敵をやっつけていきます。
敵の弾や機体にあたった場合は、ヒットポイントのようなものが減っていきます。
ヒットポイントがゼロ以下になったらゲームオーバーです。

ヒットポイントを表すバーが、画面上部についています。
このヒットポイントを、タスクバーのプログレスバーとして表示させます。
もしヒットポイントが50%以下になれば黄色、20%以下になれば赤で表示させます。

アイコン オーバーレイの部分は、出てくる敵の機体を表示させます。
敵の機体はImageとして登録されているので、それをアイコンに変換してから表示させます。

それでは、実装スタート!!
17時ちょうどにスタートしました。時間を書きながら進めていきます。

[17:00]
Visual Studio 2010を起動し、シューティングゲームのプロジェクトファイルを読み込みます。
もともとVisual Studio 2005で作成していたプロジェクトなので、Visual Studio変換ウィザードが自動的に起動します。
ウィザードに従って、プロジェクトをVisual Studio 2010形式に変換します。

[17:01]
変換後のプロジェクトをビルドし、試しに遊んでみます。
Windows 7上でもちゃんと動きました。

[17:02]
Windows API Code Packのタスクバーを使用するために、メニューの[プロジェクト]-[プロパティ]を選択し、対象のフレームワークを.NET Framework 2.0から.NET Framework 3.5に変更します。

メニューの[プロジェクト]-[参照の追加]では、Microsoft.WindowsAPICodePack.Shell.dllへの参照を追加します。

[17:03]
ソースコードの先頭には、以下のコードを追加します。

using Microsoft.WindowsAPICodePack.Taskbar;

[17:03]
ヒットポイントを表示させているメソッドを見つけ、以下のコードを追加します。
これは、書籍の217ページにあるList 11-7にあるメソッドです。

// API Code Packを使用したプログレスバー
int restLife = MyRestLife * 100 / MyTotalLife;
if (restLife < 20)
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Error);
else if (restLife < 50)
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Paused);
else
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal);

if (restLife < 0)
restLife = 0;
TaskbarManager.Instance.SetProgressValue(restLife, 100);


単に、全体のヒットポイントと残りのヒットポイントから割合を計算し、20%以下ならTaskbarProgressBarState.Errorによって赤で表示させるように指定し、50%以下ならPausedによって黄色で表示させるようにしているだけです。
このプログラムの仕様上、MyRestLifeという残りのヒットポイントがゼロ以下になることもあるため、もし計算結果がゼロ以下になったらゼロを指定します。
その割合を、SetProgressValueを使用して設定しています。

これでプログレスバーの部分の実装は終わりです。

[17:08]
敵を表示させているメソッドを探し出し、以下のコードを追加します。
書籍の192~193ページにある、List 10-11にあるメソッドです。

// API Code Packを使用したアイコン オーバーレイ
Bitmap enemyBmp = new Bitmap(EnemyImage[enemyType].Images[0]);
TaskbarManager.Instance.SetOverlayIcon(Icon.FromHandle(enemyBmp.GetHicon()), "");


敵キャラの画像は、Imageクラスを使用しているので、ImageをいったんBitmapに変換し、そのBitmapをIconに変換しています。

これでアイコン オーバーレイの実装は終わりです。

[17:10]
試しに遊んでみます。

このように、プログレスバーとしてヒットポイントの残りが、アイコン オーバーレイとして出現してくる敵のビットマップが表示されています。

ちょっと見にくいですが、右下にある緑の三角っぽい形をしたものが、出現してきた敵キャラです。

ここまでで実装終了で、所要時間は約10分でした。
原稿を書いている時間のほうがはるかに長かったです。

この実装で、昔作ったシューティングゲームも、Windows 7 アプリ投稿キャンペーンに応募できる条件を持ったことになりました。

マイクロソフト
田中達彦