● マはマスコットのマ(MACLIFE誌2000年1月号掲載)

〜 最終回 マスコットでゲームにチャレンジ!-その4 〜

  ダウンロード→第11回目添付サンプルデータ


● プロローグ

この連載の原稿を書始めたのは、我が家のリビングに初代iMac(ボンダイ君)がやって来たころです。新年のMACWORLD Expo/San Franciscoでは、5色のiMacと色鮮やかなB&W G3が発表されました。2月のMACWORLD Expo/TokyoにはJobsが来日し、日本でもAppler Storeが開始されました。その後QuickTime 4.0が発表され、5月のWWDCではPowerBook G3 '99が登場しました。夏のMACWORLD Expo/NewYorkで待望のiBook、休む間もなく9月にPowerMac G4、10月にNew iMac&iMac DVと怒濤の新製品ラッシュでした。そして大トリは「Mac OS 9」です。みなさんは、すでにMac OS 9を購入されましたか?私もさっそく購入して日々使っております。

いやはやマックユーザにとっては大忙しの1年間でした。しかし、すでに海の向こうからは、新PowerBook G3やマルチCPUのPowerMac G4、そしてお待ちかね「Mac OS X クライアント版」の噂が流れて来ています。西暦2000年も、Appleやマックユーザにとって素晴らしい年になることを期待したいですね。

●操作性を再考する

前回はゲームのシナリオを完成させ、それに必要なキャラクター(マスコット)を作成し、とりあえずオリジナルゲームとして遊べるレベルまで到達しました。今回は操作性やシナリオを再考し、ゲームとしての完成度を高めることにします。

まず操作性の改善から着手してみます。ゲームタイトル画面には「ゲーム開始」と「ゲーム終了」の2つのボタンマスコットがあります。これらはマウスクリックイベントを受け取り、iMacマスコットに「start」か「quit」のコマンドを送信して処理を代行させます。ゲームではマウスを使いたくない人もいます。そこでマウスクリックだけではなく、「return」と「esc」キーでゲームの開始と終了が指示できるようにしてみます。マスコット++では2種類以上のイベントを同時に受信可能です。(図1)設定後にウィンドウ上部の2つのボタンが赤文字になっていることに注目してください。しかし、残念ながら2つのキー入力を同時に受ける仕組みはないため、矢印キーとテンキー両方でグループを操作するような設定はできません。これを実現するためには、まったく同じ挙動のグループを2つ作り、それらに対して別々のキーを割り当てる必要があります。

前回作ったゲームでボンダイ(メインキャラクター)を操縦していると、いくつかの困った現象に遭遇することが分かりました。ボンダイの広域移動には自動スクロールが使われています。つまり、ボンダイがゲーム画面の四隅に来て始めて背景がスクロールするわです。このため移動中のボンダイは必ず画面の隅にいることになり、ある一定方向への視界が極端に悪くなります。(図2)例えば、視界が悪い方向から突然デイメドロン(移動スピードが速い)が現れると、それを避けることができず、すぐに卵を割られてしまいます。それ以上にマズイのは、ストロベリーと偶然衝突してしまう事故が起こる場合です。卵を沢山拾った後なら問題はないのですが、1つも拾っていない状態で衝突すると、得点がゼロのままゲームは終了してしまいます。今回はこうしたトラブルを避けるために、ボンダイの移動方法を2種類のモードから選べるようにしてみます。

まず「モード」変数を登録します。モード変数がゼロの場合には、今までどおり自動スクロールでボンダイを移動させます。モード変数が1の場合にはボンダイ自身は移動させず、プログラム側で背景をスクロールさせます。(図3)この拡張を実現するには、矢印キーを押した時にそれぞれのモードを処理する2つのグループが必要となります。処理の分岐は、実行条件でモード変数をチェックすることで実現しています。(図4)実行条件には「時間変数がゼロでない」という条件もANDされていることに注目してください。これは、制限時間以降はボンダイを操作できなくするための処置です。モード変数の切換は「Z」と「X」キーで行います。(図5)新しい移動モードの追加により、ボンダイをゲーム画面の中心に固定したまま上下左右へ移動させることが可能になりました。

●シナリオを再考する

お気づきになられた方がいらっしゃるかもしれませんが、前回のバージョンでは3匹のチラノザウルスが同時に火を噴くことはありませんでした。これは、エイリアスマスコットを使用した時の弊害です。表示されるマスコットは3体なのですが、実行されているプログラムは本体の1つだけです。よって「火の球」マスコットの表示や消去を行うプログラムが、離れた場所で交互に実行されてしまいます。このままではチラノザウルスの攻撃に迫力が出ません。よって、エイリアスマスコットを使わず「実体」を3体分作ることで、この現象を回避しました。それから、ボンダイに火の玉が当たった時に表示するグループは「移動方向オプション」ダイアログで「途中での割り込みを禁止する」をチェックしておきます。(図6)これは、ボンダイがダメージを受けたことを表現するアニメーションを、最後まで確実に表示するための処置です。

前回の計画では、ボンダイがコリトサウルスと衝突した時に何かボーナスを貰えるようにするはずでした。このボーナスを「制限時間を延ばす」という形で実現してみます。ただし衝突の度に制限時間が延びていてはゲームになりません。そこで「ラッキー」変数を定義して、それに代入されている回数分しかボーナスを貰らえないように制限しています。(図7)加えてコリトサウルスの衝突グループを2つ作り、ボーナスを配給するグループの方のプライオリティー(優先度)を低くします。(図8)これにより、衝突によりボーナスが貰えるかどうかは運次第となります。グループの優先度を低くすればするほど、ボーナスを貰える確率も低くなります。グループを1つにして衝突に反応する「確率」を下げる方法もありますが、上記方法で片方のグループにボンダイを無視するアニメーションを描いておくと、反応がより面白くなります。今回のボーナス配給方法はとても単純ですが、ランダム値をうまく利用すればもっと凝った処理も実現できます。ぜひチャレンジしてみてください。

続いてゲームに第2ステージ(第2面)を追加してみます。卵を所有しているボンダイがストロベリーにタッチすれば、第2ステージへ進めます。もし卵を持たずにストロベリーにタッチしたら、そこでゲームオーバです。また第2ステージへ進めれば、所有している卵の数に20を乗算した秒数だけ制限時間が延びるようにします。こうした処理はすべてストロベリーのプログラムで実現しています。まずは第2ステージ用の背景として新しいパタンを登録してください。(図9)背景を登録したら卵や恐竜を再配置します。この時、マスコットメニューの「情報」(もしくはマスコットのダブルクリック)で「マスコット表示位置」ダイアログの「表示位置は前の背景から継続する」のチェックを外してください。そうしないと、いくら配置場所を変えても第1ステージとまったく同じ場所にキャラクターが現れてしまいます。(図10)本当なら「草原の広さ」「出現する恐竜の種類と攻撃方法」「得点の配布方法」などを第1ステージから変化させると、もっともっと楽しいゲームになると思います。

●キャラクター・プログラム

さて、今度はキャラクターに記述されているプログラムについて詳しく解説してみたいと思います。プログラムを駆使してゲームの進行に貢献しているマスコットは、前回お話した「黒子マスコット」と、今回お話する「ストロベリー」です。

まず、プログラムが実行されるタイミングを知っておくことが重要です。プログラムは、グループの最後のセルが表示(消去でない)された瞬間に実行されます。例えばグループが3回ループしていれば、3回目の最後のセルが表示された瞬間に実行されます。このプログラム実行タイミングは、場合によってはやっかいな問題を引き起こします。例えばセルが1枚だけのグループでプログラムを実行したとします。すると、グループが表示された瞬間にプログラムが実行されますので、プログラムの内容によっては設定したウェイト分だけ表示が継続しません。この現象は、グループのセル数を2枚以上にするか、ある程度ウェイトを入れ2回以上ループさせることで回避できます。ストロベリーの場合には、少々タイミングを遅らせたスピーチの実行も兼ねて、グループのセル数を2枚にして回避しています。

ストロベリーの先頭の「位置決定」グループでは、第1ステージでの自分自身の配置位置をランダム値を使って決めています。同時に「位置初期化」変数をゼロから1に切り換えて、位置決めが何度も繰り返えされないように制限します。「右へ」と「左へ」グループにプログラムはありません。次の「セルステージ2」グループは、卵を所有しているボンダイに第1ステージでタッチされた時の処理です。実行条件は「位置初期化が1」AND「背景がステージ1」AND「卵の数がゼロでない」となります(図11)ここでは、第2ステージでの自分自身の配置場所を決め、卵の数と残り時間を乗算して現在までのスコアとボーナスポイントを計算します。得点やボーナスの計算用として「バッファ」という変数をテンポラリに利用しています。続いて卵の数をゼロにリセットし、消されていた卵マスコットをすべて再表示してから、背景とBGM(バックグラウンドミュージック)を第2ステージ用の物へと切り換えます。(図12)

「卵がゼロ」グループは、卵を持っていないボンダイに第1ステージでタッチされた時の処理です。涙を流して悲しんでいる姿が印象的ですね(笑)先の実行条件のうち「卵の数がゼロでない」が「卵の数がゼロである」に差し替えられています。まずBGMを止めてから「位置初期化」に2を代入してストロベリーの動作も停止させます。続いてスコアにゼロを表示したら黒子マスコットに「finish」コマンドを送り、ゲーム終了のすべての処理を任せます。最後の「ゲームオーバー」グループは、ボンダイに第2ステージでタッチされた時の処理です。こちらは、ボンダイの所有している卵の数によって処理を分岐する必要はありません。実行条件として「背景のステージ2が表示中である」という項目が追加されています。プログラムは、時間と卵の数を乗算し、それを第1ステージでのスコアに加算してトータルスコアとします。そして先ほどと同様に、黒子マスコットにゲーム終了を任せます。(図13)

●最後の仕上げ

ゲーム開発の最後の仕上げは、各キャラクターの動きを細かく調整したり、セル画像に手を加えてより魅力的にすることです。BGMや効果音にも凝りましょう。キャラクターの挙動を少し変更するだけで、ゲームの操作感覚や難易度がガラリと変わります。このさじ加減が、ゲーム開発の難しい所でもあり、面白い所でもあるわけですね。今回は、タイトル画面と両ステージにそれぞれ異なるQuickTime MovieのBGMを付けてみました。BGMについては「MP3ファイルには対応していないのか?」と言うお問い合わせがありましたが、残念ながら現状ではMP3ファイルは登録できません。ただし、QuickTime 4.0ではMP3ファイルをオープンできますので、QuickTime PlayerなどでMovieに変換すれば利用可能となります。また各セルの効果音には「sndリソース」を使うと便利です。Mac OS 9では、いくつかの新しい警告音(システムビープ)が追加されています。「System」フォルダーからサウンドファイルを複製し、それをドラッグ&ドロップで登録してみてくださ。(図14)今回のゲームでも、衝突音や卵を拾った時の音などにMac OS 9の警告音を利用しています。

パタン背景には、アピアランスの「デスクトップパタン」を借用する方法がお勧めです。パタン背景のサイズは64x64ドットですので、大サイズの物は向いていませんが、アピアランスの中には「使える」パタンが沢山あります。(図15)Mac OS 9のデスクトップパタンは、以前とはかなり違う雰囲気になってしまいました。でも心配ご無用!「Mac OS 9の特別付録」の「デスクトップパターン追加分」フォルダに、今まで使われていた物がすべて保存されています。スクラップブックでオープンし、ペイントウィンドウへのドラッグ&ドロップで登録してください。(図16)ゲーム開発の最後の仕上げは、アイコンとアバウトを作ることです。アイコンは、今まで描いてきたセルの中からお気に入りを選び(新規に描いても構わない)プロジェクトメニューの「オプション」の「アイコン..」で設定します。アバウトの方は、編集済みのアバウト画像を背景フォルダに登録したら「オプション」「アバウト...」で設定します。(図17)また、マスコット++には、グループタイトルに「アバウトアニメ」と付けておくと、そのグループをアバウト上で表示してくれる機能が付いています。お試しあれ!(図18)

●懺悔の部屋(笑)

今回の連載中に、キューティマスコット++にいくつかのバグが発見されました。何故そうしたバグが生まれるのか?懺悔を兼ねて連載の最後に解説いたします。まあ、プログラマーの愚痴なんですけどね(笑)我々の日々の苦労を知ってもらうのには良い機会かもしれません...。

まず、ファイルオープン時にメモリ不足でアプリが異常終了する事がありました。アプリ側のメモリ利用サイズを増加すれば、この現象に遭遇することはほとんどありません。現状のMac OSはメモリを動的に確保できませんので、アプリはこうした状況といつも隣り合わせにいます。自己管理している環境内での不足はまだ良いのですが、システム内で起こるとやっかいです。例えば「メモリ不足だよ!」といるエラーをダイアログに表示しようとする「親切な行為」によりアプリが落ちることもあります。こうしたバグは、メモリ不足のチェックに十分な余裕を持たせることで回避します。

次は、Mac OS 8.6で「筆ツール」が使えなくなった件です。もの問題に関しては「8.6のQuickDrawにはバグがあるぞ!」とアップルに報告してしまいました。ところが結果は「8.5のQuickDrawのバグを回避していた処理が仇となり、バグが直った8.6では描画ができなくなっていた」と言う落ちでした(涙)たとえOS側にバグがあっても、やりたい事ができないと困ります。そこで、プログラマーは科学技術の粋を集めて(笑)問題を解決しようと努力し、OSのバージョンアップ時にこうした現象に度々遭遇するわけです。

プログラムや実行条件のいくつかのカラムで、変数名が入力できないバグがありました。例えば、数値入力して欲しいカラムでも、ユーザがどんな文字を入力するかは分かりません。そこで先手を打って入力できる文字種を制限する処理を組み込みます。ところが、それを誤って制限が必要ないカラムにも適用すると、今回のようなバグになります。ちなみに、Finderの「メモリ使用サイズ」のカラムへの文字入力は、半角数値以外は意味がありません。入力が英語モードなら「メモリサイズには数字を入力してください」というエラーメッセージが出ます。(図19)でも日本語入力モードでは全角数値も入力できてしまいます。本当ならインライン入力を禁止した方がよいですね。たったこれだけのことでも、サポート電話へ質問が入ったりします(笑)

そのほか「2倍表示の状態で背景を2枚目へ切りかえると、背景がスクリーンの中心に表示されない」「衝突イベントを受信するマスコットが、2体以上のマスコットと同時に衝突すると動作が停止してしまう」などのバグがありました。これらは完全に私のミスです。ユーザの皆様には大変ご迷惑をおかけ致しました。(陳謝)

●大エピローグ

みなさん、「マはマスコットのマ」も今回で最終回となりました。かぎられた文章と図版のみでマスコットの魅力をお伝えするのは大変難しい作業です。容量の問題がなければ、作品を作る過程をMovieにしてCD-ROMに添付すれば、もっと分かり易い入門になったかもしれません。将来的にはインターネットのリアルタイム映像を使って、こうした入門番組の放送が当たり前になるのかもしれません?「土曜日10時からはMACLIFEサイトでマスコット++ v2.0入門編の放送です」とかね...(笑)

本連載の最初に「最近は実用ばかりのソフトが主役になり、面白いソフトに出会う機会が少ない」「昔気質のユーザにとってはソフトの成熟期と言うより停滞期」といった話をしました。みなさんはこの1年間、何かワクワクするようなソフトに出会いましたか?ソフトの使い手が作り手側とコミュニケーションする機会は、そんなに多くはありません。少数の人が要望するソフトを、その人達とじっくり練り、完成したら食っていけるだけの報酬をもらう。これって「職人」の世界ですよね(笑)今度はインターネットでそんなことを試みてみようかな?と考えている今日この頃です。

さてさて長い間のご愛読、本当にありがとうございました。それでは、また会う日まで!

copyright 2001 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact Us: koike@ottimo.co.jp