Professional Documents
Culture Documents
Gmaker Japan
Gmaker Japan
Mark Overmars 著
ゲーム・メーカーを使ったゲーム設計
日本語初版:平成 15 年 10 月
桐蔭横浜大学・工学部・電子情報工学科
2
3
目次
Chapter 1 自分のゲームを作りたいの?.................................................................7
Chapter 2 インストール.............................................................................................9
Chapter 3 登録...........................................................................................................11
Chapter 4 グローバル・アイデア(概要)...........................................................13
Chapter 5 一つの例の見てみましょう...................................................................15
Chapter 6 ユーザー・インターフェース...............................................................17
6.1 File メニュー.......................................................................................................17
6.2 Edit メニュー.......................................................................................................18
6.3 Add メニュー.......................................................................................................18
6.4 Window メニュー................................................................................................19
6.5 Help メニュー......................................................................................................19
6.6 リソース・エクスプローラ..............................................................................19
Chapter 7 スプライトの定義...................................................................................21
Chapter 8 サウンドとミュージック.......................................................................23
Chapter 9 バックグランド.......................................................................................25
Chapter 10 オブジェクトの定義...............................................................................27
Chapter 11 イベント...................................................................................................29
Chapter 12 アクション...............................................................................................35
12.1 移動・アクション..............................................................................................35
12.2 main1 のアクション............................................................................................38
12.3 main2 のアクション............................................................................................40
12.4 制御......................................................................................................................41
12.5 描画アクション..................................................................................................44
12.6 スコアー関連のアクション..............................................................................45
12.7 コード関連のアクション..................................................................................47
12.8 式と変数の使用..................................................................................................48
Chapter 13 ルームの作成...........................................................................................51
13.1 インスタンスの追加..........................................................................................52
13.2 ルームの設定......................................................................................................52
13.3 バックグランドの設定......................................................................................53
Chapter 14 ゲーム配布...............................................................................................55
Chapter 15 アドバンス・モード...............................................................................57
15.1 File メニュー.......................................................................................................57
15.2 Edit メニュー.......................................................................................................59
15.3 Add メニュー.......................................................................................................59
Chapter 16 もう少しスプライトについて...............................................................61
16.1 自分のスプライトを作成する..........................................................................61
16.1.1 File メニュー...................................................................................................61
16.1.2 Edit メニュー...................................................................................................62
16.1.3 Transform メニュー.........................................................................................62
16.1.4 Images メニュー..............................................................................................63
16.1.5 Animation メニュー........................................................................................63
16.1.6 ストリップ......................................................................................................64
16.2 個々のサブイメージの編集..............................................................................66
16.3 アドバンスなスプライトの設定......................................................................67
4
Chapter 17 もう少しサウンドとミュージックについて.......................................69
Chapter 18 もう少しバックグランドについて.......................................................71
Chapter 19 もう少しオブジェクトについて...........................................................73
19.1 深さ......................................................................................................................73
19.2 パーシステント・オブジェクト......................................................................73
19.3 親オブジェクト..................................................................................................73
19.4 マスク..................................................................................................................74
19.5 情報......................................................................................................................74
Chapter 20 もう少しルームについて.......................................................................75
20.1 アドバンス・設定..............................................................................................75
20.2 タイレッドなバックグランドの作成..............................................................76
20.3 ビュー..................................................................................................................77
Chapter 21 パス...........................................................................................................79
21.1 パスの定義..........................................................................................................79
21.2 オブジェクトにパスの割り当て方..................................................................80
21.3 パス・イベント..................................................................................................81
Chapter 22 タイム・ラインス............エラー! ブックマークが定義されていません。
Chapter 23 スクリプト...............................................................................................85
Chapter 24 データ・ファイル...................................................................................89
Chapter 25 ゲーム情報...............................................................................................91
Chapter 26 ゲームのオプション...............................................................................93
26.1 グラフィックス・オプション..........................................................................93
26.2 解像度..................................................................................................................94
26.3 キー・オプション..............................................................................................95
26.4 ロード・オプション..........................................................................................95
26.5 エラー・オプション..........................................................................................96
26.6 情報のオプション..............................................................................................96
Chapter 27 速度の考慮...............................................................................................97
Chapter 28 ゲーム・メーカー言語 (GML)..............................................................99
28.1 プログラム..........................................................................................................99
28.2 変数......................................................................................................................99
28.3 代入文................................................................................................................100
28.4 式........................................................................................................................100
28.5 その他の変数....................................................................................................101
28.6 他のインスタンスの変数を参照する............................................................101
28.7 配列....................................................................................................................103
28.8 If 文.....................................................................................................................103
28.9 Repeat 文............................................................................................................103
28.10 While 文..............................................................................................................104
28.11 Do 文...................................................................................................................104
28.12 For 文..................................................................................................................105
28.13 Switch statement.................................................................................................105
28.14 Break 文..............................................................................................................106
28.15 Continue statement.............................................................................................106
28.16 Exit 文.................................................................................................................106
28.17 関数....................................................................................................................106
28.18 スクリプト........................................................................................................107
5
28.19 With 文................................................................................................................107
28.20 コメント............................................................................................................108
28.21 GML の関数と変数...........................................................................................109
Chapter 29 計算.........................................................................................................111
29.1 定数....................................................................................................................111
29.2 実数値の関数....................................................................................................111
29.3 文字列を扱う関数............................................................................................112
Chapter 30 GML: ゲームのプレイ.........................................................................115
30.1 移動....................................................................................................................115
30.2 インスタンス....................................................................................................117
30.3 タイミング........................................................................................................119
30.4 ルームとスコアー............................................................................................120
30.5 イベントの生成................................................................................................121
30.6 その他の変数と関数........................................................................................123
Chapter 31 GML: ユーザーとのやり取り.............................................................125
31.1 ジョイスティックのサポート........................................................................127
Chapter 32 GML: ゲームのグラフィクス.............................................................129
32.1 ウインドウとカーソル....................................................................................129
32.2 スプライトとイメージ....................................................................................130
32.3 バックグランド................................................................................................131
32.4 タイル................................................................................................................132
32.5 描画用の関数....................................................................................................133
32.6 ビュー................................................................................................................137
32.7 遷移効果............................................................................................................138
32.8 スクリーンの再描画........................................................................................138
Chapter 33 GML: サウンドとミュージック.........................................................141
Chapter 34 GML: Splash 画面、score 表、他のポップ・アップ........................145
Chapter 35 GML: リソース.....................................................................................149
35.1 スプライト................................エラー! ブックマークが定義されていません。
35.2 サウンド............................................................................................................151
35.3 バックグランド................................................................................................152
35.4 パス....................................................................................................................153
35.5 スクリプト........................................................................................................154
35.6 データ・ファイル............................................................................................154
35.7 オブジェクト....................................................................................................154
35.8 ルーム................................................................................................................155
Chapter 36 GML: ファイル、登録、プログラムの実行.....................................157
Chapter 37 GML:マルチプレイヤー・ゲーム......................................................161
37.1 接続を設定する................................................................................................161
37.2 セッションの作成、セッションへの参加....................................................162
37.3 プレイヤー........................................................................................................163
37.4 共有データ........................................................................................................163
37.5 メッセージ........................................................................................................164
Chapter 38 GML:DLL の使用...............................................................................167
6
7
Chapter 1 自分のゲームを作りたいの?
コンピュータ・ゲームで遊ぶのはとても楽しいことです。しかし、それ以上楽しいことは、自
分のゲームを設計して人がそれで遊んでもらうことです。残念ながら、コンピュータ・ゲームの
作成は簡単な作業ではありません。現在の市販のコンピュータ・ゲームの開発は2,3年間、
および10人から50人の設計チームを必要し、予算は億単位です。また、設計チームのメンバ
ーはプロ(ソフトウェア、音楽、グラフィックの専門家)のものばかりです。
これは、自分のゲームが作れないことを意味するのでしょうか。幸いに、そうではありません。
もちろん、自分の Quake や Age of Empires のようなゲームを数週間で作成することはできま
せん。そこまで狙わなくても、テトリスやパックマンやスペース・インベーダーのようなシンプル
でとても楽しいゲームは簡単に作成できます。しかし、この場合でも、グラフィックや音声やユ
ーザーとの対話を操るためにプログラミングの技能は欠かせません。しかし、そこでゲーム・
メーカーが登場しました。ゲーム・メーカーはゲーム作りを簡単にするために作成されたもの
です。プログラミング知識は不要です。マウスのドラッグ・アンド・ドロップの使いやすいインタ
ーフェースが自分のゲームの作成を簡単にします。絵や画像やスプライト(動きのある画像)、
サウンドなどを挿入し、使うことができます。ゲームの部品や主人公を定義して、その動作の
指定が容易にできます。動きのあるバックグランドのインパクトのある画面の使用も可能です。
また、フル制御のようなより高度なことを行いたい場合は、ゲーム・メーカーにはシンプルな
プログラミング環境も用意されています。
ゲーム・メーカーのゲームは2次元のものです。だから、Quake のような 3D ゲー
ムの作成はできません。しかし、気を落とさないで、Age of Empires や Command & Conquer
や Diablo 等の有名なゲームは 3D のものに見えますが、2D スプライト技術を使用したもの
です。しかも、2次元のゲーム作りはとても簡単で早いです。
ゲーム・メーカーの最も大きな特徴は、その使用が無料です。また、作成されるゲームには
制限がありません。作者のロゴ表示等もないし、作成したゲームも販売できます。詳細につい
てラインセンスをご参考願います。
この本は、ゲーム・メーカーおよびこれを使用したゲーム作りについて述べています。しか
し、ゲーム・メーカーを使用しても、ゲーム作成は平凡なことではありません。プレイの仕方や
グラフィックスやサウンドやユーザーとのやりとりなどの多数の事柄を考慮に入れなければ
なりません。簡単なゲームの作成からスタートすれば、ゲーム作りはとても楽しいことが分か
るでしょう。次のウエーブ・サイトも見ていただきたい。
http://www.gamemaker.nl/
また、その中のフォーラムには多数のゲームやアイデア、ヘルプ等が公開されています。この
情報をうまく活用することで近い将来にあなたもマスター・ゲームの作者になるでしょう。楽し
もう!
8
Chapter 2 インストール
インストールは既に済んでいると思いますが、そうではない場合は、以下はインストールに
ついて触れます。ただ単に、gmaker.exe を実行して、画面の指示に従ってください。インストー
ル先はどこでもよろしいのですが、デフォルトの場所にした方がよいと思います。インストール
が完了したら、起動メニューの program には、ゲーム・メーカーを起動するものやマニュアル
などアクセス可能にする GameMaker 新項目が追加されます。
ゲーム・メーカーの初起動でシンプルかアドバンスかの選択モードを問いする画面が表示さ
れます。経験の浅いか初心者の場合は、シンプル・モードをお勧めします(No を選択)。この
モードではオプションの一部分が表示されません。アドバンスモードにの切り替えは File メニ
ューでいつでも行えます。
インストール・フォルダー(デフォルト C:/Program Files/Game_Maker5/)には、次のフォルダーが
あります。
・ examples:例題用のゲームを含んでいて、チェックや試作に自由に使用できます。
・ lib:アクション関係のライブラリを格納します。他のアクションライブラリを使用したい
場合はここにおいて下さい。
・ sprites:自分のゲームの作成に使用できる(動きのある)スプライトのコレクションで
す。ゲーム・メーカーのインストールで少数のものしかインストールされませんが、ゲー
ム・メーカーのサイト(http://www.gamemaker.nl/)からその他のリソース・パックをダウ
ンロードができます。
・ backgrounds, sounds:同様なフォルダで、バックグランド(下敷きや壁紙のようなも
の)画像、およびサウンドを含んでいます。
ゲ ー ム ・ メ ー カ ー の 使 用 に は 、 モ ダ ン な Pentium の PC ( パ ソ コ ン ) お よ び Windows
98、NT、2000、Me、XP あるいはこれらの最新の OS が必要です。スクリーンの解像度は最低
800x600 で、カラー階調は 65000(16 ビット)です。DirectX も必要です。ゲームを設計すると
きは少なくとも 32MB が必要です。ゲームの実行に必要なメモリはゲームによって異なりま
す。
9
10
Chapter 3 登録
ゲーム・メーカーの最も大きな特徴は、その使用が無料です。また、作成されるゲームには制
限がありません。作者のロゴ表示等もないし、作成したゲームも販売できます。詳細について
ラインセンスをご参考願います。しかし、登録をお勧め致します。登録すると作成者欄のロゴ
表示が無くなりますし、登録者のためにゲーム・コンペティションも用意していく予定です。
登録費は 15 米国ドールか 15 ユーロです。登録の仕方は幾つかあります。最も簡単なのは、
クレジット・カードを使用した暗号化されたオンライン登録、または PayPal 口座での登録です。
もう一つの方法は、我々の銀行口座への振り込みです。さらに、キャッシュのお送りも可能で
す。その詳細は、
www.gamemaker.nl/registration.html
のサイトでご覧になれます。
登録を行うときは、上記のサイトを使用するか、Help メニューの Registration を使って下さい。
後者の場合は表示されるフォームの下に Registration のボタンがあり、これを押すと、該当の
ウェブ・ページに入りオプションを選択することができます。
登録後、電子メールで登録キーが送られます。上記のように、Help メニューの Registration を
選択して、フォームの Enter Key を押して、送られた情報を該当欄に記入して OK を押してく
ださい。これでプログラム登録が完了です。
11
Chapter 4 グローバル・アイデア(概要)
ゲーム・メーカーの機能などを詳細に触れる前に、その操作の基本的なアイデアを掴むた
めに、まずこのプログラムの使用を体験しましょう。ゲーム・メーカーで作成されたゲームはル
ームといわれる幾つかの画面をもちます(ルームは平らのものですが、疑似 3D のグラフィク
スが使用できます)。ルームにはゲームの主人公などを配置します。これらのものをゲーム・メ
ーカーではオブジェクトといいます。古典的なオブジェクトには、壁、移動するボール、主人公、
モンスターなどがあります。この中では、壁のようなものは静的で特に何もしません。しかし、
その一方、主人公のように移動したり、物事(プレイヤーの操作:マウス、ジョイスティック、キ
ーボード)や他のオブジェクトに反応したりするオブジェクトもあります。たとえば、主人公はモ
ンスターにぶつかると死ぬというようなことが挙げられます。オブジェクトは、ゲーム・メーカー
で作成されるゲームの最も重要なものです。これらについて少し触れておきましょう。
まず、オブジェクトが画面上に写るために外観に当たるイメージを要します。これらのイメー
ジはスプライトという。スプライトは、一つのイメージだけでなく場合によっては、動きを表現す
るために幾つかのイメージで構成されています。こうすることによって、オブジェクトが動いて
いることや、ボールが転がっていることや、スペース船が爆発すること等に見せかけることが
できます。そして、ゲーム中にオブジェクトのスプライトを変えたりすることもできます(移動方
向に合うものにスプライトを変える)。ゲーム・メーカーでは、自分のスプライトを作成すること
ができ、あるいはロードする(読み込む)こともできます(例:アニメイテッド GIF などから)。
オブジェクトに起こることをイベントといいます。イベントの発生に対してオブジェクトがアク
ションすることができ、数多くのイベントに対してオブジェクトに色々なアクションの指定がで
きます。たとえば、オブジェクトが生成されたときクリエション・イベントが発生します(同オブ
ジェクトの重複が可能ですので、その一つの発生のときこのイベントが起こります)。他にも、
ボールの作成のときに、そのイベントに動きを与えると、ボールが出現した後動き出します。
二つのオブジェクトがぶつかるときは、コリーション(衝突)のイベントが発生し、(衝突した)
ボールがストップしたり、方向を変えることにしたりすることができます。また、サウンドを流す
こともできます。このために、ゲーム・メーカーではサウンドの定義ができます。プレイヤーがキ
ーボードのキーを押すと、キーボード・イベントが発生し、オブジェクトは方向の変えるような
アクションをすることができます。これで、基本的なゲーム作りのアイデアを掴んだと思います。
あなたが作成する各オブジェクトにイベント毎にアクションが指定でき、そのオブジェクトの動
作を定義することができます。
オブジェクトの定義後、オブジェクトの活動が行われるルームの定義が来ます。ルームはレ
ベル毎に使ったり、異なる場所の表示には使用します。ルームからルームへの移動に対応す
るアクションがあります。ルームはバックグランド(下敷き用の画像)をもちます。これは、単に
色の指定した枠か画像の一つです。これらのバックグランドはゲーム・メーカーで作成でき、
ファイルからロードすることもできます(バックグランドの役割が多数にわたるのですが、ここ
ではゲームをきれいにするものを考えてください)。そのあと、オブジェクトをルームに配置し
ます。同じオブジェクトを複数使って、異なる場所に配置することができます。このようにすれ
ば、壁オブジェクトを一つ定義して、ルームのあちこちに使用できます。同じモンスター・オブ
ジェクトも多数使用できます。ただし、この場合はその動作が同じでなければなりません。
これで、ゲームを実行するための準備は終わりです。最初のルームが表示され、オブジェク
トが出現し、クリエション・イベントに対応するアクションが行われます。オブジェクトがコリー
ション・イベントによってお互いに反応したり、またはプレイヤーのキーボード・イベントやマウ
ス・イベント等に反応します。
結局、次の事柄(通常リソースという)が重要な役割を果たします。
objects(オブジェクト):ゲームの構成要素
rooms(ルーム):オブジェクトの住み(活用の)場所(レベル)
sprites(スプライト):オブジェクトの外観に当たる(アニメイテッドな)イメージ
sounds(サウンド):ゲームのバックグランド・ミュージックや効果サウンドに使用
backgrounds(バックグランド):ルームのバックグランド・イメージ
実は、パス、スクリプト、データ・ファイル、およびタイム・ラインと呼ばれるリ
ソースもあります。これらは複雑なゲームに必要です。ゲーム・メーカーがアドバ
ンス・モードのときのみ、これらのリソースが表示されます。これらのリソースは
後のアドバンズ章で説明します。
12
13
Chapter 5 一つの例の見てみましょう
ここでまず簡単な例を用いて作成の過程をみて見ましょう。ゲーム・メーカーがシンプル・
モードで起動されたと仮定します。まず第1ステップでは、作りたいゲームを説明します(必ず
これを先にやっておいてください。最終的に時間の省略につながります)。ここで作るゲーム
はとても簡単です。一つのボールは周辺の壁にぶつかりながら移動します。プレイヤーがボ
ールを追ってマウスでその上にクリックすることを目的にします。成功した場合は、1点を収得
します。
この説明で分かるようにボールと壁の二つのオブジェクトが必要です。スプライトもボール
用と壁用の二つ必要です。最後に、ボールをマウスでクリックしたとき、サウンドが聞こえるよ
うにします。また、一つのルームだけ使用します(自分自身でこのゲームを作りたくない場合
は、touchtheball.gmd の名前で Examples フォルダからロードすることができます)。
まずスプライトを作っておきましょう。Add(追加)メニューから Add Sprite を選択しましょう
(ツール・バーの該当ボタンを使用してもよい)。フォーム(小さなウインドウ)が現れ、Name
の欄に wall をタイプイン(記入)します。フォームの Load Sprite ボタンを押して壁に合うイメ
ージを選択します。そうしたら、フォームを閉じてください。同様にして、ball 名のボールのスプ
ライトを作ってください。
次に、サウンドを作りましょう。Add メニューから今度 Add Sound を選択します。前のと異
なるフォームが現れます。サウンドに名を付けて、Load Sound でサウンドを選択して下さい。
選択のとき、プレイ・ボタンでサウンドが再生できますので、気に入ったものを選びましょう。そ
うしたら、フォームを閉じてください。
次のステップは、二つのオブジェクトの作りです。まず、壁のオブジェクトを作
りましょう。再び、Add メニューから Add Object を選択します。ここまで出てきたフォー
ムよりはるかに複雑なフォームが開いてきます。その左側にオブジェクトの一般的な情報が
表示されます。オブジェクトに(wall)の名前を付けて、スプライト欄のドロップ・ダウン・メニュ
ーから壁のスプライトを選んで下さい。壁は固体であるため、Solid のボックスにチェックを入
れます。ここまでと同じようにもう一つのオブジェクトを作成して、ball の名前を与えて、そのス
プライトを指定して下さい。ボールは「固体」にしません。ボールが動くため、その動作を定義
します。真ん中当たり何も入っていないイベント・リストがあります。その下に Add Event ボタ
ンがあります。このボタンを押すと、選択できるイベントのリストが表示されます。その中の
creation(クリエション)イベントを選択します。このイベントがイベント・リストに追加され、こ
れに対応させられるアクションはフォームの一番右の端にグループ毎に出ています。move グ
ループから八つの赤矢印ボタンをその左隣の白枠(アクション・リストという)にドラッグして
下さい。これでボールのオブジェクトは指定された方向に移動できるようになります。アクショ
ンのアイコンをアクション・リストにドラッグすると、詳細設定用のフォームが表示されます。こ
のフォームで移動方向等の設定ができます。周辺の八つの矢印をクリックして選択して下さ
い。こうすることで、オブジェクトはその八つの方向の中から一つをランダムに選んで動きます。
移動速度は8となっていますのでそのままにします。この設定のフォーム(ダイアログという)
を閉じます。この設定でボールが生成された時点から動き出します。次に、ボールが壁にぶ
つかるときの動作を定義します。このため再び Add Event ボタンを押して、コリーション・イベ
ント(ぶつかる矢印のイベント)のドロップ・メニューから壁のオブジェクト(wall)を選択します。
このイベントのために、弾む(bounce:バウンス)のアクションが必要です(アクションの上にマ
ウスを載せると簡単な説明が表示されます)。最後に、ユーザーが左のボタンをボールの上
にクリックしたときの動作を定義しなければなりません。キーのイベント(コリーションのすぐ
下)を選択して、マウスの左ボタンを選択します。このイベントに対しては幾つかのアクション
を指定します。最初のアクションは main1 のグループにあるサウンドをプレイするものです。も
う一つは score グループのスコアー(点数)を更新するものです。また、ヒットの後ボールを他
の場所に移動させるアクションです(このアクションはクリエション・イベントで使用したものと
同じです)。サウンド・アクションに対応するサウンドを選択します。スコアー・アクションの値を
1にして、Relative(相対)ボックスをチェックします。これで現在のスコアーには1が加算されま
す(設定に誤りがあった場合はアクションをダブル・クリックして再設定を行ってください)。
これでオブジェクトの設定が完了します。残りは、ルームの定義です。再び Add メニューで
新しいルームを追加してください。開いてくる画面の右には空のルームが表示されます。その
左にタッブ別でバックグランドの設定、ルームの幅と高さのような広域的な特性の設定、ル
ーム内にインスタンスの配置設定があります。左下にオブジェクト欄があり、ポップアップ・メ
14
ニューでオブジェクトを選択することができます。オブジェクトを選択した状態で、そのオブジ
ェクトを右のルームにマウスの左クリックで配置することができます。また、右クリックでオブジ
ェクトが削除できます。wall オブジェクトを用いてルームの周辺に壁を作ってください。最後
にルームに1個か2個のボールを配置してください。これで準備完了です。
それでは、ゲームをテストしてみましょう。Run のボタンを押して起こることを観察しましょう。
誤りがない場合は、ボールが移動します。ボールの上にクリックしてみて下さい。ゲームをスト
ップするには Esc のキーが使えます。これで更新・改善などが可能です。
おめでとう、君の最初のゲーム作成が終わりです。以下ではゲーム・メーカーについてもう
少し学んで行きます。
15
Chapter 6 ユーザー・インターフェース
ゲーム・メーカーを起動するときは次の画面が現れます。
(実は、この画面はゲーム・メーカーのシンプル・モードの画面ですアドバンス・モードには
その他の項目が表示されます。詳細は第14章でご覧下さい。)画面の左にはゲームのリソー
スが出ています。上から、スプライト、サウンド、バックグランド、オブジェクトおよびルームがあ
り、次いでゲームの情報とゲームのオプションが並んでいます。一番上に、ワープロなどでよく
見かけるメニューとその下にあるツールバーが見られます。この章では、メニューの項目やボ
タンなどを説明します。その他の章ではこれらの幾つかをさらに詳細に説明します。以下の
説明でも分かるのですが、同様な操作がメニュー項目の選択でも、ボタンでも、リソース上の
マウスの右クリックでも可能です。
16
・ Advance Mode:この項目を選択しますと、ゲーム・メーカーはシンプル・モードとアド
バンス・モードとの間の切り替えを行います。アドバンス・モードで他の選択やリソー
スが使用可能になります。
・ Exit:自明でしょう。これを選択しますとゲーム・メーカーが終了します。現
在開かれているゲームが更新されていれば、そのセーブが行うか否かが問わ
れます。
17
・ Forum:ゲーム・メーカーの情報交換のフォーラムに接続します。そこで質
問したり、情報を得たりすることなどができます。
・ About Game Maker:ゲーム・メーカーのバーションについて情報を表示します。
6.6 リソース・エクスプローラ
メイン画面の左にはリソース・エクスプローラが出ています。ツリーのような階層でゲーム
のリソースが見られます。ウインドウのエクスプローラと同様なものです。項目の前の四角に
プラス(+)があるとき、それをクリックすれば項目内のリソースが見られます。マイナス(−)に
変わった四角を再びクリックすれば項目のみ表示されます。項目内のリソースをワン・クリッ
クで選択した後、その名前が変えられます。しかし、項目名が変えられません。リソース上をダ
ブル・クリックすると、そのプロパティを変更することができます。右ボタンのクリックでも Edit
メニューのコマンドが起動できます。ドラッグで項目やグループの位置が変えられます。もち
ろん、妥当なところに移動しないとだめです(駄目な例:サウンドをスプライトに移動する)。
18
Chapter 7 スプライトの定義
スプライトは、ゲームのオブジェクトの外観です。スプライトは、ドロー・ソフトで作成された
一つのイメージか、あるいは動きを表現するイメージの集まりです。たとえば、次のイメージは
右に移動するパックマン用のスプライトです。
ゲームを作るときは、まずゲーム用のスプライトを集めます。ゲーム・メーカーのサイトでは
通常のスプライトとアニメイテッド(動きのある)スプライト両方が提供されています。その他
のスプライトはインターネットで探すことができます。通常アニメイテッド gif のものが多いです。
一番上にスプライトの名前を記入します。スプライト(他のリソースも)すべてが名前をもっ
ています。できるだけスプライトの役割を分かりやすくする名前を与えましょう。また、すべての
リソースには異なる名前をもたせましょう。決まりではないが、英字で始まる英数字、アンダ
ー・バー( _ )からなるもののみをスプライト(他のリソース)の名付けに使いましょう。スペー
ス(空白)を極力に使わないで下さい。これは、特にコードを用いるときは重要となります。
Transparent のチェックボックスは、スプライトのバックグランドが透明に設定するかを表しま
す。ほとんどのスプライトのバックグランドは透明です。このバックグランド色はイメージの一
番左下のピックセルで決まります。このため、その他のピクセルがこの色を持っていないこと
を確認しなければなりません(gif イメージが自分の透明色を定義しますが、これはゲーム・メ
ーカーでは使用しません)。
19
Edit Sprite のボタンでスプライトの編集もでき、新しいスプライトの作成もできます。作成や
編集についての詳細については第14章に述べます。
20
Chapter 8 サウンドとミュージック
ほとんどのゲームはサウンド効果およびバックグランド・ミュージックを使用します。役に立
つ幾つかのサウンドはゲーム・メーカーのサイトにあります。インターネットでその他数多くの
サウンドが手に入れられます。
ミュージック・ファイルをロードすると、その種類と時間の長さが表示されます。プレイ・ボタ
ンでサウンドの再生ができます。Save Sound を使えば、現在のサウンドをファイルに保存する
ことができます。このボタンが重要はないが、損失した元のサウンドのときに必要になります。
21
Chapter 9 バックグランド
三番目の基本的なリソース・タイプはバックグランドです。通常、バックグランドは、ゲーム
のルームの下敷きに使用できる大きなイメージです。ほとんどの場合は、タイルのようにマス
目を埋めるようなものです。この場合は、画面はパターンで埋めることができます。タイルの
幾つかがゲーム・メーカーのサイトにあります。インターネットでその他数多くのものがありま
す。
22
23
Chapter 10 オブジェクトの定義
ここまで、ゲームにはイメージやサウンド等を追加できても、これら自身は何もしません。そ
こで、ここではゲーム・メーカーの最も重要リソースであるオブジェクトについて述べます。オ
ブジェクトは、ゲームの「役」であり、動作するものです。オブジェクトを見えるものにするため
に外観としてスプライトが割り当てられます。オブジェクトはイベントに反応できるために動作
するものになっています。バックグランドを除けばゲーム内に見えるものはすべてオブジェクト
です(明確に言うと、オブジェクトのインスタンス(オブジェクトの一つの出現)です)。キャラク
ターや、モンスターや、ボールや、壁等は皆オブジェクトです。もちろん、ゲームの場面を制御
するような見えないオブジェクトもあります。
スプライトとオブジェクトの違いをよく理解しましょう。スプライトは、動作しない、ただ単に
(アニメイテッド)イメージです。オブジェクトの外観はスプライトですが、オブジェクトが動作可
能なものです。オブジェクト無しでゲームが作れません!
オブジェクトとインスタンスの違いも理解していただきたいです。オブジェクトはモンスター
のようなゲームのエンティティ(主役など)を定義します。ゲームには、このオブジェクトの多数
のインスタンス(出現)があり得ます。インスタンスについて語るときは、オブジェクトの特定の
インスタンスのことを意味します。オブジェクトについて語るときは、すべてのインスタンスのこ
とを意味します。
これは少々複雑です。左にはオブジェクトの一般的な情報があります。真ん中にオブジェクト
に起こり得るイベント・リストがあります。詳細について次の章を見てください。右には、オブジ
ェクトの行えるアクションがあります。これについては第12章に述べます
いつもの通りオブジェクトにも名前を与えてください。名前を与えた後、オブジェクトのスプ
ライトを指定します。このため、スプライトの欄に左クリックするか、その欄の隣にあるメニュ
ー・ボタンを使用します。すると、使用できるスプライトのメニューが現れます。そこからオブジ
ェクトに対応させたいスプライトを選びます。スプライト欄の下に二つのチェックボックスがあ
ります。Solid の名札のものは、壁のような固体を指します。固体であるものとの衝突と、固体
でないものとの衝突とは、その扱いは違います。この詳細について次の章を見てください。
Visible は見えるものを意味します。明らかに、ほとんどのオブジェクトは可視です。しかし、場
24
合によっては透明のものが便利です。たとえば、モンスターの通り道に使用できます。透明の
オブジェクトは他のオブジェクトにぶつかるとき、およびイベントに反応します。
25
Chapter 11 イベント
ゲーム・メーカーはイベント・ドリブンというアプローチを用いています。つまり、いずれの場
合でもオブジェクトのインスタンスはイベント(起こったことを知らせるメッセージのようなも
の)をゲットします。インスタンスはこのメッセージに反応してアクションを行います。オブジェク
ト毎に、どのようなイベントにどのように反応してアクションするのを設定しなければなりませ
ん。複雑に聞こえるが、実は簡単に行えます。まず、ほとんどのイベントに対してはオブジェクト
が何も反応しなくててもよいのケースが多いです。対象になるイベントに対しては、ドラッグ・
アンド・ドロップ操作で該当するアクションを指定することが容易にできます。
オブジェクトのプロパティ・ウインドウ(下図を参照)の真ん中にオブジェクトが反応しなけ
ればならないイベント・リストがあるいます。このリストに Add Event のボタンでイベントを追
加することができます。このボタンを押しますと、選択できるイベントが現れます。項目によって
サブメニューの選択も可能になります。たとえば、キー・ボードのイベントでは対象のキーを選
択しなければなりません。これらは異なるイベントです。この次には、完全なリストと説明を述
べます。図の暗くなっているイベントは現在編集中のものです。対象のイベントを変えたいと
きは、イベントの上に(左)クリックします。その右に小さなアイコンで表示されているのは、こ
のイベントに対応するアクションです。ウインドウの一番右にはこれらのアクションはタッブ付
きページで分類されています。次の章ですべてのアクションについて述べ、これらが何をする
かを説明します。イベントとアクションの間にアクション・リストがあります。このリストには現
在のイベントのとき行うべきのアクションが表示されます。アクションを追加するときは、ウイン
ドウの右からアクションをマウスでドラッグしてこのリストに引っ張ります。リストに簡単な説明
と一緒に並べられます。アクションを追加しますと、その設定が要求されます。これについても
次章で述べます。幾つかのアクションを追加すると、図のような状況になります。
その他のイベントに同様にアクションを追加することができます。イベントを選択するとき、
そのイベントを左クリックで選びます(ボタンが暗くなります)。そして、そのイベントにアクショ
ンを追加します。
リストにあるアクションの位置がドラッグ・アンド・ドロップで変えられます。<Ctrl>キーを押
したままアクションをドラッグすると、そのアクションがコピーされます。オブジェクト同士のア
クション・リスト間のドラッグ・アンド・ドロップも可能です。アクションの上にマウスを右クリック
すると、メニューが現れ、アクションの削除(<Del>キーでも可能)や、コピーやペストなどが施
行できます。マウスをアクションの上に移動して止めると、アクションの説明が表示されます。
アクションの詳細については次の章で述べます。
26
現在のイベントと関連のアクションすべてを削除するには、Delete ボタンを使用します(ア
クションのないイベントは、オブジェクト・プロパティを閉じるときに自動的に削除されます)。
イベントを変えたいときは、Change ボタンを押して、他のイベントを選択します(ただし、既に
定義されているイベントを再び選択することができません)。
ここから、追加したいイベントを選びます。イベントによっては、更にサーブ・メ
ニューを表示するものがあります。以下ではこれらのイベントを説明します(通常、
この中から少数しか使わないことを覚えましょう)。
Create イベント
このイベントはオブジェクトが生成されるときに発生します。通常、オブジェクトに動かさせ
るためかそのインスタンスの変数を設定するために用います。
Destroy イベント
オブジェクトが破壊されるとき、このイベントが発生します。厳密にいうと、インスタンスが破
壊される寸前にこのイベントが発生します。つまり、このイベントが発生するときは、まだ対象
のインスタンスが存在しています。このイベントがそんなに使われないが、他のオブジェクトの
生成やスコアーの変更に使用されます。
Alarm イベント
各インスタンスは8つのアラーム・クロックが使えます。これらのアラームは幾つかのアクシ
ョンでスタートさせることができます(次章を参照)。スタートされるとアラームのクロックは 0
までステップのカウント・ダウンを始めます。0 になると、アラーム・イベントが発生します。アラ
ーム・クロックのアクションを設定するために、まずアラーム・クロックをメニューで選択します。
アラーム・クロックはとても便利です。色々な物事が発生するように設定できます。たとえば、
モンスターに 20 ステップ毎に方向をアラーム・クロックで変えさせます(このとき、イベントの
何れかのアクションが再びアラーム・クロックを設定しなければなりません)。
Step イベント
ステップ・イベントはゲームのステップ毎に発生します。このイベントに常に行われるアクシ
ョンが設定できます。たとえば、一つのオブジェクトがもう一つに付いていくことのために、後
者の方向を前者に追跡するように設定できます。しかし、これを使うには気を付けましょう。数
多くのインスタンスをもつオブジェクトのステップ・イベントに複雑なアクションをおくと、ゲー
ムが遅くなるおそれがあります。厳密に言うと、三つのステップ・イベントがあります。通常、デ
フォルトのステップしか使いませんが、メニューを用いれば開始ステップのイベント、および終
了ステップ・イベントも選択できます。開始ステップのイベントは、各ステップの開始時に実行
され、他のイベントの前に実行されます。通常のデフォルトのステップ・イベントは、インスタン
スが新位置に配置される前に実行されます。終了ステップのイベントでは、ステップの終わり、
つまり画像の再描きの前に実行されます。このイベントは、オブジェクトの方向にあわせてそ
のスプライトの変更に使います。
Collision イベント
27
二つのインスタンスが衝突する(そのスプライトが重なる)と、コリーション・イベントが発生
します。厳密に言うと、各インスタンスに一つの衝突、つまり二つのコリーション・イベントが生
じます。インスタンスはこのイベントに反応できます。このために、イベントのメニューからコリ
ーションに反応するオブジェクトを選択して、リストにそのアクションをおきます。
インスタンスが固体のものに、およびそうでないものにぶつかるときに起こることは異なり
ます。まず、コリーション・イベントにアクションがないと何も起こりません。インスタンスは、ぶ
つかったものは固体であっても移動を続きます。コリーション・イベントにアクションがあると、
次のことが起こります。
他方のオブジェクトは固体であれば、インスタンスが衝突前の位置に戻ります。そして、イ
ベントが実行されます。最後にインスタンスは新しい位置に移動されます。つまり、イベントで
方向が変えられることであれば、インスタンスが壁にぶつかると、壁にはねて方向を変えます。
方向を変えてもぶつかるものがいれば、事実上インスタンスが現在の位置に止まります。
他方のオブジェクトは固体でないときは、インスタンスは衝突前の位置に後退しません。現
在の位置でイベントは実行されます。また、コリーションの最チェックもありません。よく考える
と、これは当然のことです。他方のオブジェクトは固体ではないためその上に通ります。イベン
トはこれが行われていることを知らせます。
コリーション・イベントの使用は多数です。たとえば、インスタンスは壁にはねたり、
ものを弾丸で壊したりすることなどができます。
Keyboard イベント
プレイヤーがキーを押すと、該当オブジェクトのすべてのインスタンスにキーボードイベント
が起こります。キー毎にイベントがあります。キー・イベントのメニューでキーを選んで、リスト
にそのキーに割り当てたいアクションをドラッグします。もちろん、通常少数のオブジェクトに
少数のキー・イベントを割り当てます。キーが押されている限りステップ毎に一つのキー・イベ
ントが生じます。特別なキー・イベントが二つあります。一つは<No key>です。これはステップ
毎にいずれのキーが押されていなければ生じます。もう一つは、<Any key> といい、いずれの
キーが押されたときに発生します。ところで、プレイヤーが多数のキーを同時に押すと、各々の
キーに対応するイベントが発生します。なお、テンキーのキーに対応するイベントは、
<NumLock>が押されているときだけ有効です。
Mouse イベント
インスタンスのマウス・イベントは、マウスのカーソルがインスタンスのスプライトの上にあ
るときに発生します。押されるボタンによって、右、左、真ん中のボタン、あるいはボタン無しの
イベントがあります。これらのイベントはマウスがインスタンスの上にある限り各ステップに生
じます。マウスのボタンを押すとき、またそのときにのみ該当のイベントが生じます。同様に、マ
ウスのボタンを解放するときにのみ該当イベントが生じます。プレイヤーがインスタンスのな
いところにマウスを押してもイベントは起こりません。それでも、時々いずれのマウス・クリック
に反応しなくてはならないことがあります。このとき、広域的な(グロバール)プレス(押す)と
リリース(解放する)イベントを用います。二つの特別なマウス・イベントがあります。インスタ
ンスに入る(スパライトの上に入る)ときに生じるマウス・エンター・イベントはその一つです。
もう一つは、インスタンスから出る(そのスプライトから離れる)ときに生じるマウス・リブ・イベ
ントです。これらのイベントは、通常イメージを交換するためかサウンドを鳴らすには使います。
最後に、ジョイスティックに関連のイベントがあります。四方向のイベントがあります(中間的
動きでは、つまり斜めのような動きでは該当両方のイベントが生じます)。最高でジョイスティ
ックの8つのボタンのイベントも定義できます。これはプライマリのジョイスティックにでもセコ
ンダリのジョイスティックにでも使用できます。
Other イベント
ゲームに役立つ他の幾つかのイベントがあります。それらは、このメニューにあります。次の
イベントはここに出ています。
・ Outside:インスタンスがルームを出たとき発生します。通常これを利用してインスタン
スを破壊します。
・ Boundary: インスタンスがルームの境界にあるとき、発生します。
・ Game start:このイベントはゲームのスタートに発生します。これは、(後述の)ルー
ム・スタートの前、およびインスタンスの生成の後に起こります。通常、このイベントは
28
一つのコントローラ・オブジェクトにだけ定義され、バックグランド・ミュージックの再生
や変数の初期化やデータのロードに用います。
・ Game end:このイベントはゲーム終了時にすべてのインスタンスに起こります。通常、
一つのオブジェクトしかこのイベントを定義しません。あるデータをファイルに保存する
等に用います。
・ Room start:これはルームがスタートするとき、そのすべてのインスタンスに起こりま
す。クリエーション・イベントの後に起こります。
・ Room end:ルームが終了するとき、そのすべてのインスタンスに起こります。
・ No more lives:ゲーム・メーカーは組み込みのライブ・システムをもっています。ライブ
の数の設定や更新用のアクションがあります。ライブの数が 0 か 0 以下になると、こ
のイベントが生じます。これは、ゲームの最スタート、あるいは終了させるときに使用し
ます。
・ No more health:ゲーム・メーカーには組み込みのヘルス(健康)システムをもって
います。ヘルス状態の設定や更新用のアクションがあります。ヘルスが 0 か 0 以下に
なると、このイベントが発生します。通常、これはゲームの最スタート、あるいライブの
数を減らすときに使用します。
・ End of animation:アニメーションは、前に示したように幾つかのイメージで構成され、
最後のイメージの後に再び最初のイメージが来ます。ちょうど、そのときにこのイベン
トが発生します。たとえば、このイベントはアニメーションを変えるかインスタンスを破
壊するには使用できます。
・ End of path:このイベントはインスタンスがパスを沿って追跡して、そのパスの終点に
辿ったときに発生します。これについて第21章をみてください。
・ User defined:この種類の8つのイベントがあります。これらのイベントはコードで呼ば
ない限り決して起こりません。
Draw イベント
インスタンスは可視のとき、ゲームの各ステップに自分のスプライトをスクリーンに表示し
ます。このイベントでアクションを指定すると、スプライトが表示されないで、その代わり指定
されたアクションが実行されます。これは、スプライトの代わり他のものを表示するには用い
られます。または、スプライトの引数の変更に使用します。ドローイング・イベントに専用化さ
れたアクションがいくつあります。このイベントはオブジェクトが可視のときのみ実行されます。
もちろん、描き方と関係ないでコリーション・イベントの発生がインスタンスのスプライトのみ
に基づいています。
色々な場面でゲーム・メーカがどの順序でイベントを処理することが理解する必要がありま
す。この処理順序は次の通りです。
開始ステップ・イベント
アラーム・イベント
キー・ボード、キー押す、キー解放のイベント
マウス・イベント
通常のステップ・イベント
(すべてのインスタンスが新位置に設定される)
衝突イベント
終了ステップ・イベント
ドローウイング・イベント
29
発生、破壊、またはその該当のことが発生するとき。
30
Chapter 12 アクション
アクションはゲーム・メーカーで起こる物事です。アクションはオブジェクトのイベントに置
かれます。イベントが発生すれば、そのアクションが起動されます。数多くのアクションがあり、
それぞれの使い方を理解する必要があります。この章では基本的なアクションのすべてにつ
いて述べます。他のアクションはライブラリ(アクションの集まり)の形で提供することができま
す。これらはゲーム・メーカーの機能を拡張します。ウエブ・サイトにアクセスして追加できるア
クション・ライブラリについて確認しましょう。
オブジェクトのプロパティ・フォームの右には、アクションがタッブ付きのページで分類され
ています。アクションのセットが7つです。セットがタッブのクリックで選択できます。アクション
の上にマウスを止めるとアクションの機能について簡潔な説明が表示されます。
繰り返してみましょう。イベントにアクションを付けるには、該当のタッブ・ページからアクシ
ョンをリストにドラッグします。リスト内の順序を変えるには移動したいアクションをドラッグし
ます。<Ctrl> キーを押したまま一つのアクションをドラッグするとそのアクションがコピーされ
ます(オブジェクト同士のリスト間でもこれは可能です)。アクションを削除するときには、マウ
スの右クリックを用います(<Del>も使えます)。マウスの右クリックでもコピーやペストもでき
ます。
アクションをリストにドロップすると、ほとんどの場合はアクションの設定用のウインドウが
現れます。多数のアクションには2種類のパラメーターがあります。ウインドウの上部にアクシ
ョンの対象になるインスタンスを指定することができます。デフォルトは、(オブジェクトのイン
スタンス)自分自身です。ほとんどの場合は、デフォルトの設定を使用します。コリーション・イ
ベントの場合は、他方のインスタンスにアクションを適用できます。たとえば、他方のインスタ
ンスを破壊することができます。また、アクションを特定のオブジェクトのすべてのインスタン
スに適用することが選択できます。これで、たとえばすべての赤ボールを青ボールに変換する
ことができます。もう一つのパラメーターはチェック・ボックス Relative にあります。このボック
スをチェックすると、設定で記入する値は現在値に対して相対値になります。これで、たとえ
ば現在のスコアーを変えずに、これに何かを増加したりすることができます。その他のパラメ
ーターについては後述します。パラメーターの変更はアクジョン上のダブル・クリックで行えま
す。
12.1 移動・アクション
最初のアクション・セットはオブジェクトの移動(動き)についてです。そのために次のアク
ションがあります。
31
Set the horizontal speed
インスタンスのスピードは垂直の成分と水平の成分で構成されます。このアクションでは
水平の速度を変えます。肯定の水平スピードは右方向のものになります。否定のは左方向
になります。垂直のスピードは変わりません。相対(relative)を使うと肯定値で加速、否定値
で減速の設定が可能です。
Snap to grid
32
このアクションでインスタンスの位置をグリッドにフィットさせます。横と縦のスナピングの値
(グリッドのセル・サイズ)が設定できます。これはインスタンスをグリッド内に置かせるには便
利です。
33
Destroy instances at a position
このアクションで特定の座標を含むバウンディング・ボックスのインスタンスをすべて破壊
します。これは、爆弾を爆発させるときには、便利です。相対(Relati-ve)ボックスをチェックす
ると、指定の位置は現在の位置に対して相対的に計算されます。
Play a sound
このアクションでサウンド・リソースを再生します。サウンドの指定および再生回数が指定
できます。デフォルトは一回であり、永遠に(ループ)の再生も選択できます。多数の wave 型
のサウンドが同時に再生できますが、midi 型のものの再生は一つしかできません。このタイ
プのサウンドを生成すると、現在の midi 型のサウンドの再生が止まります。サウンドが多数
のバッファをもたない限り、サウンドの一つのインスタンスしか再生できません(第17章を参
照)。このため、再生中のサウンドが指定された場合は、まずこのサウンドが止められ、そして
先頭から再び再生されます。
Stop a sound
このアクションは指定のサウンドを止めます。サウンドの多数のインスタンスが再生中の場
合は、すべてが止まります。
If a sound is playing
指定されたサウンドが再生中であればリストの次のアクションが施行されますが、再生中
でなければそのアクションが飛ばされ、施行されません。否定の条件も選べます。つまり、指
定のサウンドが再生中ではないとき、リストの次のアクションを施行します。たとえば、あるバ
ックグランド音楽が再生中か否かをテストして、新しいバックグランド音楽を流すことができ
ます。このようなチェックを行うための情報については第34章を参照して下さい。
Go to a different room
このアクションで特定のルームに移動することができます。ルームと遷移効果を指定します。
Display a message
このアクションでダイアログ・ボックスにメッセージを表示することができます。メッセージの
作成だけが必要です。メッセージ内に#の記号を使用すると、改行として見なされます(この
記号をテキストに記入するには「\#」を使います)。メッセージはクオテーションまたはダブル・
クオテーションで始まると、式として見なされます。これについて後述を参照されたい(このア
クションはゲームが排他的モードで実行されているときは無効です。第26章を参照)。
35
End the game
このアクションでゲームを終了させます。
12.4 制御
他のアクションの施行を制御する色々なアクションがあります。これらは、ほとんど問いをし
ます。たとえば、ある場所は空かを聞いたりします。答えは「はい」(true)であれば、リスト内の
次のアクションが実行され、「いいえ」の場合は次のアクションが無視されます。一つ以上の
アクションを判定の対象にしたいときは、これらは一つのブロックに置きます。このため、グル
ープの先頭にスタート・ブロックを、その末尾にエンド・ブロックを置きます。答えは「いいえ」
に対応するブロックも同様に構成できます。古典的な問いの構成は次の頁の図に示します。
この例では、現在のインスタンスのためのある場所は衝突フリーであるかどうかを問いま
す。コリーションの無い場所であれば、問の答えは「はい」となり、インスタンスがある方向に
移動します。答えは「いいえ」のとき、インスタンスが指定された位置に飛び移ります。
36
数多くの問いは、その対象をオブジェクトのすべてのインスタンスに指定することができま
す。この場合は、結果が真(true)になるのは、すべてのインスタンスに対して真であるときだ
けです。たとえば、すべてのボールの右の場所は空いているかどうかをチェックすることがで
きます。
次の問およびそれに関連されたアクションがあります(これらのアクションは他
のアクションと区別しやすくするために独特のアイコンとバックグランド色をもっ
ています)。
If an expression is true
これは最も一般的な問いです。式を記入します。式の値は「真」(値の場合は 0.5 以上のも
の)となると、このアクションの次のアクションが実行されます。式について後述の文を参考に
してください。
37
指定されたマウスのボタンが押されると、このアクションが「真」を返します。通常ステップ・
イベントに用いられます。マウス・ボタンが押されたかをチェックして、「真」の場合は、マウス
のクリック位置にインスタンスを移動することができます(この場合は、座標 mouse_x および
mouse_y の jump to a given position のアクションを使用します)。
Else
ある問いの答えは「偽」の場合、このアクションの後に実行される部分が来ます。
Start of block
アクションのブロックの始まりを示します。
End of block
アクションのブロックの終わりを示します。
12.5 描画アクション
描画アクションはドローイング・イベントだけで有効です。他には無視されます。スプライト
やバックグランド以外を描くのは遅いです。このためこれを必要なときにだけ使いましょう。
Draw a rectangle
現在のインスタンスの位置(相対か絶対か)に対して描画する長方形の互いに対角にあ
る二つの点の座標を指定します。
Draw an ellipse
現在のインスタンスの位置(相対か絶対か)に対して楕円を囲む長方形の互いに対角に
ある二つの点の座標を指定します。
38
Draw a line
現在のインスタンスの位置(相対か絶対か)に対して線の両端の座標を指定します。
Draw a text
テキストとその位置を指定します。テキストに#の記号を使用すると、改行として見なされ
ます(この記号をテキストに記入するには「\#」を使います)。このように多行数のテキストを
作成することができます。テキストはクオテーションまたはダブル・クオテーションで始まると、
式として見なされます。たとえば、次のように書くと、
'X: ' + string(x)
12.6 スコアー関連のアクション
ほとんどのゲームにプレイヤーが何らかのスコアーをもちます。また、数多くの
ゲームにはプレイヤーに幾つかのライブが与えられます。更に、プレイヤーがある
ヘルスももちます。次に示すアクションはプレイヤーのスコアー、ライブ数、ヘル
スの管理を容易にします。
39
Display the highscore table
ゲーム毎に最高の 10 個のスコアーが保持されます。このアクションはトップ・スコアーのリ
ストを表示します。現在のスコアーはトップ・テンの中にあれば、このスコアーが挿入され、プ
レイヤーが自分の名前を記入することができます。スコアー表の表示を色々な形、色、使用フ
ォントなどに設定することができます。(このアクションは排他的モードで動作しません)。
If lives is a value
この問いでライブ数が特定の値に達成したかをチェックすることができます。その値を指定
し、ライブ数の値がそれより小さいか大きいか等しいかを指定します。
If health is a value
この問いでヘルスが特定の値に達成したかをチェックすることができます。その値を指定
し、ヘルスの値がそれより小さいか大きいか等しいかを指定します。
40
12.7 コード関連のアクション
最後に、特にコードにかかわるアクションが幾つかあります。
Execute a script
(アドバンス・モードのときのみ有効)このアクションでゲームに追加したスクリプトを実行
することができます。スクリプトとその引数(5つまで)を指定します。スクリプトについて第21
章をご覧ください。
Comment
このアクションでコメント・ラインをアクション・リストに追加することができます。その行はイ
タリック・フォントで表示されます。これはイベントを実行するときには特に何もしません。これ
を付けることによってイベントのやっていることを覚えるには助けになります。
12.8 式と変数の使用
数多くのアクションの設定には引数の値も指定しなければなりません。数字だけでなく、式
で値を与えることができます。たとえば、32*32 のような式で値を与えることができます。実は
複雑な式も使えます。たとえば、水平の速度を倍にしたい場合は、これは 2*hspeed のよう
に設定できます。ここで、hspeed は水平のスピードを表す変数です。数多くの変数がありま
すが、次に示すのは最も重要なものです。
x インスタンスの x 座標
y インスタンスの y 座標
hspeed 水平の速度(ピクセル/ステップ)
vspeed 垂直の速度(ピクセル/ステップ)
direction 度単位の現在の移動方向(0〜360)
speed 現在の方向での速度
visible オブジェクトが可視(1)か透明か(0)を表す
41
image_scale イメージのスケール率(1はスケール無し)
image_single この変数は現在のスプライトのどれのサブイメージを表示すべきの
を指定します(番号は 0 からです)。−1(デフォルト設定)に設定すると、ループでサブ
イメージが一つずつ表示されます。デフォルト以外の設定では指定されたサブイメー
ジしか描画されません。
image_speed この変数はサブ・イメージの表示速度を指定します。デフォルト値は1
です。これより大きい値を指定すると、指定された速度に合わせるために幾つかのイ
メージが飛ばされます。1未満の値を指定すると、イメージの切り替えは遅くなります。
score 現在のスコアーの値
lives 現在のライブ(命)数
health 現在のヘルス (0-100)
mouse_x マウスの x 座標
mouse_y マウスの y 座標
これらの変数の値が変数設定のアクションで変えられます。設定(初期化)すれば、自分
の変数も使えます(相対の設定を使わないでください。まだ有効なオプションではない)。変
数を設定すると、式でも使えます。自作した変数はインスタンスの局所的(ロカル)な変数で
す。つまり各インスタンスはこの変数のコピーをもっています。グローバルな(共用、広域的)
変数を定義するために変数名の前に「global.」を付けて下さい。
変数の前にオブジェクト名と「.」を付ければ、他のオブジェクトの変数を参照することもで
きます。たとえば、ボールはコインの位置に移動させたいときは、その位置を(coin.x ,
coin.y)のように指定すればよい。コリーション・イベントのとき、他方(other)のオブジェクト
の位置が other.x のように扱えます。条件付き式では大小関係の表す「<」、「>」などが使
えます。
式には関数も使えます。たとえば、random(10)の関数は10以下の実数を生成します。こ
れを用いれば、速度をランダムに設定することができます。数多くの他の関数もあります。式
および関数について第28章以降を参照しましょう。
42
43
Chapter 13 ルームの作成
ここまでオブジェクトを定義してその行動をイベントとアクションで定義してきました。ここで
ゲームのルームあるいはレベルを作成します。いずれのゲームは少なくとも一つのルームを
必要とします。これらのルームにオブジェクトを配置します。ゲームがスタートすると、最初の
ルームが表示され、そのオブジェクトがクリエーション・イベントで指定したアクションで行動
し始めます。
ルームを作成するときには、色々な選択があります。プロパティの設定とオブジェクトのイン
スタンスの追加の他に、バックグランドの追加、ビューの定義、およびタイルの読み込みが可
能です。これらのオプションについては第20章で述べます。この章では基本設定であるイン
スタンスの追加、およびバックグランド・イメージの設定についてのみ述べます。
ルームを作成するとき Add メニューから Add Room を選びます。すると、次のフォームが
表示されます。
左上には3つのタブがあります(アドバンス・モードではこれらは5つになります)。
「objects」のタブでオブジェクトのインスタンスをルームに追加します。「settings」のタブでル
ームの幾つかの設定が指定できます。「backgrounds」のタブでルームのバックグランド・イメ
ージが設定できます。
Views タブでルームの一部だけを示すビューを定義することができます。Tiles タブでルーム
にタイルを追加することができます。
13.1 インスタンスの追加
ルームの設計フォームの右にルームのレイアウトがみられます。初期状態では空で、バック
グランドに灰色のマス目が写っています。
インスタンスをルームに追加するために、まず objects のタブを選択します。左側の下部に
あるオブジェクト選択用のメニューボタンを押して、追加したいインスタンスのオブジェクトを
選択します。オブジェクトの外観であるイメージが表示されている場合は、イメージをクリック
44
すればそのオブジェクトの追加が可能になります。メニュー・ボタンでオブジェクト名を選択す
ると、そのイメージがすぐその上の枠に表示されます(イメージ上には座標の線は引かれてい
ます。これはイメージがルーム上のグリッドに配置されたときのマス目に対する位置と大きさ
を示すものです)。左クリックで右側にあるルーム領域上をクリックすると、そこに選択したイン
スタンスがグリッドに沿って配置されます(後述ではグリッドの設定が変えられますが、インス
タンスの配置を行うときは<Alt>キーを押すと、自由配置になります)。右クリックでインスタン
スの削除ができます。このようにルームの中身を設定します。配置を行うときはマウスを押し
たままにすると、通過されるところに該当のインスタンスが配置か、あるいは削除されます。
ここまで分かると思いますが、インスタンスを重なると下のものが消えます。通常これは狙
いのですが、望ましくない場合もあります。これを避けるために、左にある Delete underlying
のチェック・ボックスのチェックマークを外します。積み重なるインスタンスを扱うには他の有
効な三つの組み合わせがあります。インスタンスの位置に<Ctrl>キーを押したまま右クリック
すると、その位置にある一番下のインスタンスがトップに引き上げられます。インスタンスの位
置に< Alt >キーを押したまま右クリックすると、その位置にある一番上のインスタンスが一番
下に移動されます。これはインスタンスの順序を変えるには使います。最後に、<Shift>キーを
押したまま右クリックするとその位置のインスタンスがすべて削除されます。
左側には四つの便利なボタンがあります。Clear ボタンですべてのインスタンスがルーム
から削除できます。Shift ボタンですべてのインスタンスを数ピクセル分移動することができま
す。左か、あるいは上に移動するときは否定の数を用います。これはルームを拡大するに便利
です(これもインスタンスをルーム外に置くために使えます。これは時々便利です)。最後の2
つのボタンでインスタンスをXかY方向で整列することができます。インスタンスが少々重なっ
ているときは便利です。
13.2 ルームの設定
各ルームが幾つかの設定があり、これらが settings タブで変えられます。ここでは最も重
要な設置だけについて述べます。
ルームのそれぞれが名前をもっています。できるだけ意味のある名前を与えましょう。ルー
ムがカプション(タイトル名)ももっています。このカプションはウインドウのカプションに表示
されます。ルームの高さおよび幅(大きさ)はピクセル数で設定します。ゲームのスピードも設
定できます。これは一秒あたりのステップ数で与えられます。スピードが早ければ移動などが
スムースに行われます。しかし、高速なコンピュータが要求されます。
settings タブの下部にはグリッドのサイズを設定するための欄があります。Show のボタン
でグリッドの表示を有効にすることができます(ここでバックグランド等の表示有無も指定で
きます。作業中ではルームの幾つかのものを一時的に隠すには便利です)。
13.3 バックグランドの設定
background のタブでバックグランドのイメージを設定します。
実は、多数のバックグランドが指定できます。次のフォームが
表示されます。
フォームのトップにバックグランドの色が見えます。クリックす
れば色が変えられます。この色はイメージを使わないときに
役に立ちます。イメージを使うときは一番左にある Draw
background color のチェックを外してください。イメージを使
って外さないと処理時間だけ無駄になります。
左には8つのバックグランドのリストが見えます。それぞれを
定義することができますが、通常一つか二つしか使いません。
バックグランドを定義するときは、まずリストからそのバックグ
ランドを選びます。次いで、チェックボックス Visible when
room starts を選択します。選択しないと、表示されません。
定義が終わればその名前は太字でリストに表示されます。
定義作業の次にはイメージをメニューから選びます。色々な
設定ができます。まず、バックグランドはルームを縦のタイル
もしくは横のタイルで埋めるかを指定することができます。バ
45
ックグランドの位置も指定できます(これはタイリングに影響を与えます)。最後に、バックグラ
ンドにスコロリングの動きが横方向か縦横の速度で与えられます。
46
Chapter 14 ゲーム配布
ここまでみてきた情報ではゲームを作成することができます。ゲームを作成すると、他人に
見て遊んでもらいたいですね。ゲームの配布を自由に行ってください。売っても構いません。
詳細については、ライセンスを見てください。
基本配布方法は三つあります。一番簡単なのは、ゲームの*.gmd ファイルを配布すること
です。しかし、この場合は、相手はゲーム・メーカーをもたなければなりません(ゲーム・メーカ
ーを作成したゲームと一緒に配布してはいけません)。この配布では相手はゲームを変更す
ることもできます。
第二の方法は、スタンド・アロンの(実行可能な)バーションを作成することです。このため、
File メニューの Create Executable の項目を選択します。すると、フォームが現れ、ゲームの
実行ファイル名が要求されます。名前を記入して、OK ボタンを押すと、誰にでも配布できる
スタンド・アロンのゲームができあがります。オプション・フォームでスタンド・アロンのゲーム
のアイコンを設定することができます(他の必要なファイルはスタンド・アロン・ゲームの含む
フォルダにコピーして置いてください)。このフォルダで配布できます(圧縮してからでも)。
最後の三つ目の方法は、インストラーを作成することです。インターネットで色々なフリーの
インストーラーがあります。この方法でもスタンド・アロンのバーションを作成して、インストー
ラにインストールを任せます。やり方は、使うインストーラーに依存します。
47
Chapter 15 アドバンス・モード
ここまでゲーム・メーカーのシンプルな特徴だけみてきました。しかし、その他
色々なことができます。その他の特徴を利用できるためにゲーム・メーカーをアド
バンス・モードで起動しなければなりません。その切り替えは簡単です。File メニュ
ーから Advance mode を選択して下さい(その効果をみるために、ゲーム・メーカーをリスタ
ートするか現在のゲームを保存して再ロードするかの何れの一つが必要です)。
ゲーム・メーカーをアドバンス・モードで起動すると次の画面が現れます。
ここでは、シンプル・モードの項目が表示されますが、リソースやボタンやメニュ
ーの項目が増えます。また、次の章に示すようにリソースには更に幾つかのオプシ
ョンが使用可能になります。以下ではその他のメニュー項目について説明します。
48
o Load last opened file on startup.チェックされると、ゲーム・メーカーの起動時
に最も最近使用したファイルが自動的に開かれます。
o Keep backup copies of files.チェックされると、ゲームのバック・アップが.ba0-
ba9 の拡張子で作成されます。この拡張子のファイルをゲーム・メーカーで開
けます。
o Maximal number of backups.これで使用するバックアップ・ファイルの数を指
定します。
o Hide the designer and wait while the game is running.チェックされていれば、
ゲームを実行するときは、設計用の画面が消え、ゲーム終了後再び現れます。
o Run games in secure mode.チェックされると、あなたのコンピュータとゲーム・
メーカーで作成されたゲームは、ゲーム・フォルダ外のの他のファイルを実行
したり、変更したりすることができなくなります(これはトラジャン型ウイルスの
対策です)。これをチェックすると、正常に実行できないゲームが出る場合もあ
ります。
o Show the origin and bounding box in the sprite image.チェックされると、ス
プライトのプロパティ・フォームのスプライト・イメージにスプライトのオリジンと
バウンディング・ボックスが表示されます。
o In object properties, show hints for actions.チェックされると、オブジェクトの
プロパティ・フォームでマウスがアクションの上に置かれるとヒントが示されま
す。
o When closing, remove instances outside the room.チェックされると、インスタ
ンスがルームの領域外にあることを注意して、その削除を可能にします。
o Show pop up at right mouse click in room image.チェックされると、マウスの
右クリックでインスタンスが削除されません。その代わり、メニューが現れ、そこ
でコードの設定などが行えます。
o Remember room settings when closing the form.チェックされると、ルームに
関する設定(グリッドの表示、重なるインスタンスの削除など)が記憶され、同
じルームを編集するときは使用されます。
o External sound editors.これで外部のサウンド・エディタを各サウンド
形式に指定することができます(ゲーム・メーカにはサウンド・エデ
ィタがありません。エディタを指定しないとサウンドを編集できなく
なります)。
o Scripts and code.この設定について第23章を参照されたいです。
o Colors. この設定について第23章を参照されたいです。
o Image Editor.イメージを編集するには、デフォルトで GameMaker は内
蔵のエディターを使います。別よりよいエディターのある場合はその
使用をこの項目で指定できます。
49
15.3 Add メニュー
各タイプのリソースをこのメニューで追加することができます。これらの各々にはツール・バ
ーのボタンもキー・ショットカットもあります。
50
Chapter 16 もう少しスプライトについて
ここまでスプライトをファイルから読み込みました。しかし、ゲーム・メーカーではこれらを作
成したり変更したりすることができます。これを行うために、スプライトのプロパティ・ウインド
ウをスプライトのダブルクリックで開きましょう(新規作成でも可能)。次いで、Edit Sprite の
ボタンを押します。スプライトを構成するサブイメージがもう一つのフォームに現れます。
16.1 自分のスプライトを作成する
開かれるフォームは次のようなものになります。
右にはスプライトを構成するイメージが見えます。ゲーム・メーカーではサブイメージすべて
が同じ大きさでなければなりません。サブイメージの左にアニメイテッド・スプライトが再生さ
れます。再生されないとき、Show Preview のボックスをチェックして下さい。プレビューの下に
再生速度およびバックグランド色の変える欄およびボタンがあります。プレビューでアニメー
ションがゲームに使われたときの様子が確認できます(このスピードは実際のスピードでは
ないことに注意しましょう。ゲームでのスピードはルームで設定した再生速度に依存します)。
スプライト・エディターのコマンドでスプライトを作成したり変えたりすることができます。こ
れらのコマンドはすべてメニューによって提供されています(幾つかのコマンドに対するボタ
ンもツールバーにあります)。その中には単一のイメージにしか適用できないものがあります。
これらを使うときはまずサブイメージをマウスで選択します。
New. このコマンドで新しいスプライトを作成します。スプライトのサイズを指定しなけ
ればなりません(スプライトのサブイメージのすべては同サイズとする必要がありま
す)。
Create from file. ファイルからスプライトを作成します。色々なファイル型が使えます。
いずれのを使っても単一のイメージのスプライトを作成します。ただし、アニメイテッド
GIF のファイルがそのサブイメージに分割されます。また、透明色はイメージの一番左
下のピクセルの色になるので、GIF ファイルの透明色ではありません。
51
Add from file. 現在のスプライトにファイルからイメージを追加します。スプライトのサ
イズに等しくないときは、読み込むファイルの置く場所か、あるいはストレッチするかを
選択します。
Save as GIF. スプライトをアニメイテッド GIF として保存します。
Save as strip. イメージのストリップ(strip)状でスプライトをビットマップとして保存し
ます。
Create from strip.ストリップからスプライトを作成します。詳細については後述の文
を参照しましょう。
Add from strip. ストリップからイメージの追加に使います。後述文を参照して下さい。
Close saving changes. スプライトの変更を保存してフォームを閉じます。変更をセー
ブしたくないときウインドウの閉じる用のボタンを押します。
52
Crop. イメージをできるだけ小さくします。これはとても便利です。大きなイメージが大
きなビデオメモリを使うからです。場合によって透明性関連の問題を避けるためにイ
メージの周辺の境界線を残すことがあります。
目的のスプライトが出来上がるまでこれらのコマンドを色々試さなければなりません。
特に、最後の二つのコマンドは強力なものです。たとえば、オブジェクトを爆発させるには、
幾つかのコピーと幾つかの空フレームを追加します。次いで、これらは爆発のアニメーション
とオバーレイします。または、爆発にモーフィングさせます。練習すれば、インパクトのあるスプ
ライトが作れます。
16.1.6 ストリップ
上記に示したように、スプライトは通常アニメイテッド GIF ファイルかストリップとして保存
されます。ストリップはイメージを並べて保存する大きなビットマップです。唯一の問題は、
各々のサブイメージの大きさがこのイメージに保存されていないことです。また、インターネッ
トで手に入れるストリップの中には多数のスプライトを保存するものもあります。たとえば、次
のストリップ・ファイルの一部分には四つのアニメーションが入っています。
53
このようなファイルからスプライトを指定するために、File メニューから Create from Strip
か、または Add from Strip を選択します。
該当のストリップ・イメージ・ファイルを指定すると、次のフォームが現れます。
ウインドウの右には選択したストライプの一部分が見えます。左に対象のサブイメージを設
定するパラメーターが幾つ指定できます。表示される長方形は選択されているイメージを囲
みます。次のパラメーターが設定できます。
54
Horizontal separation. ストリップにはイメージ間に線か、あるいは空白があります。
これで水平方向でスキップする距離を指定します(ピクセル数で)。
Vertical separation. イメージ間の垂直方向でスキップするピクセル数。
正しいイメージ・セットを選んでから、スプライトを作成するために OK を押します。他人の
作ったイメージを使う前にその人の許可を得るか、あるいはイメージがフリーであることを確
かめましょう。
16.2 個々のサブイメージの編集
各サブイメージも編集できます。このため、サブイメージを選択して、Edit メニューから Edit
Image を選びます。これは、下に示すゲーム・メーカーの小さなペインティング・イメージング
(Image Editor)プログラムを起動 55 させます。
このプログラムは小さな変更や修正を行うためのもので、新しいイメージを作成するため
に作られていません。それが目的であれば、専用のドローイング・プログラムを使用して、コピ
ー・ペストでゲーム・メーカーにイメージを入れましょう。
フォームはイメージを真ん中のスペースに表示し、左に基本ドローイング・ボタンを表示し
ます。このボタンでズーム・インかズーム・アウトしたり、ピクセルを描画したり、線を引いたり、
長方形を描いたり、テキストを書いたりすることができます。色はマウスの左および右のボタ
ンの使用に依存します。ドローイング・ツールの幾つかに線の幅や可視度のような特徴を設
定することができます。また、ある色のすべてのピクセルを別の色に変えるボタンもあります。
これは、特に透明性に用いるバックグランド色の変更に便利です。ツール・バーにはイメージ
のすべてのピクセルを左右か上下に移動するためのボタンがあります。また、イメージがズー
ム・イン化されたときグリッドの使用も指定できます(最低4倍ズームが必要です)。
フォームの右上に選択する色のための二つの枠があります(一つはマウスの左ボタンで選
び、もう一つは右ボタンで選びます)。色変更の仕方が4つあります。まず、16個の基本色か
らマウスのボタン(右か左)で一つの色が選べます。基本色の上にスプライトの一番左下の
ピクセルを示すボックスがあります。スプライトが透明のときこの色は透明色として使用され
ます。この色を使うと、イメージの一部分を透明にすることができます。選択した色でイメージ
をクリックするのは、もう一つの方法です。この方法ではより数多くの色が選べます。ボタンを
55
押したままにすると選択している色が見えます。第三の方法は、マウスの左クリックで左と右
のボックスをクリックすることです。すると、カラー・ダイアログが現れ、そこから色が選べます。
最後に、左にあるドロッパー・ツールでイメージをクリックして色をそこにコピーする方法があ
ります。
メニューには、スプライト・エディタにもあるイメージの変形・変質用コマンドがあります。し
かし、この場合は現在のイメージにしか適用できません(多数イメージのスプライトのとき、サ
イズ変更や、ストレッチ等のコマンドが不能です)。イメージをビットマップ・ファイルとして保存
できます。Image メニューには次の二つのコマンドもあります。
Clear. イメージを左の色で染めてクリアします(透明色は自動的にこの色になりま
す)。
Gradient fill. このコマンドでイメージを少しずつの変わる色で染めます(スプライトに
はそんなに役に立たないが、見た目はよいし、このプログラムも使用するバックグラン
ドの作成に使えます)。
イメージの一部分を選ぶためのツールなどがありません。また、ファンシな描画ルーチンも
ありません。そのようなものを使いたいときはペインティング・プログラムを使ってください(ウ
インドウのペインティング・プログラムでもよい)。一番簡単なやり方では、対象のイメージをコ
ピーして、ペインティング・プログラムで編集した後再びコピー・ペストでゲーム・メーカーに戻
します。
16.3 アドバンスなスプライトの設定
アドバンス・モードでスプライト・プロパティ・フォームにはアドバンス・オプションがあり、こ
こでそれらについて述べます。
まず、衝突をチェックするためのオプションがあります。二つのインスタンスが合うと、コリー
ション・イベントが発生します。コリーションは次のようにチェックされます。各スプライトはバウ
ンディング・ボックスをもっています。このボックスは透明でないすべてのサブイメージを囲め
ます。バウンディング・ボックスが重なると該当サブイメージのそれぞれのピクセルは重なる
かがチェックされます。これはメモリと前処理を必要します。このような厳密なチェックが不要
の場合は、Precise collision checking ボックスのチェックを外してください。このとき、バウン
ディング・ボックスのチェックのみ行われます。バウンディング・ボックスを小さくすることもでき
ます。これは滅多に使用しませんが、バウンディング・ボックスを小さくしてスプライトの周辺の
部分がコリーションに無視されるようにしたい場合には使います。
スプライトがビデオ・メモリと標準(メイン)メモリの2カ所に格納できます。ビデオ・メモリは
通常グラフィクス・カードにあるため高速です。スプライトの多数のインスタンスがある場合は、
多分ビデオ・メモリに保存するでしょう。しかし、ビデオ・カードによってビデオ・メモリのサイズ
は小さく限られています。このため、大きなスプライトはビデオ・メモリに保存しないようにしま
しょう。
幾つかのスプライトは一つか二つのレベルにしか使わない場合があります。この場合はス
プライトをメモリにすっと保存するのは無駄なことです。このとき、Load only on use(使用時
のみロード)のボックスをチェックします。これでスプライトは使用のときにロードされます。ル
ームの終了時に削除されてメモリが解放されます。大きなゲームの場合はロードされるスプ
ライトおよびビデオ・メモリに保持するスプライトの管理は重要なことです(コードでもスプラ
イトをロードしたり削除したりすることもできます)。
最後に、スプライトのオリジンを指定することができます。これはスプライトの位置に一致す
るポイントです。インスタンスを特定の場所に置くときはスプライトのオリジンがそこに置かれ
ます。デフォルトのオリジンはスプライトの左上の角の位置です。しかし、スプライトの中心や
他のポイントを使った方がよい場合があります。スプライト外のポイントも選べます。スプライ
トにクリックすることでもオリジンを設定することができます(イメージ上にオリジンが示されて
いるときのみ)。
56
57
Chapter 17 もう少しサウンドとミュージックについて
サウンドを付けるときは、その他の幾つかの特徴を設定することができます。これらにはア
ドバンス・モードのときのみ表示されます。
いずれのタイプのサウンド・ファイルを使用のときにのみロードするように指定できます。し
かし、これは midi 型のファイルのデフォルトで、wave 型ファイルのデフォルトではありません。
該当ボックスをチェックすると、サウンドはゲームがスタートするときメモリにロードされません。
必要なときにロードされます。これは軽いヒックアップ(hick-up)を起こしますが、メモリのセー
ブが大きくて、ゲームのロードが早いです。また、ルームの終わりにサウンドが捨てられ、メモ
リが解放されます。また、必要なときに再ロードされます。これは短いサウンド効果に使用し
ないで、バックグランド・ミュージックあるいはたまにしか再生されないサウンドに使いましょう。
Wave 型ファイルの場合は、そのバッファ数を指定することができます。これはサウンドが同
時に再生できる数を表します。たとえば、爆発のサウンドを用いるとき、しかも同時に幾つか
を再生しなければならないときはこの数を大きくしなければなりません。しかし、バッファ数と
共に必要なメモリの領域が大きくなります(これはサウンドカードによります)。
サウンドはサウンド効果のために準備されるかどうかも指定できます。これらのパニングお
よび音量変更のような効果はコードでしか使えません。サウンド効果用のサウンドはより多く
の資源を要求します。
ゲーム・メーカーにはサウンド・エディターがありません。しかし、環境設定で外部のエディ
ターを指定することができます。設定が行われていれば、Edit Sound のボタンを押すことが
でき、現在のサウンドを編集することができます(編集中にゲーム・メーカーの設計ウインドウ
が隠され、サウンド・エディターを閉じると、再び表示されます)。
58
Chapter 18 もう少しバックグランドについて
ファイルからのローディングだけでなく自分のバックグランドも作れます。このために、Edit
Background のボタンを押します。小さなペインティング・プログラムが起動され、このプログ
ラムでバックグランドを生成したり変えたりすることができます。このプログラムは高度なもの
ではないので、よりアドバンス・ツールが使いたいときはペイント用のプログラムを使いましょ
う。このプログラムは 16.2 節で説明されています。その中でとても有利なオプションが一つあ
ります。Image メニューには Gradient Fill の項目があります。これを用いればとてもきれいな
グラディエントをもつバックグランドが作成できます。
アドバンス・モードではバックグランド・プロパティ・フォームにアドバンスなオプションがあ
ります。
通常、バックグランドはビデオ・メモリに保存されます。バックグランドの画像が小さいとき
問題がないが、ビデオ・メモリが小さいため大きなバックグランドの場合は通常のメモリの使
用が望ましいです。通常メモリの使用でビデオ扱いが少々遅くなります。通常メモリを使うた
めに Use video memory ボックスのチェックを外してください。
また、デフォルトのバックグランドが必要に応じてルーム終了時に捨てられます。これは大
きなメモリのセービングにつながりますが、ルームの始まりが少々遅くになったり、ルーム途
中のバックグランド入れ替えに小さなヒックアップが起こったりします。これを避けたいときは、
Load only on use のボックスのチェックを外してください。
59
Chapter 19 もう少しオブジェクトについて
アドバンス・モードでオブジェクトを作成すると、よりアドバンスな設定が変えられます。
19.1 深さ
まず、オブジェクトのインスタンスの深さ(Depth)を設定することができます。インスタンス
がスクリーンに描画されるときはその深さの順にしたがって表示されます。インスタンスは深
さが高いと先に描画されます。深さの小さいインスタンスが最後に表示されます。同じ深さの
インスタンスは生成の順で表示されます。あるオブジェクトをその他のオブジェクトの前に置
きたいときは、その深さを否定数にしましょう。逆の場合は、大きな肯定値の深さを与えましょ
う。ゲーム中にも depth の変数を用いればインスタンスの深さが変えられます。
19.2 パーシステント・オブジェクト
第二は、オブジェクトをパーシステントにすることができます。このタイプのオブジェクトがル
ームからルームへ移動するとき残ります。消えるのは破壊されるときだけです。このように設
定すると、オブジェクトを最初のルームに置けばすべてのルームに残ります。これは主人公が
ルームからルームへ移動するようなゲームにはとても便利です。パーシステント・オブジェクト
の使用が強力な手段ですが、エラーを起こしやすいものです。
19.3 親オブジェクト
各オブジェクトは親がもてます。親がいると、その親の特徴を継承します。つまり、親の特殊
なタイプのものになります。たとえば、ball1、ball2、ball3 および ball4 異なるスプライトをもつ
四つのボールに同じ動作を設定したいとき、ball1 を他の三つの親にして使います。すると、
ball1 だけのイベントを設定すればよいです。他の三つは親から同じ動作を受け付けます。こ
れは大きな手間を減らします。
オブジェクトは数多くの特徴を他のオブジェクトと共同してその他は多少だけ異なる場合
もよくあります。たとえば、一つのモンスターが上下で動きもう一つは左右で移動します。動き
以外動作が同じです。このケースでは、ほとんどのイベントは同じになるが、一つか二つだけ
異なります。この場合でも一方を他方の親にします。しかし、子供のオブジェクトに幾つかのイ
ベントを別途設定します。これらのイベントは親のイベントを上書きします。このため、子供で
共通のイベントが発生したとき親のアクションではなく子供のアクションが施されます。親の
継承のイベントも実行したいときは、子供から該当のアクションで呼んで用います。このよう
な場合は、たとえば ball0 の基本オブジェクトを作り、デフォルト動作をもたせるが、ゲームに
使用しません。実際に使用するオブジェクトはこのオブジェクトを親にすることがよく使われる
手段です。
親オブジェクトは親をもつことができます(サイクルが許せません)。このようにオブジェクト
の階層が作れます。この特徴を使えばゲームに構造をもつことができます。できるだけこの仕
組みを学んで使ってもらいたいです。
親オブジェクトのもう一つの使い方があります。親オブジェクトがコリーションイベントも継
承します。これは一つの例で説明します。まず、四つのフロアー(表面、床)・オブジェクトがあ
ると仮定しましょう。ボールがフロアーにぶつかると、方向を変えます。これはボールのコリー
ション・イベントに設定しなければなりません。四つの異なるフロアーがあるため、コードを四
つの異なるコリーション・イベントに置かなければなりません。しかし、一つのフロアーを他の
三つのフロアーの親にすると、このフロアーとのコリーション・イベントだけ設定すればよいで
す。他のフロアーのコリーションはこれを継承し、同様に動作します。これは、大きなコピー作
業の節約につながります。
上記に説明したように、オブジェクトを使用すると、その子孫も使用されます。これは、アク
ションで特定のインスタンスにそのアクションが適用されるときにも有効です。これも with()文
をコードで使用するときにも同様です(後述を参照)。また、このことは
60
instance_position、instance_number の関数を呼び出すときにも有効です。さらに、オブジェク
トの変数を参照するときにも有効です。たとえば、上記の ball1.speed を10に設定すると、その
設定は ball2、ball3、および ball4 にも有効です。
19.4 マスク
二つのインスタンスが衝突すると、コリーション・イベントが生じます。二つのインスタンスが
交わるかを判断するためにそのスプライトを使います。ほとんどのケースにはこれはよいです
が、衝突を異なる形で決めたいことがあります。たとえば、イソメトリックなゲームにはオブジェ
クトに 3D(3次元)外観をもたせるために高さをもっています。しかし、コリーションには、スプ
ライトのベースだけが使いたい。これは、コリーション用のスプライトを作成すれば実現できま
す。このスプライトをオブジェクトのコリーション・マスクといいます。
19.5 情報
Show Information のボタンで該当のオブジェクトの情報がすべて表示されます。これは
印刷が可能です。これは、オブジェクトのアクションとイベントについて知りたいときに特に便
利です。
61
Chapter 20 もう少しルームについて
ゲーム・メーカーのルームが数多くのオプションがあります。第13章で最も重要なものの
みをみてきました。この章ではその他のオプションについて述べます。
20.1 アドバンス・設定
Settings タブでみていないものが二つあります。まず、Persistent のチェック・ボックスがあ
ります。通常、ルームから出て、その後再びそのルームに戻るときは、ルームは初期状態で再
開始されます。ゲームに色々レベルがあるときは問題がないが、RPG(Roll Play Game)の場
合は、これは望ましくない特徴です。このタイプのゲームのとき、ルームが出た状態のままで
ないとだめです。ルームの Persistent のチェック・ボックスをチェックすると、ルームの状態が
保持されます。ゲームをリスタートしない限りルームは初期状態に戻りません。これはオブジ
ェクトにも適用されるが、別の設定でオブジェクトをパシステントにすると、オブジェクトのイン
スタンスはルームに残らなくて次のルームに移動されます(第19章を参照)。
第二は、Creation code のボタンがあります。これでプログラムの一部分を GML で記入す
ることができます(後章を参照)。このプログラムがルームの開始時に実行されます。これは、
たとえばルームの幾つかの変数の初期化やインスタンスの生成等を行うには便利です。他
のルームに移動ときに起こることが理解すると便利です。
・ まず、(出る)ルームのすべてのインスタンスにルーム終了のイベントが発生します。ノ
ン・パシステントインスタンスが取り除かれます(ただし、破壊イベントが発生しませ
ん)。
・ 次に、前のルームのパシステント・インスタンスが移動先のルームに追加されます。
・ 新インスタンスが生成され、クリエーション・イベントが発生します(ルームがパシステ
ントでないとき、まだは訪ねられていないとき)。
・ ルームが最初のルームの場合は、すべてのインスタンスのゲーム・スタート・イベント
が発生します。
・ 次いで、ルームの生成コードが実行されます。
・ 最後に、すべてのインスタンスのスタ−ト・ルーム・イベントが発生します。
このように、たとえばルーム・スタート・イベントはルームの生成コードで設定された変数の値
を使ったり、この生成コードで(移動先)ルームの(新とパシステント)インスタンスを参照し
たりすることができます。
もう一つのオプションがあります。環境設定でそのオプションが有効であれば、インスタン
ス上の右クリックでメニューを表示させることができ、その項目でインスタンスを削除したり、
深さでその表示順序を変えたり、コードを作成したりすることができる。このコードはルーム
がスタートするときに、インスタンスのクリエーション・イベントの前実行されます。これはイン
スタンスの設定行うときに便利です。
20.2 タイレッドなバックグランドの作成
タイレッドなバックグランドも作成できます。これらの使用ニーズは、数多くのゲームにとて
も美しいバックグランドが使いたいことにあります。たとえば、迷路ゲームの壁が美しくマッチ
ングすることが必要です。また、プラタフォーム・ゲームにはプラタフォームや、木等が美しく見
せたいです。ゲーム・メーカーでは色々なオブジェクトを定義してルームを構成することができ
ます。しかし、これは大きな仕事であり、たくさんの資源を使用し、ゲームを遅くします。たとえ
ば、きれいな壁の迷路ゲームを作成には 15 種類に近い異なる壁類のものが必要です。
壁のような静的なオブジェクトがバックグランドに描画することが数の多くのゲームに使わ
れている技です。バックグランドに描くと、この場合はゲームの役は壁にぶつかったことはどう
やって分かると疑問に思うでしょう。トリックは、次の通りです。きれいな(壁の含む)バックグ
ランドを一つ使い、壁のオブジェクトもう一つ用意してバックグランドの壁の位置に配置して
からこのオブジェクトを透明にします。すると、ゲームのとき、きれいなバックグランドだけ写り、
ゲームの他のオブジェクトがちゃんと壁などに反応します。
このテクニックは動きのないまたは変形しないいずれのものに使用できます(アニメイテッ
ドオブジェクトに適用できません)。プラタフォーム・ゲームには通常バックグランドが一つと壁
オブジェクトが一つだけ必要になりますが、芝生を、または木の枝を歩くようなきれいなバッ
クグランドがゲームに使えます。
62
ルームに幾つかのタイルを追加するために、まずタイルの含むバックグランドをゲームに追
加しなければなりません。少数がゲーム・メーカーと一緒に提供されています。タイルを半透
明にしたいときは、バックグランドイメージを必ず透明にしておいて下さい。
タイレッドなバックグランドを作成するために、ルームの定義時に Tiles タブを押します。する
と、次のフォームが現れます(実はこのフォームに既に幾つかのタイルが追加しました)。
左上に使うタイルのセットが見えます。セットを選択するために、その下のメニュー・ボタン
で該当のバックグランドが選択できます。タイル・セットの下のもので幾つかの設定が変えら
れます。タイルの高さと幅、およびタイル間の距離(通常 0 か 1)を設定することができます。
バックグランド・イメージにタイルを置くために、まず左上からタイルを選択して、右のルー
ムの目的位置に左クリックします。タイル配置はインスタンスの配置と全く同じです。配置位
置にあったタイルは通常削除されます。下にあるものを削除したくない場合は、Delete
underlying のチェック・マークを外して配置操作を行います。右ボタンでタイルを削除します。
マウスの右クリックでもタイルが削除できます。左には、すべてのタイルを削除するボタンもそ
れらをシフトするボタンもあります。
左にある Foreground tiles ボックスをチェックすると、配置されるタイルは最前面に描画さ
れます。これは色々な用等があります。チェックしたまま削除を
行うと最前面にあるものだけ消去されます。
タイルの使用は強力な特徴であるため、できる限りこれを使
いましょう。オブジェクトの使用より高速で、タイルが一度だけ
保存されますので、小さな容量しか要求しない大きなルームを
使用することができます。
20.3 ビュー
最後に、Views のタブがあります。これは、ルームの幾つかの
部分がスクリーンの色々なところにドローイングできるようにす
る仕組みです。ビューの使用は多様です。まず、ゲームによって
ルームの一部分だけを見せたい場合があります。ほとんどのプ
ラタフォーム・ゲームではルームのビューは主人公に会わせて
変わります。プレイヤーが二人の場合は、各プレイヤーを別々の
画面に見せたいことがよくあります。もう一つの使用では、画面
の一部分は主人公に付いて変わりますが、もう一方は、固定
63
(ステータスのような画面)です。このようなことはゲーム・メーカーでは容易に実現できます。
Views のタブを押すと、この左にある画面が現れます。
画面の上部に Enable the use of views のボックスがあります。ビューを使うためにこのボック
スをチェックします。その下に、定義できる8つのビューがリストに表示されます。まず、ビュー
はルームがスタートするとき表示するか否かを指定します。必ず、少なくとも一つのビューを
示すように設定してください。表示可能なビューはその名前が太字でリストに出ます。次に、
ビューに表示するルームの領域(面積)を指定します。一番左上の位置、幅、および高さを設
定します。その下の欄で、スクリーン上のビューの位置を指定します。
上記に説明したように、ビューに特定のオブジェクトを追跡させたいことが度々あります。
対象のオブジェクトを一番下にある欄で指定します。オブジェクトが多数のインスタンスをも
つ場合は、最初のインスタンスだけ追跡されます(コードで特定のインスタンスを指定するこ
とができます)。通常、ある程度ビュー変更無しでキャラクターが移動できなければなりませ
ん。キャラクターがビューの境に近づくと、ビューが変わるはずです。オブジェクトの回りに写
る範囲を指定することができます。また、ビューの変更速度も指定できます。これは、キャラク
ターがスクリーンの外を歩いてしまうが、ゲームのプレイがよりスムースに行われます。ビュー
が一瞬に変更させたいときは−1を使います。
64
Chapter 21 パス
よりアドバンスなゲームにはインスタンスに特定のパス(経路)を辿らせたいこ
とがある。これは、タイマー付きイベントやコード等で可能ですが、困難な作業で
す。パス・リソースがそれより容易な手段です。アイデアが簡単です。パスをその
経路の描画で定義します。次に、該当オブジェクトの生成イベントにオブジェクト
が経路を通るようなアクションを加えます。この章はこれを詳細に説明します。現
在の仕組みは簡単なものです。将来のバーションでより高度なものになるでしょう。
21.1 パスの定義
パスをゲームに追加するために Add メニューの Add Path を選択します。すると、次のフォ
ームが現れます(この画面例では既にパスが描画されています)。
左上にパス名を記入するための欄があります。すぐその下にパスを定義する座標値の対
があります。各点が位置を示す値と速度(sp)の値があります。位置は絶対的なものではあり
ません。後述に示すようにインスタンスが最初の位置からスタートして経路を通ります。速度
は次のように解釈します。100 の速度はインスタンスの現行の速度を表します。それより小さ
い値は減速を意味します。100 以上の値は加速で、現行の速度に対するパーセントを表しま
す。速度は点と点の間のそれぞれに対応する速度の中間値を使います。つまり、ある速度の
点から異なる速度の点に至るまで速度が少しずつ変わります。
点を追加したいときは Add ボタンを押します。すると、位置と速度を設定できます。リスト
の点をクリックすると、その値が変更できます。現在の点の前にもう一つの点を追加するとき
は、Insert ボタンを押します。点の削除は Delete ボタンで行えます。Clear ボタンでパス全体
を消去することができます。
フォームの右に実際のパスが表示されます。マウスでもパスを変更することが可能です。そ
の領域に左クリックすると、パスの変更が可能となります。現行の点にクリックするとドラッグ
でその位置が変えられます。<Shift>キーを押しながら左クリックで点を追加することができま
65
す。最後に、右クリックで点が削除できます(ただし、このような操作で速度が変えられませ
ん)。
パスの辿り方に二通りで影響を与えることが可能です。第一は、パスの接続線で形を変え
ます。直線(Straight lines)か、あるいはソフトな線(Smooth curve)を選ぶことができます。第
二は、最後の点に辿り着いた(action at the end)ときにどうするかが指定できます。オプション
が幾つかあります。最も使用されるのは最初の点に移動して経路を完成させることです。動
きをパスの終点に停止させることもでき、パスの始点にジャンプすることもでき、終点から逆
方向にパスを辿らせることもできます。最後のオプションが現在の位置からパスを再スタート
します。通常、このオプションを使うと、パスが消えるようになります。最初の五つのやりとりが
示されますが、パスがその後続きます。
21.2 オブジェクトにパスの割り当て方
パスをオブジェクトのインスタンスに割り当てるために、そのインスタンスの一つのイベント
にパス・アクションを加えることができます。たとえば、クリエーション・イベントに追加できます。
パス・アクションのドロップ・ダウン・メニューで使用するパスを指定します。アクションの設定
で他の二つの値が指定できます。パスの実行速度がその一つです(通常の速度設定と同様
なものです)。この速度はパスを定義するときに基準となる速度です。もう一つのは、パスの
スタート点の指定です。0の値はスタート点を意味します(通常のケース)。1の値は終点を指
します。つまり、再スタート前の点です。たとえば、逆戻りのときは方向を変える時にその値は
0.5 になります。
スクリプト、またはコードを使うとより高度なパスの実行制御ができます。これに影響を与
えるのは四つの変数です。path_index の変数はパスのインデックスを表します。path_position
の変数はパス上の現在位置を表します(上記に説明したように0と1の間の値です)。この変
数の値は、インスタンスの動きと共に変わります。速度は通常の speed 変数で表します。方向
の示す direction 変数は自動的にパスの辿るときの方向を示すように変更されます。たとえ
ば、この変数を使えば該当のサブイメージを選択することができます。path_scale の変数でパ
スをスケールすることができます。1 の値は現行のサイズを意味します。1 より大きい値はパス
を拡大し、1 以下の値はパスを縮小します。逆時計回りの度数で path_orientation の変数は
パスの実行時の方向を指定します(時計逆回りの角度で)。つまり、左右の向きだけでなく上
下の方向でもパスを辿ることが可能になります。
インスタンスはパスを辿っているときに他のインスタンスと衝突すると、何か起こるでしょう
か。まず、衝突のイベントが発生し、実行されます。他のインスタンスが固体であればパスのイ
ンスタンスが止まります(衝突イベントが定義されている場合)。しかし、path_position の変数
はパスを辿り続けます。ですから、いつかにある方向のパスについたときにはその方向にイン
スタンスが再び動きだします。
21.3 パス・イベント
上記に説明したように、インスタンスが終点に辿り着いたときどうするかを指定することが
できます。このときは End of Path イベントが起こります。このイベントは Other(その他の)イ
ベントのところにあります。ここにもアクションを割り当てることができます。たとえば、そのとき
インスタンスを破壊したり、新しい(異なる)パスを辿らせたりすることが可能です。
66
67
Chapter 22 タイム・ラインス
数多くのゲームに色々な事柄が特定の時刻に起こらなければなりません。アラーム・イベ
ントを使えば、これが実現できますが、複雑なゲームでは困難な作業になります。タイム・ライ
ン・リソースはこれを解決するためのものです。タイム・ラインでどのアクションが何時に起こ
るかを指定することができます。他のイベントに使用できるアクションすべてが使用可能です 。
タイム・ラインを作成すると、その後それをインスタンスに指定することができます。指定され
たインスタンスがタイム・ラインに従ってアクションを起こします。これを一つの例で説明しまし
ょう。ガードマンを作成したいと仮定しましょう。このガードマンが20ステップ間に左に、そして
10ステップに上に、次いで20ステップに右に、最後に10ステップに下に動いて止まるものと
します。これは、タイム・ラインを作って、このタイム・ラインのスタートの後に左に移動するため
のアクションを指定、ステップ20に移動は上に設定、ステップ30に移動は右に、ステップ50
に移動は下に、ステップ60に止まるように設定して、ガードマンに割り当てれば実現できます 。
ゲーム全体を制御するためにタイム・ラインを用いることができます。このため、まず透明のコ
ントローラーを作成します。次いで、(たとえば)敵を特定の間隔で生成するタイムラインを作
成します。最後に、これをコントローラーに割り当てる。タイム・ラインを使用すると、強力な手
段であることが分かるだろう。
タイム・ラインを作成するときは、Add メニューから Add Time Line を選択します。
すると、次のフォームが現れます。
オブジェクトのプロパティ・フォームに似ています。フォームの左にタイム・ラインの名目を設
定します。そこにもタイム・ライン編集用の幾つのボタンがあります。その右に、ステップ単位
の時刻のリストがあります。各時刻にアクションを割り当てることができます。一番右に通常
のアクション・タブ集があります。
自己クリストに新たな時刻を追加するために、Add のボタンを押します。その次に、タイム・
ラインのスタートからのステップ数を指定します。オブジェクトのイベント・リストに行ったよう
にその時刻にアクションを割り当てることができます。選択した時刻を Delete ボタンで削除す
ることができます。Change ボタンで時刻が編集できます。Clear ボタンがタイム・ライン全体を
削除します。
最後に、特別なボタンが2つあります。Merge ボタンである間隔内の時刻を一つにすること
ができます。Shift ボタンである間隔内の時刻すべてを幾つかのステップで移動することがで
きます。ただし、否定の時刻を作ってしまうと、その時刻のアクションが実行されません。
68
タイム・ラインに関連の2つのアクションがあります。
69
Chapter 23 スクリプト
ゲーム・メーカーにはビルトイン(組み込み)プログラミング言語があります。ゲーム・メーカ
ーになれてよりフルに使いたいときこの言語を学んでください。詳細な説明は第28章にあり
ます。この言語の使い方は二通りあります。第一は、スクリプトが作成できます。スクリプトは、
名前をもつ短いコード(命令のまとまり)です。リソース・ツリーに表示され、ファイルにセーブ
したり、ファイルからロード(読み出し)したりすることのできるものです。スクリプトは、ライブ
ラリを構成してゲーム・メーカーの機能拡張に使えます。第二の使い方では、イベントにコー
ド・アクションを付けてそこにコードを記入することができます。コード・アクションの追加はス
クリプトの追加とほぼ同じですが、コード・アクションは名前をもたないし、引数が使えません。
また、対象オブジェクトを指定するための欄をもっています。コード入力は両方の使い方には
同様ですので、この章ではスクリプトを中心に説明を行います。
上記に説明したようにスクリプトは、GML のプログラミング言語のコード(命令のまとま
り)で、特定のタスク(仕事)を行うコードです。スクリプトは幾つかの引数をもつことができま
す。イベント内でスクリプトを実行したいときはスクリプト・アクションを使用することができま
す。このアクションで対象のスクリプトと最大5つまでの引数を指定します(コードからもスク
リプトが実行でき、このとき引数の数は16個までとなります)。スクリプトが値を返すこともで
きますので、関数のように他のアクションで値を提供するものとして使えます。
ゲームにスクリプトを追加するときは、Add メニューの Add Script を選択します。すると、
次のフォームが現れます(この例では、既に二つの引数を掛けて、その結果を返す小さなスク
リプトが書いてあります)。
(これはゲーム・メーカーの組み込みエディタです。環境設定で他のエディタの使用が可能
です)。トップの右には、スクリプトの名前欄があります。下の枠にはスクリプトを記入します。
スクリプトのセーブやロードやコピー・ペスト用の幾つかのボタンもあります(マウスの右クリ
ックで他のコマンドが使用できます)。
・ 多数の「元に戻す」、「繰り返し」があり、キー毎またはグループで使用できます(設定
は環境設定で変更できます)。
・ 自動インデントで文章が前の行のと合わせられます(これも環境設定で変更できま
す)。
・ 自動タッビングで前の行の空白でない位置までタブが可能です(これも環境設定で
変更できます)。
・ <Ctrl> I で選択した行をインデント、<Shift><Ctrl> I でアンインデントすることができ
ます。
・ カットとペスト
・ 検索と置き換え
・ <Ctrl>とアップ、ダウン、ページ・アップ、ページ・ダウンでカーソルの位置を変えずにス
クロールすることができます。
70
・ F4 でカーソルの位置にあるスクリプト若しくはリソースが開けます(ただし、この機能
はスクリプトのみで有効です。コードアクションで機能しません)。
・ スクリプトをテキスト・ファイルとして保存することができます。
また、スクリプトが正しいかどうかをテストするためのボタンもあります。すべてテストされ
ないが、文法および使用されている関数の存在がチェックされます。
気が付いたと思いますが、スクリプトの文は色々な色で表示されています。エディターはオ
ブジェクトや、組み込み変数、関数等について既に情報を集めております。この色分け表示は
ミズ発見などに非常に役に立ちます。ミス・タイプや要約語を変数名にの誤使用などがすぐ
に目で発見できます。しかし、この色分け表示は少々遅いです。ファイル・メニューの
(preferences)初期設定でこれをオフにすることができます。そこでも使用色の設定もできます
(設定に誤った場合は、F12 を2回押してください。これでオン・オフの切り替えができます)。
また、スクリプトおよびコードに使用のフォントを変更することができます。
ゲーム・メーカーの機能を拡張するにはスクリプトはとても有効です。しかし、スクリプトを
正確に作らなければなりません。スクリプトをライブラリに保存してゲームに追加することが
できます。ライブラリをインポートするとき、ファイル・メニューの Import scripts 項目を使いま
す。スクリプトをライブラリとしてセーブするとき、Export scripts の項目を使います。スクリプ
ト・ライブラリはテキスト・ファイルです(ただし、拡張子は.gml です)。特別な構造をもってい
ますので、直接に編集しないでください。役に立つ幾つかのライブラリは提供されています
(無駄な時間を省くために、インポート後使用しないスクリプトを削除してください)。
スクリプトの作成がミズし易い作業です。必ず、テスト・ボタンを使用してください。エラー
があるとき、これが知らされ、エラー・タイプとその位置が表示されます。より厳密なチェックを
行いたいときは、ゲームをデバッグ・モードで実行することができます。このとき、次に示す色々
な情報を表示するフォームが現れ、色々な値を監視することができます。Run メニューで一時
的にゲームを停止することができます。また、同メニューでステップ毎に実行が可能です。さら
に、ゲームのリスタートもできます。Watch メニューで式の値を観察することができます。Add
を使えば、ゲームの各ステップに表示したい値の式を記入することができます。このようにゲ
ームが正常に実行されているかどうかチェックできます。数多くの式を同時に観察することが
できます。また、ゲームに訂正を加えた後でも使用した式を再使用のために保存することが
できます。このフォームの Tools メニューに他の情報を観察するために色々な項目があります。
ゲームのすべてのインスタンスのリストをみることができます。すべての広域な(グロバール)
変数(実は最も重要なもの)の値もみることができます。また、インスタンスの局所的な(ロカ
ル)変数の値も観察できます(このためオブジェクト名、あるいはインスタンスの id を使いま
す)。
71
コードから送られるメッセージも show_debug_message(str)関数でみることができます。最後
に、ゲームにコマンド(命令)を与えたり、実行速度を変えたりすることができます。複雑なゲ
ームを作るときはこれらのデバッグオプションをマスターしましょう。
72
Chapter 24 データ・ファイル
高度なゲームには他の補助ファイルを使用しなければなりません。その中には、たとえば、
特徴を定義するファイル、ゲーム中にロードしたいバックグランドやスプライトを含むファイル、
ムービー・ファイル、DLL ファイル(後述を参照),若しくは自分のフォントなどがあります。これ
らのファイルがゲームと一緒に配布できますが、ゲームに組み込んだ方がよいでしょう。この
ために、データ・ファイルのリソースが使用できます。データ・ファイルのリソースは、ただ単に
ファイルの内容を保存します。ゲームの開始時にこのファイルはディスクに書き込まれ、ゲー
ムで使用可能になります。
このリソースにも名前を与えることができます。該当ファイルをリソースに割り当てるために
Load Data File のボタンを使います。保存名も選択できます(ここでは、パスの指定は許され
ません)。その次に、ゲーム開始時に該当ファイルどう使うかを指定します。
Don’t Export ファイルをエスポートしない(GML にはエスポート用の関数がありま
す)。
To Temporary Folder ファイルはゲームの一時的なフォルダーに書き込まれます。こ
れは、特にバックグランドなどを使用するときに便利です。
To Working Folder ファイルはゲームの実行用のフォルダーに書き込まれます。色々
なルーチンはそこでファイルを探しますが、プレイヤーが読み出し専用の媒体を使用
するときは注意が必要です。
Install a Font 該当のファイルはフォントであれば、このオプションが選択できます。フ
ァイルは一時的なフォルダーに書き込まれ、ゲームで使用するためにその後フォントと
してインストールされます。
最後に、3つのオプションがあります。
Free Data Memory チェックされると、ファイルをエスポートした後に、そのメモリが解
放されます。これはメモリの節約に繋がりますが、該当のリソースは関数から使用不
能になります。
Overwrite the File チェックされると、既存のファイルは上書きされます。
73
Remove at Game End チェックされると、ゲーム終了時にファイルは取り除かれます
(一時的なフォルダーのファイルすべてがゲーム終了時常に取り除かれることに注意
しましょう)。
エスポートを行うときはエラーがあってもゲームが実行されます。しかし、このとき該当のファ
イルかフォントか使用不能になります。
データ・ファイルは大きなメモリを閉めるが、エスポートが高速です。
74
Chapter 25 ゲーム情報
よくできているゲームは、必ずプレイヤーにゲームの遊び方について情報を提供します。こ
の情報は、プレイヤーがゲーム中に<F1> キーを押したとき表示されます。この情報を作成す
るために、スクリーンの左にあるリソース・ツリーの Game Information をダブル・クリックしま
す。小さなビルトインのエディターが起動され、ゲーム情報が編集できます。色々なフォントや、
色や、スタイルを選択することができます。バックグランド色の選択も可能です。
情報を短くて、正確に書きましょう。ここにもあなた、作者の名前も書きましょう。提供されて
いる例題ゲームにはこの情報ファイルがあり、ゲームの作成についても触れています。
よりきれいな資料を作りたいときは、たとえばワードを使いましょう。作成後コピー・ペスト
でゲーム情報のエディター・ウインドウに入れましょう。
75
76
Chapter 26 ゲームのオプション
ゲームに変えられる色々なオプションがあります。リソース・ツリーの Game Options 項目
をダブル・クリックすると、これらのオプションが表示されます。オプションがタブ持ちのページ
毎に分類されています。
26.1 グラフィックス・オプション
このタブでゲームのグラフィカルな外観に関連のオプションを設定することがで
きます。これらの設定がゲームの表示を左右するので必ずこれらのオプションをチ
ェックしておきましょう。異なるユーザが異なる機械を使用しますので、できるだ
けこれらの設定を色々な機種で動作確認しましょう。
77
Display the caption in fullscreen mode
チェックされると、フル・スクリーンのモードではトップの左の白いボックスにルームのカプ
ション、スコアー、およびライブ数が表示されます。これをオフにすることができます。通常これ
らの情報を自分でルーム内に配置・表示すると、よりきれいにできあがります。
26.2 解像度
このタブでゲーム実行時にの解像度を設定することができる。
26.3 キー・オプション
Let <Esc> end the game
チェックされると、Esc キーが押されると、ゲームが終了します。アドバンス・ゲームはゲーム
を終了する前に(セーブ等の)処理を行うため、これは望ましくない特徴です。この場合は、こ
のオプションを外したままにして、Esc キーにはアクションを与えてください(ウインドウの×にク
リックすると、Esc キー・イベントが発生します)。
78
Let <F4> switch between screen modes
チェックされると、F4 でフル・スクリーンとウインドウ・モードの切り替えが行われます(排他
的モード以外のときのみ)。
26.4 ロード・オプション
ゲームをロードするときに起こるべきことがこれらのオプションで指定できます。まず、ロー
ディング・イメージを指定することができます。第二は、イメージの下にローディング・バーを表
示するかどうかが指定できます。この設定では、ローディング・バーなし、デフォルトのローディ
ング・バー使用、またはローディング・バーのバックグランドとフォアーグランドのイメージのい
ずれか一つ選ぶことができます(最後のでは両方のイメージの指定が必要です)。第二は、ゲ
ームのアイコンが指定できます。使用可能なアイコンは 16 色、32×32 のものだけです。これ以
外の特徴のものを設定すると警告が現れます。
最後に、第三のではゲームの唯一の id 番号が変えられます。この id はスコアー・リストお
よびゲーム・ファイルの保存に用いられます。ゲームの新バーションを作成するときは、古い
得点リストを参照したくないときこの番号を変えましょう。
26.5 エラー・オプション
エラー報告に関連のオプションをこれで設定できます。
26.6 情報のオプション
ここではゲームの制作者、ゲームのバーション、また他の情報を指定することができます。
また、最新の更新日も記述します。これは他数人でゲームを開発するときは便利です。ゲーム
の実行時にこの情報にはアクセスすることができません。
79
80
Chapter 27 速度の考慮
複雑なゲームを作成しているなら、高速に実行できるようにしたいでしょう。ゲーム・メーカ
ーはできるだけ高速にゲームを実行できるようにするが、大きな部分はゲーム設計に依存し
ます。また、メモリをたくさん使用するゲームを簡単に作ります。この章ではゲームを小さくし、
若しくはゲームを高速にする幾つかのヒントについて述べます。
まず、よく使うスプライトおよびバックグランドについて考えてください。アニメイテッド・スプ
ライトは多くのメモリを占めるし、多数のスプライトの描画はたくさんの時間がかかります。こ
のため、できるだけスプライトを小さくしましょう。スプライトの周辺にある透明領域を削除し
ましょう(スプライト・エディターにはそのコマンドがあります)。ビデオ・メモリに保存するスプ
ライトと使用時にロードするものを真剣に選びましょう。バックグランド・イメージにも同様な
配慮が必要です。特に大きなバックグランドはビデオに保存しないで、使用時にロードしまし
ょう。バックグランドを使用のときバックグランド色をオフにしましょう。
フル・スクリーン・モードあるいは排他的モードを使用するときはルーム(ウインドウ)・サイ
ズはスクリーン・サイズより大きくならないように設定しましょう。ほとんどのグラフィクス・カー
ドはスケール・アップがよくできるがスケール・ダウンは遅いです。スプライト以外に他のもの
の描画を避けましょう。これはとっても遅いです。どうしても必要であれば、それらを引き続き
に描画させましょう。最後に、できる限りカーソルをオフにしましょう。カーソルの表示はグラフ
ィクスを遅くします。ビューの数にも気を付けましょう。ビュー毎にルームが再描画さ
れるからです。
グラフィクスの他に速度に影響を与えるものもあります。インスタンス数をできるだけ小さ
くしましょう。特に、インスタンスが要らなくなったときすぐに削除しましょう(例:ルームを出た
インスタンス)。特に、インスタンスのステップ・イベント、またはその描画イベントに多数の仕
事の実行を避けましょう。ほとんどの場合は、数多くのことをステップ毎にチェックしなくても
よいです。コードの実行はインタプリタで行うため、やや遅いです。また、幾つかのアクション
および関数の実行が時間がかかります。特に、すべてのインスタンスをチェックするものは遅
いです(たとえば、弾むアクション)。
コリーション・イベントの処理をどこで行うかについてよく考えましょう。通常、二つの選択
があります。コリーション・イベントのないオブジェクトは処理が早いです。このため、インスタ
ンス数の少ないオブジェクトで処理しましょう。
大きなサウンド・ファイルを扱うときは気を付けましょう。大きなメモリを占めるし、圧縮も悪
いです。サウンドを見てサンプリング・ダウンできるかを検討しましょう。
最後に、数多くの人がプレーできるゲームを作りたいとき、小さな機械でも必ずゲームのテ
ストを行いましょう。
81
82
Chapter 28 ゲーム・メーカー言語 (GML)
前に述べたようにゲーム・メーカーにはビルトインのプログラミング言語があります。この
プログラミング言語ではアクションより柔軟な操作と制御が得られます。以下ではこの言語
を GML(Game Maker Language)と読んで使います。色々な場所にはこの言語で書かれたプ
ログラムが使えます。まず、スクリプトの定義に使います。スクリプトは GML のプログラムで
す。第二は、イベントにコード・アクションを加えるときに使います。コード・アクションには
GML のプログラムを提供しなければなりません。第三は、ルームのクリエーションコードに使
用されます。最後に、アクション内の値を設定しなければならいとき、GML で書かれた式が
使えます。式は完全プログラムではないが、値を生成するコードの一部分です。
この章では GML のプログラムの基本構成について述べます。GML のプログラムを使い
たいときには、二つのことに注意しなければなりません。まず、すべてのリソース(スプライトや、
オブジェクトや、サウンド等の)名に文字で始まり、文字、数字および下線「_」しかから成らな
い名前を使わなければなりません。このような名前を使わないとプログラムから参照したり
することができなくなります。また、名前には self、other、global、または all を使ってはいけませ
ん。GML ではこれらの語は特別な意味を持っています。さらに、下に示す予約語が使えませ
ん。
28.1 プログラム
プログラムはブロックで構成されています。ブロックは、「{}と「」」で囲まれた一つ以上の
文(statement)からなっています。文を「;」で区切って書きます。このため、いずれのプログラ
ムも構成が次のようになっています。
{
<statement>;
<statement>;
…
}
色々な文があり、これらについて次に述べます。
28.2 変数
他のプログラミング言語と同様に GML は変数を用います。変数は、メモリの場所であり、
値を格納します。変数は名前を持ち、変数を参照するときはその名前を用います。変数は実
数か文字列の値を格納します。他の言語と異なり、GML では変数の宣言は不要です。数多
くの変数は既に定義され、組み込み(ビルトイン)変数として扱います。マウスの位置を示す
mouse_x と mouse_y のようなグローバル(広域的)なものがあります。また、プログラムの実
行でオブジェクトのインスタンスに局所的に使われ、x と y のようにインスタンスの位置を示
す変数もあります。変数は名前を持ち、その名前は文字で始まり、文字、数字および下線「_」
しかからならないものでなければなりません(最大文字数は 64 個です)。新しい変数を用い
ると、現在のインスタンスに局所的で、他のインスタンスのプログラムでは参照できません
(同オブジェクトのインスタンスでも使用不能)。しかし、下に説明するように他のインスタンス
の変数の参照を可能にすることができます。
28.3 代入文
代入文は式の値を変数に与えます。代入文は次の書式をもっています。
<variable> = <expression>;
83
代入だけでなく、変数に自分自身とある値を+=で足したり、-=で引いたり、*=で掛けたり、
/=で割ったりすることができます。また、ビット演算子で、|=、&=、および ^=を使用できます。
28.4 式
式は、実数(3.4 等)や、「‘」あるいは「“」で囲まれた文字列(’hello’または”hello”等)や、
複雑な式などのものです。式のために次の2進(真偽の値しかとれない)演算子があります
(優先順位で)。
次の単一演算子もあります。
! : 否定、真を偽に、偽を真に反転します
- : 直後に書く値を否定します
~ : ビット単位で(ビット)反転を行います
値として、数字や、変数や、値を返す関数などが使えます。サブ式が大カッコで囲めます。す
べての演算子は実数に適用できます。比較は文字列にも使えます。プラス「+」は文字列の
結合に使います(通常の言語と異なり、GML ではブール項目すべてが評価されます)。
Example
幾つかの参考になる代入文の例を次に示します。
{
x = 23;
str = 'hello world';
y += 5;
x *= y;
x = y << 2;
x = 23*((2+4) / sin(y));
str = 'hello' + " world";
b = (x < 5) && !(x==2 || x==4);
}
28.5 その他の変数
新しい変数がその変数に値を与えることで生成されます(宣言は不要です)。変数名を使
うと、変数は現在のオブジェクトのインスタンスと一緒に格納されます。このため、他のオブジ
ェクト(インスタンス)の使用時には使えません。変数名の前に対象のオブジェクト名とドット
「.」を用いれば、他のオブジェクトの変数を読んだり、設定したりすることもできます。
すべてのオブジェクトのインスタンスから参照できるグローバル変数を生成するには、変数
名の前に global.を付けます。たとえば、そのような変数を次のように書けます。
{
if (global.doit)
{
// do something
global.doit = false;
84
}
}
時々、スクリプト内か現行のコード内の変数のみが望ましい。このような変数はメモリを節
約し、同一名の衝突に起因する問題を排除します。これもグロバル変数より高速です。これを
得るために、キ−・ワード var を用いて、変数をコードの先頭に宣言します。その宣言が次のよ
うなものになります。
var <varname1>,<varname2>,<varname3>, …
たとえば、次のようなものが書けます。
{
var xx,yy;
xx = x+10;
yy = y+10;
instance_create(xx,yy,ball);
}
28.6 他のインスタンスの変数を参照する
上記に説明したように現在のインスタンスに変数を次のように設定することができます。
x = 3;
しかし、場合によっては他のインスタンスの変数を参照したいことがあります。たとえば、ボ
ールすべてを止めたいことがあります。または、主人公を特定の場所に移動させたいことや、
コリーションのとき他方のインスタンスのスプライトを設定したいケースなどがあります。これ
は、対象の変数名の前にオブジェクト名とドットを付ければ実現できます。たとえば、次のよう
に書けます。
ball.speed = 0;
これはすべてのボールのスピードを変えます。幾つかの特別なオブジェクトがあります。
self: アクションの対象は、現在のインスタンスになります
other: 衝突の他方のインスタンス
all: すべてのインスタンス
noone: インスタンスが一つもなく(不要と思われるが後に示すように便利です)
global: インスタンスではなく、グローバル変数の入れ箱です
これらを用いれば、たとえば次のような文が使えます。
other.sprite_index = sprite5;
all.speed = 0;
global.message = 'A good result';
global.x = ball.x;
上記の最後の文は多数のボールのある場合はどうなるかを疑問に思うのでしょうか。実
は、最初のボールの x の値がグローバル変数に代入されます。
しかし、ある特定のボールの速度を指定したいときはどうすればよいのでしょうか。これは、
少々難しいことです。ルームにオブジェクトのインスタンスを配置するときはマウスがインスタ
ンスの上に置くとそのインスタンスの id が表示されます。この id は値が 100000 以上のもの
です。その番号がドットの左に使えます。しかし、気を付けましょう。ドットは数字の小数点と見
なされてしまいます。これを避けるために次に示すように番号を格好で囲んでください。たと
えば、100032 のボールを対象にするときは次のように書けます。
(100032).speed = 0;
85
プログラムにインスタンスを生成するとその呼び出しはインスタンスの id を返します。この
ため、次のようなプログラムは有効です。
{
nnn = instance_create(100,100,ball);
nnn.speed = 8;
}
上記のコードは、一つのボールを作成して、そのスピードを設定します。最初の文(命令)
でインスタンスの id を変数に代入して、その後ドットの前に使いました。これは正しいことで
す。厳密に説明しますと、ドットが実は演算子です。ドットの左に値を、その右に変数(アドレ
ス)を使用します。この演算で指定されたオブジェクトまたはインスタンスの変数のアドレスを
返します。すべてのオブジェクト名、および上記の特別なオブジェクトは値を代表しています
ので、通常の値として扱えます。たとえば、次のプログラムも有効です。
{
obj[0] = ball;
obj[1] = flag;
obj[0].alarm[4] = 12;
obj[1].id.x = 12;
}
28.7 配列
GML では1次元配列および2次元配列が使えます。1次元配列の場合は、インデックスを
中カッコで囲み、2次元配列の場合は、中カッコ内の二つの番号をカンマで区切ります。この
ようにインデックスを使うと、配列は生成されます。配列のインデックスは 0 から始まります。
大きな配列を用いると、大きなメモリを占めますので気を付けましょう。負のインデックスは使
用不能です。本システムでは、インデックスの最大値は、32000 であり、総合の最大の大きさ
は 1000000 です。たとえば次のようなコードを作成することができます。
{
a[0] = 1;
i = 1;
while (i < 10) { a[i] = 2*a[i-1]; i += 1;}
b[4,6] = 32;
}
28.8 If 文
if 文は次の書式があります。
if (<expression>) <statement>
または、
if (<expression>) <statement> else <statement>
上記の文(statement)はブロック(複合文)でもよいです。カッコ内の式が評価され、その
(丸めた)値が 0 以下の場合は、偽(false)と見なされ、else の後の文が実行されます。それ
以外は、式の結果は真(true)と見なされ、条件の後の文が実行されます。大カッコをできる
だけ使いましょう。つまり、次のような書式をお勧めします。
if (<expression>)
86
{
<statement>
}
else
{
<statement>
}
例
次のプログラムはオブジェクトをスクリーンの中心の方に移動します。
{
if (x<200) {x += 4} else {x -= 4};
}
28.9 Repeat 文
repeat 文は次の書式があります。
文(statement)は式で得られた(概数の)値(回数)にしたがって、繰り返して実行されます。
例
次のプログラムは五つのボールをランダムに生成された位置に生成します。
{
repeat (5) instance_create(random(400),random(400),ball);
}
28.10 While 文
while 文は次の書式があります。
カッコ内の式が真である限り文(複合文)が繰り返し実行されます。While を使うときに気
を付けましょう。注意しないと、永遠に繰り返されるものを作成してしまい、ゲームがユーザー
の入力に反応しなくなります。
例
次のプログラムは現在のオブジェクトを空いている場所への移動を試みます(ランダムに
オブジェクトを移動することと同様なものです)。
{
while (!place_free(x,y))
{
x = random(room_width);
y = random(room_height);
}
}
28.11 Do 文
do 文は次の書式があります。
87
カッコ内の式が真となるまで、文(複合文)が繰り返し実行されます。文は少なくもと1回実
行されます。do を使うときに気を付けて使いましょう。注意しないと、永遠に繰り返されるもの
を作成してしまい、ゲームがユーザーの入力に反応しなくなります。
例
次のプログラムは現在のオブジェクトを空いている場所への移動を試みます(ランダムに
オブジェクトを移動することと同様なものです)。
{
do
{
x = random(room_width);
y = random(room_height);
}
until (place_free(x,y))
}
28.12 For 文
for 文は次の書式があります。
次のように説明できます。最初の文(statement1)が実行されます。その次に式
(expression)が評価されます。真であれば、三番目の文(statement3)が実行され、2番目の
文(statement2)が実行されます。その後、再び式が評価されます。これは式が偽になるまで
繰り返して行われます。
これは複雑と思いますが、次のように解釈しましょう。最初の文はループを初期化します。
式はループから脱出するか否かをチェックします。第二の文は次のループの式のチェックに
繋ぐものです。
ある範囲内で繰り返しのカウンタの役割を果たすものとしてよく使います。
例
次のプログラムは 1〜10 の値で長さ 10 の配列を初期化します。
{
for (i=0; i<9; i+=1) list[i] = i+1;
}
switch (<expression>)
{
case <expression1>: <statement1>; … ; break;
case <expression2>: <statement2>; … ; break;
…
default: <statement>; …
}
例
次のプログラムはキーの押されることに反応します。
switch (keyboard_key)
{
case vk_left:
case vk_numpad4:
x -= 4; break;
case vk_right:
case vk_numpad6:
x += 4; break;
}
28.14 Break 文
break 文は次の書式があります。
break
continue
28.16 Exit 文
exit 文は次の書式があります。
exit
この文は、ただ単にプログラムを終了させます(ゲームを終了させません。このため、
game_end();が必要です。以下を参照)。
28.17 関数
関数は、関数名に続くカンマで区切られたゼロ以上の引数からなるものです。
<function>(<arg1>,<arg2>,…)
関数は2種類があります。第一は、ゲームの有りとあり得る側面の制御に用いるシステム
で提供される数多くの組み込み関数です。第二は、ゲームで定義するスクリプトは関数として
使えます。
89
関数が引数が無くてもこれらを囲むカッコを必ず使用します。通常、関数は値を返します
ので、式に用いられます。その他の関数はただ単にコマンドを実行します。関数は代入文の
左に使用できません。たとえば、
instance_nearest(x,y,obj).speed = 0
は書けませんが、
(instance_nearest(x,y,obj)).speed = 0
のように書くべきです。
28.18 スクリプト
スクリプトを作成するときは、引数へのアクセスが望ましいです(スクリプト・アクション使用
のときも、プログラム(または他のスクリプトあるいは同スクリプト)からスクリプトを関数とし
て呼ぶときも、これが望ましいです)。引数の値は、argument0, argument1,
…,argument15 の変数に格納されます。つまり、16 個の引数まで用いることができます(た
だし、アクションからスクリプトを呼ぶときは最初の5つしか使えません)。Argument[0]の
ように呼び出すこともできます。
スクリプトは値が返えせるため、式にも使えます。このとき、次の return 文を使います。
return <expression>
例
この例は引数の二乗を計算するスクリプトの定義を示します。
{
return (argument0*argument0);
}
スクリプトをコードから呼び出すときは、関数を呼ぶときと同様にその呼び出しを行います。
つまり、スクリプト名の後に括弧で囲んだ引数を指定します。
28.19 With 文
上記に示したように、他のインスタンスの変数を読んだり、更新したりすることができます。
しかし、場合によっては、インスタンスを対象にそれ以上の操作をしたい場合があります。たと
えば、すべてのボールを8ピクセル分下の方へ動かしたいことを考えましょう。次のコードで
実現できると考えられます。
ball.y = ball.y + 8;
しかし、これは間違いです。等式の右側では、最初のボールの y 座標だけを取得して、それに
8を加えます。この値は左のすべてのボールの y 座標として代入されます。結果は、すべての
ボールは同じ y 座標を得るだけです。次の文でも
ball.y += 8;
同様なことが行われます。上記の代入文の簡略版だけです。目的の操作を実現するために
次の with 文が大いに役立ちます。この文の一般的書式は次のようになります。
式(expression)では一つ以上のインスタンスを指します。このためインスタンスの id、オブジ
ェクト名(オブジェクトのすべてのインスタンスを対象にしたいとき)、特別なオブジェクト
(all、self、other、noone)を用います。文(statement)は指定された各インスタンスに、現在のイ
90
ンスタンス(self)のように実行されます。このため、すべてのボールを8ピクセル分移動する
ために次のように書けます。
with (ball) y += 8;
複数文を同時に実行したいときは、大カッコで囲みましょう。たとえば、すべてのボールをラ
ンダムに計算された位置に移動させたいときは次の文が使えます。
with (ball)
{
x = random(room_width);
y = random(room_height);
}
with 文の使用は強力です。もう少しその応用例を見ましょう。すべてのボールを破壊する
ために次のように書きます。
with (ball) instance_destroy();
爆弾が爆発して、しかもその近辺にあるインスタンスを破壊したいときは次のコードが使え
ます。
with (all)
{
if (distance_to_object(other) < 50) instance_destroy();
}
28.20 コメント
プログラムにコメントを付けることができます。「//」の後に書かれるものは無視され、内部
では改行の目印として扱われます。多数の行をコメント・アウトしたいときは、該当の行を/*と
*/で囲みます(これを使うと、コロリング(文の類による色づけ)は働くなることがあります。こ
の場合は F12 を押して色づけのやり直しを行いましょう)。
91
92
Chapter 29 計算
ゲーム・メーカーには色々な計算を行うための関数があります。ここでその完全なリストを
示します。
29.1 定数
次の定数があります。
true 1 に等しい
false 0 に等しい
pi 3.1415…に等しい
29.2 実数値の関数
実数を扱う関数には次のものがあります。
93
point_distance(x1,y1,x2,y2) ポイント(x1,y1)とポイント(x2,y2)間の距離を返
します。
point_direction(x1,y1,x2,y2) ポイント(x1,y1)からポイント(x2,y2)への方向を
度で返します。
is_real(x) x は実数か否かを返します(文字列に対して)。
is_string(x) x は文字列であるか否かを返します(実数に対して)。
29.3 文字列を扱う関数
次の関数は文字と文字列の扱いに使えます。
次の関数でクリップボードを使用するテキストの扱いを行えます。
clipboard_has_text() クリップボードにテキストがあるか否かをを返します。
clipboard_get_text() クリップボードにあるテキストを返します。
clipboard_set_text(str) str をクリップボードに設定します。
94
95
Chapter 30 GML: ゲームのプレイ
ゲーム・プレイを定義するために数多くの変数と関数があります。これらは、特にインスタン
スの動きおよびその生成、イベントのタイミングとハンドリング(扱い)に影響を与えます。
30.1 移動
ゲームの重要な側面はオブジェクトのインスタンスの動きです。各インスタンスはインスタ
ンスの位置を示すxとyの組み込み変数をもっています(厳密にいうと、これらはスプライトの
オリジンを指定します)。0,0 はルームの一番左上の角の位置です。このxとy変数の値を変え
ると、インスタンスの位置が変わります。オブジェクトに複雑な動きをもたせたいときはこれら
の変数を使用します。通常この変数の扱うコードをオブジェクトのステップ・イベントに置きま
す。
オブジェクトが固定のスピードと方向で動くときはより簡単な方法があります。各オブジェ
クトが水平速度用の変数(hspeed)および垂直速度用変数(vspeed)をもっています。肯定
の水平のスピードは右方向を意味します。否定の速度は左方向になります。肯定垂直速度
は下への移動を、否定のは上への移動を意味します。このため、一回だけこれらの変数を設
定すればよいです(たとえば、クリエーション・イベントのとき)。こうすれば、オブジェクトのイン
スタンスが固定のスピードをもつようになります。
方向(0〜360 の角度)と速度(肯定のみ)の設定は、もう一つの移動設定方法です。これ
に関連の変数を読んだり、更新したりすることで特定の移動が設定できます(内部でこれは
hspeed と vspeed の値に変換されます)。また、摩擦、引力および引力の方向があります。さ
らに、最後に motion_add(dir,speed)の関数で現在の移動に方向とスピードを加えるこ
とができます。
まとめると、各インスタンスが次の変数と関数あります。
x インスタンスの x の位置(ポジション)
y インスタンスの y の位置
xprevious 前の x の位置
yprevious 前の y の位置
xstart ルーム内の初期の x の位置
ystart ルーム内の初期の y の位置
hspeed 速度の水平の構成分
vspeed 速度の垂直の構成分
direction 現在の方向(0〜360 度、反時計回り、0 は右へ)
speed 現在の速度(ピクセル数/ステップ)
friction 現在の摩擦(ピクセル数/ステップ)
gravity 現在の引力(ピクセル数/ステップ)
gravity_direction 引力の方向(270 は下へ)
motion_set(dir,speed) dir の方向と speed の速度で動きを設定します。
motion_add(dir,speed) 現在の動きに加えます(ベクトル加算のように)。
path_index インスタンスの通っているパスのインデックス。パスのない場合は-1 に
設定されます。
path_position パス上の現在の位置。0 はパスのスタート点、1 は終了点です。
path_orientation パスの通る方向(逆時計回り)。0 は通常の方向です。
path_scale パスのスケール。1 はデフォルトで、パスを大きくにしたい場合はこの値
を増加させます。
数多くの関数で移動を定義することができます。
place_free(x,y) 座標(x,y)はコリーション・フリーであるか否かをチェックして、そ
の結果を返します。これは、通常あるところに移動する前に使用します。
96
place_empty(x,y) インスタンスが(x,y)の座標に置かれたとき、他のオブジェクトに
合うかどうかをチェックして、その結果を返します。このため、チェック対象のオブジェ
クトは非固体のものも考慮します。
place_meeting(x,y,obj) インスタンスが(x,y)の座標に置かれたとき、obj のオブ
ジェクトに合うかどうかをチェックして、その結果を返します。Obj はオブジェクトのとき、
そのインスタンスが(x,y)の座標にあると、真(true)が返されます。Obj はインスタンス
の id でもよいで、特別な all の語を使うといずれのオブジェクトのインスタンスを指し、
other(他の)の予約語も使用できます。
place_snapped(hsnap,vsnap) スナッピング値にしたがって、インスタンスが整列
されているかどうかを返します。
move_random(hsnap,vsnap) 対応のアクションと同様にランダムに生成された位
置にインスタンスをスナップした形で移動させます。
move_snap(hsnap,vsnap) 対応のアクションと同様にインスタンスをスナップさせ
ます。
move_towards_point(x,y,sp) sp の速度で座標(x,y)にインスタンスを移動させ
ます。
move_bounce_solid(adv) 対応のアクションと同様に固体のインスタンスに対して
弾みます。Adv はアドバンスはねかたを用いるかどうかを指定します(これは複雑な
面に対応するとき使います)。
move_bounce_all(adv) すべてのインスタンスに対して弾みます。
move_contact_solid(dir,maxdist) 指定された方向にインスタンスが固体物
とコンタクトのあるまで移動されます。現在の位置にコリーションがない場合はコリー
ションのある場所の前にまでインスタンスが移動されます。既にコリーションがあった
場合はインスタンスが移動されません。maxdist で移動する最大の距離が指定できま
す(任意の距離を指定したいときは、否定値を使いましょう)。
move_contact_all(dir,maxdist) 前の関数と同様ですが、この場合は、すべて
のオブジェクト(固体のみではなくて)を考慮します。
move_outside_solid(dir,maxdist) 指定された方向にインスタンスが固体物
の領域外になるまで移動されます。現在の位置にコリーションがない場合はインスタ
ンスが移動されません。maxdist で移動する最大の距離が指定できます(任意の距離
を指定したいときは、否定値を使いましょう)。
move_outside_all(dir,maxdist) 前の関数と同様ですが、この場合は、すべて
のオブジェクト(固体のみではなくて)を対象になります。
distance_to_point(x,y) 現在のインスタンスのバウンディング・ボックスから座
標(x,y)までの距離を返します。
distance_to_object(obj) 現在のインスタンスから obj の一番近いのインスタン
スまでの距離を返します。
position_empty(x,y) (x,y)座標は空いているかどうかを返します。
position_meeting(x,y,obj) 座標(x,y)に obj のインスタンスかあるかどうかを返
します。Obj はいずれのオブジェクト、id のインスタンス、予約語 self、other、あるい
は all、として指定できます。
30.2 インスタンス
ゲームの基本単位はオブジェクトのインスタンスです。ゲームのプレイ中にこれらのインス
タンスの特徴を変えることができます。また、新しいインスタンスを生成したり、インスタンスを
削除したりすることができます。上記に説明した移動関係の変数と後に説明する描画関係
の変数の他に、各インスタンスは次の変数をもっています。
object_index* オブジェクトのインスタンスのインデックス。変更不能。
97
id* インスタンスの唯一の id(>= 100000)。ルームを定義するときは、マウスがインス
タンスの上にあるときは、インスタンスの下に id が表示されます。
mask_index コリーション用のマスクのインデックス。これを-1 にすると、スプライトの
インデックスに等しくなります。
solid インスタンスが固体のとき。これはゲーム中に変えられます。
persistent インスタンスがパーシステントかどうかを指定します。パーシステントの
ときルームが変わってもインスタンスが残ります。ゲーム中にこれをオフにするのが望
ましいです(たとえば、ルームに戻るとき)。
インスタンスを扱うときには一つの問題があります。各インスタンスを区別するのは簡単で
はありません。インスタンスが一つのときその名前を使いますが、それ以外の場合はインスタ
ンスの id の取得が必要です。これはインスタンスの唯一の固有のものです。これは with 文
でインスタンスの区別に使用できます(28.6 節で説明するドット構文の使用で)。幸いに、イン
スタンスの id を調べる変数と関数があります。
instance_count* ルームに存在するインスタンスの数
instance_id[0..n-1]* 特定のインスタンスの id。ここでは n はインスタンスの番
号です。
一つの例を示しましょう。ゲームの各インスタンスはパワーをもつことを仮定しましょう。ま
た、一番パワーフルなインスタンスを決定したいです。そのために、次のコードを使うことがで
きます。
{
maxid = -1;
maxpower = 0;
for (i=0; i<instance_number; i+=1)
{
iii = instance_id[i];
if (iii.object_index == unit)
{
if (iii.power > maxpower)
{maxid = iii; maxpower = iii.power;}
}
}
}
次の関数はオブジェクトの作成とその破壊に使用できます。
30.3 タイミング
よいゲームはきめ細かい物事の出現タイミングを要します。幸いにゲーム・メーカーはほと
んどのタイミング作業を行ってくれます。すべてのことはあるレート(頻度)で行われているこ
とを保証します。このレートはルームの定義段階で指定します。しかし、room_speed のグロ
ーバル変数の使用で変更できます。たとえば、各ステップ毎に room_speed 増加(例 0.001
で)させて少しずつゲームを早くにして、難しくすることができます。使っているコンピュータが
遅ければこのスピードが得られない場合があります。これを fps の変数でチェックすることが
できます。この変数は常に現在の秒当たりのフレーム数を監視しています。最後に、アドバン
ス・タイミングを行うときは、コンピュータが起動されてから経過したミリ秒の数を保持する
current_time の変数を使うことができます。次に示すのは使用できる変数のすべてです
(最初のものしか変更できません)。
room_speed 現在のルームでのゲームの速度(ステップ数/秒)。
fps* 1秒あたり描画されるフレーム数。
current_time* システムがスタートしてから経過した時間(ミリ秒単位で)。
current_year* 現在の年。
current_month* 現在の月。
current_day* 現在の日。
current_weekday* 現在の曜日(1 は日曜日、…7 は土曜日)。
current_hour* 現在の時間。
current_minute* 現在時間の分数。
current_second* 現在時間の秒数。
時々、ゲームを一時的停止したいことがあります。このためにスリープ関数を使います。
最後に、もう既に知っているように各インスタンスが設定可能な異なる8つのアラームをも
っています。その値を変える(または取得する)ために次の変数を用います。
alarm[0..7] 指定されたアラームの値(オブジェクトのアラーム・イベントがアクシ
ョンをもつときのみアラームがアップデートされることに注意しましょう)。
99
前に示したように複雑なタイミングにはタイム・ライン・リソースが使用できます。各インスタ
ンスが独自のタイム・ライン・リソースをもつことができます。次の変数はタイム・ライン・リソー
スに関わっています。
timeline_index インスタンスに関連されたタイム・ライン・リソースのインデックス。
これは特定のタイム・ラインの指定に使用できます。現在のタイム・ラインの使用を停
止するには−1の値を使います。
timeline_position タイム・ライン内の現在の位置。これを変えると、タイム・ライ
ンの一部の繰り返しや一部の飛び出しが可能になります。
timeline_speed 通常、タイム・ラインの各ステップに位置が1に増加されます。この
変数を変えればその増加分が変えられます。0.5 のような実数も使えます。1より大き
な値を使うと色々な時刻を同時に発現します。しかし、該当のアクションは元の順序
通りで行われますので、実行されないアクションがありません。
30.4 ルームとスコアー
ゲームはルームで行われます。各ルームはその名で指定されたインデックスをもっていま
す。現在のルームは room 変数に保持されます。ルームは連続した番号で番号付けられてい
ることが仮定できません。このため、ルーム番号を対象に値を足したり、引いたりしないでく
ださい。それより、次の変数と関数を使いましょう。古典的なコードは次のようになります。
{
if (room != room_last)
{
room_goto_next();
}
else
{
game_end();
}
}
ルームを扱う次の変数と関数があります。
room 現在のルームのインデックス。他のルームへ移動するために変更できますが、
次のルーチンを用いた方がよいです。
room_first* ゲームの最初のルームのインデックス
room_last* ゲームの最後のルームのインデックス。
room_goto(numb) numb インデックスのルームへ移動。
room_goto_previous()前のルームへ移動。
room_goto_next() 次のルームへ移動。
room_restart() 現在のルームを再スタートします。
room_previous(numb)numb インデックスをもつルームの前のルームのインデック
スを返します(−1=そのルームが存在しない)。
room_next(numb) numb インデックスをもつルーム の次のルームのインデックスを
返します(−1=そのルームが存在しない)。
game_end() ゲームを終了させます。
game_restart() ゲームを最スタートさせます。
ルームは次の特徴もあります。
room_width* ピクセル数でのルーム幅。
room_height* ピクセル数でのルームの高さ。
room_caption ウインドウのカプションに表示されるルーム用のカプション文字列。
100
room_persistent 現在のルームはパーシステントであるかどうか。
数多くのゲームはプレイヤーにゲームを保存したりセーブしたゲームをロードしたりするこ
とを可能にします。ゲーム・メーカーではこれは自動的に行われます。プレイヤーが<F5>を押
すと、ゲームがセーブされ、<F6>を押すと、ゲームのロードができます。コードでもこのゲーム
のセーブ(保存)とロード(開く)が可能です(ローディングは現在のステップの終了時に行わ
れます)。
ゲームのもう一つの重要な特徴はスコアー、ヘルスおよびライブ数です。ゲーム・メーカー
は、グローバル変数 score および lives でスコアーおよびライブ数を管理しています。スコ
アーの更新は該当変数を変えることで行えます。ヘルスおよびライブ数については同様です。
ライブ数が 0 以上の値で始まって、0 以下になったときは、no-more-lives イベントがすべての
インスタンスを対象に実行されます。スコアーとライブ数をカプションに表示したくない場合
は、show_score 等の変数を false に設定します。
score 現在のスコアー。
lives 現在のライブ数。
health 現在のヘルス(0−100)。
show_score スコアーを表示するかどうか。
show_lives ライブ数を表示するかどうか。
show_health ヘルスを表示するかどうか。
caption_score スコアー用のカプション。
caption_lives ライブ数用のカプション。
caption_health ヘルス用のカプション。
スコアー・リストを管理するために組み込みの仕組みがあります。このリストには 10 名まで
管理できます。これの詳細については第34章を見てください。
30.5 イベントの生成
ご存じのようにゲーム・メーカーはイベントで動きます。すべてのアクションはイベントの結
果です。異なる幾つかのイベントがあります。クリエーションと破壊のイベントは、それぞれイ
ンスタンスの生成とその破壊によって発生します。各ステップにシステムはまずアラームイベ
ントを処理します。その次に、キーボードおよびマウス・イベントを扱います。その後、インスタ
ンスが新位置に着いたときコリーション・イベントが処理されます。最後に、ドロー・イベントを
使ってインスタンスの描画が行われます(多数ビューの場合は、ドロー・イベントは各ステップ
に数回呼び出されます)。コードからもイベントを現在のインスタンスに適用することができま
す。そのために、次の関数があります。
101
指定されたタイプのイベントが多数存在するときは、numb でそのイベントを明確に
することができます。アラーム・イベントの場合は numb は 0〜7 です。キーボード・イベ
ントの場合はキーのキーコードを与えなければなりません。マウス・イベントの場合は
次の定数が使用できます。
ev_left_button
ev_right_button
ev_middle_button
ev_no_button
ev_left_press
ev_right_press
ev_middle_press
ev_left_release
ev_right_release
ev_middle_release
ev_mouse_enter
ev_mouse_leave
ev_joystick1_left
ev_joystick1_right
ev_joystick1_up
ev_joystick1_down
ev_joystick1_button1
ev_joystick1_button2
ev_joystick1_button3
ev_joystick1_button4
ev_joystick1_button5
ev_joystick1_button6
ev_joystick1_button7
ev_joystick1_button8
ev_joystick2_left
ev_joystick2_right
ev_joystick2_up
ev_joystick2_down
ev_joystick2_button1
ev_joystick2_button2
ev_joystick2_button3
ev_joystick2_button4
ev_joystick2_button5
ev_joystick2_button6
ev_joystick2_button7
ev_joystick2_button8
コリーション・イベントのとき、他方のオブジェクトのインデックスを出します。最後に、
他方の(other)イベントでは次の定数が使えます。
ev_outside
ev_boundary
ev_game_start
ev_game_end
ev_room_start
ev_room_end
ev_no_more_lives
ev_no_more_health
ev_animation_end
ev_end_of_path
ev_user0
ev_user1
ev_user2
ev_user3
ev_user4
ev_user5
102
ev_user6
ev_user7
指定したステップ・イベントでは次の定数が使えます。
ev_step_normal
ev_step_begin
ev_step_end
event_perform_object(obj,type,numb) この関数は上記の関数と同様なもの
ですが、この関数では他のオブジェクトを対象にすることができます。ただし、指定さ
れたイベントのアクションは、指定したオブジェクトのすべてのインスタンスではなく、
現在のインスタンスだけに適用されます。
event_user(numb) 他のイベントでは8つまでのイベントを定義することができます。
そのイベントはこの関数を呼ばない限り実行されません。numb の範囲は 0〜7 です
event_inherited() 継承されたイベントを実行します。これは現在のインスタンス
には親インスタンスのあるときだけ有効です。
現在実行中のイベントについての情報を、次の読み出し専用の変数で得ることができます。
event_type* 実行中のイベントのタイプ。
event_number* 現在実行されているイベント番号
event_object* 現在実行されているイベントのオブジェクトのインデックス。
event_action* 現在実行されているアクションのインデックス(0 番目は、イベントの
最初のものです)。
30.6 その他の変数と関数
エラーの扱う次の変数があります。
error_ocurred エラーが発生したか否かを指定します。
error_ocurred 最後のエラー・メッセージを格納する文字列です。
Show_debug_message(str) デバッグ・モードの文字列を表示します。
103
Chapter 31 GML: ユーザーとのやり取り
ユーザーとやり取りしないゲームはありません。ゲーム・メーカーでのこれを実現するため
の標準的なやり方では、マウスもしくはキーボード・イベントにアクションを設定します。しかし、
より厳密な制御の場合もあります。コードを用いれば、キーボードのキーが押されているかど
うかやマウスの位置やまたそのボタンが押されているか否かをチェックすることができます。
通常、これをコントローラ型のオブジェクトのステップ・イベントでチェックして、アクションを起
こします。このため、次の変数と関数があります。
時々、一つのキーを他のキーに対応させることが便利です。たとえば、プレイヤ
ーに矢印のキーとテンキーのキーが使えるようにしたいことがあります。アクショ
ンを二重化するよりテンキーのキーを矢印のキーに対応することができます。また
は、キーの設定をプレイヤーに任せたいこともあります。この場合は、次の関数が
使用できます。
どれのマウス・ボタン、あるいはキーが押されたかを調べるために次の関数を使うことがで
きます。これらは、特に複数のキーが押されたとき便利です。
キーボードの状態を扱うために次のルーチンを使用することができます。
keyboard_get_numlock テンキーが有効か否かを返します。
keyboard_set_numlock(on) テンキーを設定(true)か非設定(false)します。
keyboard_get_numlock テンキーが有効か否かを返します(W95 で使用不能)。
keyboard_key_press(key) key のキーコードのキーが押されていることをシミュ
レーションします。
keyboard_key_release(key) key のキーコードのキーを切り離すことをシミュレ
ーションします。
104
次のバーチャル・キーコード対応の定数があります。
vk_nokey キーが押されていないことを示すキー・コード
vk_anykey いずれのキーが押されていることを示すキー・コード
vk_left 左の矢印キーのキー・コード
vk_right 右の矢印キーのキー・コード
vk_up 上の矢印キーのキー・コード
vk_down 下の矢印キーのキー・コード
vk_enter エンター・キー
vk_escape スケープ・キー
vk_space スペース・キー
vk_shift シフト・キー
vk_control コントロール・キー
vk_alt alt キー
vk_backspace backspace キー
vk_tab tab キー
vk_home home キー
vk_end end キー
vk_delete delete キー
vk_insert insert キー
vk_pageup pageup キー
vk_pagedown pagedown キー
vk_pause pause/break キー
vk_printscreen printscreen/sysrq キー
vk_f1 … vk_f12 F1〜F12 のキー
vk_numpad0 … vk_numpad9 テンキーの数字のキー
vk_multiply テンキーの「×」キー
vk_divide テンキーの「÷」のキー
vk_add テンキーの「+」キー
vk_subtract テンキーの「−」キー
vk_decimal テンキーの「.」(浮動小数点)キー
文字列の場合は、たとえば ord('A')を用いる(大文字)。次の定数が
keyboard_check_direct だけで使用できます。
vk_lshift 左の shift キー
vk_lcontrol 左の control キー
vk_lalt 左の Alt キー
vk_rshift 右の shift キー
vk_rcontrol 右の control キー
vk_ralt 右の Alt キー
これらは、古いウインドウのバーションで動作しません。
たとえば、矢印のキーで制御できるオブジェクトがあったとします。このとき、次のコードが
オブジェクトのステップ・イベントに置けます。
{
if (keyboard_check(vk_left)) x -= 4;
if (keyboard_check(vk_right)) x += 4;
if (keyboard_check(vk_up)) y -= 4;
if (keyboard_check(vk_down)) y += 4;
}
105
もちろん、これをキーボード・イベントに置いた方が簡単です。
やり取りに関連の他の5つの関数があります。
keyboard_clear(key) キーの状態をクリアします。ユーザーがキーを放すまでキ
ー・イベントが発生しません。
mouse_clear(button) マウスの状態をクリアします。ユーザーがマウスを放すまで
マウス・イベントが発生しません。
io_clear() マウスとキーボード状態をすべてクリア(削除)します。
io_handle() ユーザーの入出力を扱い、マウスおよびキーの状態を更新します。
keyboard_wait() がキーを押すまで待ちます。
31.1 ジョイスティックのサポート
ジョイスティックに関連されたイベントが幾つありますが、ジョイスティックを制御するため
の関数があります。ゲーム・メーカーが二つまでのジョイスティックをサポートします。このため、
すべての関数はジョイスティックの id を使用します。
106
107
Chapter 32 GML: ゲームのグラフィクス
ゲームの一つの重要な要素はグラフィックスです。通常ゲーム・メーカーが管理しますから、
簡単なゲームでは我々がほとんど何もしなくてもよいです。しかし、自分で制御したいときも
あります。多少のものにはそれに対応するアクションがありますが、幅広い制御の場合はコー
ドを使用します。この章はこのために用いる関数や変数について述べ、発生することの詳細
について触れています。
32.1 ウインドウとカーソル
デフォルトでゲームはスクリーンの真ん中に配置されるウインドウで実行されます。プレイヤ
ーは、こらが<F4>のキーでフル・スクリーンに変更できます(これは無効でない場合)。プログ
ラムに次の変数を用いれば、同様のことが実現できます。
フル・スクリーン・モードでカプションおよびスコアがスクリーンに表示されます(これは、ゲー
ムのオプションを使えば無効にすることができます)。フル・スクリーン・モードでイメージが中
央に表示されるか、あるいはスケール化されます。これが次の変数で制御できます。
スケール・モードは遅いマシンや遅いグラフィクス・カードではゲームを遅くしてしまいます。デ
フォルトで、ゲーム実行中にカーソルが表示されます。ほとんどのゲームにはこれは不要です。
カーソルを排除するために次の変数を使います。
ウインドウで予め定義されているカーソルを次の関数で使用することができます。
ところで、カーソルを作成するのはとても簡単です。否定の深さのオブジェクトを作成して、そ
のステップのイベントでマウスの位置を追跡するようにします。
モニターの解像度を調べるには次の読み出し専用の変数を使います。
monitor_width* ピクセル単位のモニターの横幅
monitor_height* ピクセル単位のモニターの縦幅
32.2 スプライトとイメージ
各オブジェクトはスプライトをもちます。これは単一のイメージかあるいは多数のイメージ
のものです。オブジェクトの各インスタンスのために、プログラムはそれに該当するイメージを
スクリーンに表示します。その(スプライトで指定された)原点はオブジェクトの x、y 座標とな
108
ります。多数のイメージのものの場合は、一つずつを表示して動きのある効果を実現します。
イメージの描画に影響を与える変数が幾つかあります。これらを使えば描画効果が変えます。
各インスタンスは次の変数をもちます。
image_speed サブイメージの置き換えの速度です。値は1だと、一つずつのイメージ
を扱うことになります。1より小さい値は置き換えを遅くし、一つのサブイメージが何回
も表示されます。1より大きい値を使用すると、指定された速度に合わせるためにサブ
イメージは飛ばされてしまいます。
depth 通常イメージはインスタンスの生成順に従って表示されます。これを変えるた
めにこの変数を設定します。オブジェクト・プロパティの設定段階に他の値を指定さ
れていない限り、この変数のデフォルト値は 0 です。値が高ければインスタンスは後
方の方に設定されます(否定の値も使えます)。小さい値のものは大きい値のものよ
り前面に表示されます。ディップの値の設定で自分で指定した通りインスタンスが描
画されます(たとえば、飛行機が雲の前)。バックグランドイメージは高い値を持ちます。
フォアグランドイメージはディップが小さい(か否定値)。
image_scale イメージを小さくしたり、大きくしたりするためのスケール係数です。1
の値は通常の大きさを意味します。この変数を変えるとイメージの高さと横幅が変わ
り、コリーション・イベントにも影響を与えます。スケール化されたイメージ(特に小さく
なったもの)は描画時間が大きくなることに注意しましょう。スケーリングを用いれば
3D(3次元)効果が得られます。
bbox_left* イメージのバウンディング・ボックスの左辺(スケールの考慮入り)
bbox_right* イメージのバウンディング・ボックスの右辺
bbox_top* イメージのバウンディング・ボックスの上辺
bbox_bottom* イメージのバウンディング・ボックスの下辺
109
32.3 バックグランド
各ルームは8つまでのバックグランドをもちます。また、バックグランド色も有します。これら
の特徴をコードで次の変数で変えられます(バックグランドは配列で管理され、その要素
(0〜7)は一つのバックグランドを指しています)。
background_color ルームのバックグランド色
background_showcolor バックグランド色でウインドウを削除します
background_visible[0..7] それぞれのバックグランド・イメージを可視する
background_foreground[0..7] それぞれのバックグランドをフォアグランドにし
ます
background_index[0..7] バックグランド用のバックグランド・イメージ・インデック
ス
background_x[0..7] バックグランド・イメージの x 座標
background_y[0…7] バックグランド・イメージの y 座標
background_width[0…7]* バックグランド・イメージの幅
background_height[0…7]* バックグランド・イメージの高さ
background_htiled[0..7] 横方向でタイル化
background_vtiled[0..7] 縦方向でタイル化
background_hspeed[0..7] バックグランドの水平のスクローリング速度(ピクセ
ル数/ステップ)
background_vspeed[0..7] バックグランドの垂直のスクローリング速度(ピクセ
ル数/ステップ)
background_alpha[0..7] バックグランドを描画するときに使用する透明度
(alpha)値を指定します。1 は通常の設定です。0 は完全に透明を意味します。使用時
には気を付けましょう。半透明バックグランドの描画は時間がかかり、ゲームを遅くに
します。
32.4 タイル
もう既に分かるようにルームにタイルを追加することができます。タイルはバックグランド・
リソースの一つです。タイルは可視のイメージです。イベントに反応しませんし衝突も起こしま
せん。このため、オブジェクトより高速に処理できます。イベントまたは衝突を要しないものを
タイルで実現しましょう。きれいなグラフィックスの実現にタイルを、衝突にはオブジェクトを使
いましょう。
実は、思ったよりタイルをよく制御することができます。通常、ルームの設計段階に追加す
るが、ゲーム実行中にも追加できます。タイルの位置を変えたり、スケール化したり半透明に
したりすることができます。
タイルは次のプロパティをもっています。
background. タイルの属するバックグランド・リソース。
left,top,width,height. 使用するバックグランドの部分。
x,y. ルーム内のタイルの左上のコーナーの x、y 座標。
depth. タイルの深さ。ルームの設計段階でバックグランド・タイル(深さは 1000000)
あるいはフォアーグランド・タイル(深さは−1000000)しか指定できないが、実は深さ
はその範囲内のいずれに設定することができます。そうすることによってオブジェクト
を挟んで表させることができます。
visible. タイルが可視か透明か。
xscale,yscale. 各タイルをスケールすることができます(デフォルト値は 1)。
alpha. タイルの透明度を表します。1 の値は可視、0 のは透明を指定します。使用時
に気を付けましょう。半透明タイルの描画は非常に遅いので、システムによっては問
題になります。
タイルのプロパティを変えるために、その id は必要です。ルーム作成時にタイルを追加すると、
タイルの id は下部の情報バーに表示されます。特定の位置にあるタイルの id を調べる関数
があります。
110
次の関数はタイルの操作に使用できます。
tile_add(background,left,right,width,heigth,x,y,depth) ルームに指
定の値の新しいタイルを追加します(上記の説明を参照)。関数はタイルの id を返し
ます。
tile_delete(id) 指定の id のタイルを削除します
tile_find(x,y,foreground) x、y 座標にあるタイルの id を返します。その位置に
タイルがないと、−1 が返されます。フォーグランドが真(true)の場合は 0 未満の値の
タイルのみ対象になります。そうでない場合は、0 か 0 以上の値のタイルだけ対象に
なります。多数該当の場合は、最初のタイルの id が返されます。
tile_delete_at(x,y,foreground) x、y 座標にあるタイルを消去します。フォー
グランドが真(true)の場合は 0 未満の値のタイルのみ対象になり、そのすべてが削
除されます。そうでない場合は、0 か 0 以上の値のタイルだけ対象になり、消去されま
す。多数該当の場合は、すべて削除されます。
tile_exist(id) 指定された id のタイルの有無を表します。
32.5 描画用の関数
オブジェクトはそのイメージと全く異なる形にすることができます。色々な形のものを描くた
めに数多くの関数があります。テキストを表示する関数もあります。これらの関数をオブジェ
クトのドローイング(描画用)・イベントで使うべきです。他のコードでは意味がありません(後
述の 32.8 節を参照)。コンピュータのグラフィクス・ハードウェアはグラフィックスの表示を高
速化するだけです。このため、他のドローイング・ルーチンはかなり遅くなります。また、ゲー
ム・メーカーは高速なイメージ表示に最適化されています。このため、できるだけ他のドロー
イング・ルーチンの使用を避けてもらいたいです(それより、可能な限りビットマップ素材を作
成しましょう)。インスタンス間の衝突は、描画されることではなくオブジェクトの外観であるス
111
プライト(あるいはマスク)で決定されることを忘れないでほしい。イメージ関連の関数には次
のものがあります。
次の関数で基本的な形を描画します。これらの関数は色々なプロパティ、特にブラシおよ
びペンの色を用います。その設定は色々な変数で可能です。
draw_pixel(x,y) ブラシ色で座標(x,y)にピクセルを描画します。
draw_getpixel(x,y) 座標(x,y)にあるピクセルの色を返します。
draw_fill(x,y) 座標(x,y)から該当領域をブラシ色で塗りつぶします。
draw_line(x1,y1,x2,y2) 座標(x1,y1) から(x2,y2)までの線を描きます。
draw_circle(x,y,r) 座標(x,y)に半径 r の円を描きます。
draw_ellipse(x1,y1,x2,y2) 楕円を描きます。
draw_rectangle(x1,y1,x2,y2) 長方形を描きます。
draw_roundrect(x1,y1,x2,y2) 面取り長方形を描きます。
draw_trangle(x1,y1,x2,y2,x3,y3) 三角形を描きます。
draw_arc(x1,y1,x2,y2,x3,y3,x4,y4) 楕円の弧を描きます。
draw_chord(x1,y1,x2,y2,x3,y3,x4,y4) 楕円の弦を描きます。
draw_pie(x1,y1,x2,y2,x3,y3,x4,y4) パイ型(楕円の一部分)の絵を描きます。
draw_button(x1,y1,x2,y2,up) ボタンを描画します。1の値はボタンがアップ、0
はボタンがダウンを意味します。
draw_text(x,y,string) 座標(x,y)に文字列(string)を表示します。#の記号、改
行(char(13))、またはライン・フィード(char(10))は改行として見なされます。これを使
えば、多行数のテキストを作成することができます(#の表示に\#を使いましょう)。
draw_text_ext(x,y,string,sep,w) 前記の関数と同様ですが、多行数のテキ
ストを作成するときは、行間の距離(sep)を指定することができます。−1はデフォルト
の距離を指定します。もう一つの定数 w は、テキストの幅をピクセル数を指定します。
指定された幅より長いテキストは空白区切りか−記号で数行に分けられます。−1を指
定すると、行は分割されません。
draw_text_sprite(x,y,string,sep,w,sprite,firstchar,scale) 上記の
関数でテキストを表示すると資源がかなり使います。この関数は上記の関数と同様
ですが、文字をスプライトから取り出します。つまり、スプライトが各文字に対応するサ
112
ブイメージを持たなければなりません。その最小の文字は firtschar で指定されます。
これ以降の文字は ASCII 順で並ばなければなりません。ウインドウの文字マップのツ
ールがコードの確認に使えます。文字一部(数字か大文字までか)を使用するときそ
の他の文字の指定は不要です。スケール計数は scale で指定します(1は通常サイ
ズ)。スケール使用に気を付けましょう。ゲームを遅くすることがあります。これらのス
プライトは通常大きいです。また、衝突時に厳密なチェックは不要です。
draw_poligon_begin() 多角形の描画をスタートさせます。
draw_polygon_vertex(x,y) 座標(x,y)に多角形に角を追加します。
draw_polygon_end() 多角形の描画を終わらせます。実は、この関数は多角形を
描画します。
線(ペン)の色や領域(ブラシ)やフォントなど数多くの設定が変えられます。これらの変数
は、グローバルであり、ゲームのすべてのものに影響を与えます。このため、一つのオブジェク
トのドローイング・イベントでこれらを変えますと、それ以降のすべてのオブジェクトに有効に
なります。これらの変数は他のイベントにも使用できます。たとえば、固定にしたいときはゲー
ムのスタートに設定できます(これは一番効率よいです)。
brush_color シェイプを塗りつぶすための色。予め用意されている次の色がありま
す。
c_aqua
c_black
c_blue
c_dkgray
c_fuchsia
c_gray
c_green
c_lime
c_ltgray
c_maroon
c_navy
c_olive
c_purple
c_red
c_silver
c_teal
c_white
c_yellow
他の色は make_color(red,green,blue)のルーチンで作れます。各 red、green、
および blue の値は 0〜255 です。
brush_style 塗りつぶすためのブラシ・スタイル。次のスタイルが使えます
bs_hollow
bs_solid
bs_bdiagonal
bs_fdiagonal
bs_cross
bs_diagcross
bs_horizontal
bs_vertical
pen_color 境界線を描く用のペン色
pen_size ペンのサイズ(ピクセル数)
font_color フォントの色
font_size フォントのサイズ(ポイント数)
font_name フォント名(文字列)
font_style フォントのスタイル。次のスタイルがあります(加算でその組み合わせ
が可能になります)。
fs_normal
113
fs_bold
fs_italic
fs_underline
fs_strikeout
font_angle フォント回転の角度(0〜360)。通常のテキストでは 90 度を用います
font_align 指定に従ってテキストを揃える。次の指定が使えます
fa_left
fa_center
fa_right
次の関数もあります。
string_width(string) draw_text()関数に該当する現在のフォントでの文字列の
幅。グラフィックスの厳密な位置決定に使用できます。
string_height(string) draw_text()関数に該当する現在のフォントでの文字列
の高さ。
string_width_ext(string,sep,w) draw_text_ext()関数に該当する現在のフォ
ントでの文字列の幅。グラフィックスの厳密な位置決定に使用できます。
string_height_ext(string,sep,w) draw_text_ext()関数に該当する現在のフ
ォントでの文字列の高さ。
screen_gamma(r,g,b) ガンマ定数値を設定します。r、g および b は−1〜1 までの
値をとります。デフォルトは 0 です。0 より小さい値を用いると該当の色は暗くなります。
0 以上の値を用いると、その色が明るくなります。ほとんどの場合は、値三つとも同値
に保ちます。たとえば、照明効果を得るために、三つの値を1に近い値に設定します。
この関数は排他的モードでしか使用できません。
screen_save(fname) スクリーンのイメージを bmp 形式で指定されたファイルに保
存します。これはスクリーン・ショットの作成にとても便利です
screen_save_part(fname,left,top,right,bottom) スクリーンの一部分を
指定されたファイルに保存します
32.6 ビュー
もう既に分かっていることですが、ルームを設計するときは、8つまでのビューを定義すること
ができます。これでルームの異なる部分をスクリーンの異なる位置に表示できます。また、特
定のオブジェクトはいつも可視であることも指定できます。ビューをコードで制御することがで
きます。ビューを可視にしたり、透明にしたりすることもできます。また、スクリーン上のその配
置位置やサイズを変えたり、ルーム内の位置を変更したりすることもできます(可視オブジェ
クトがない場合はとても便利)。さらに、可視オブジェクトの周辺の枠線のサイズやビューに
可視となるオブジェクトも指定できます。最後のものは、ゲーム中で重要なオブジェクトが変
わったとき非常に大切なことです。たとえば、現在の状態に基づいて主人公を変えることが
できます。しかし、これはこのオブジェクトがそのまま可視になることを意味しません。これを実
現するために、主要なオブジェクトのクリエション・イベントで次の一行のコードを入れます
(最初のビューで起こることを仮定にしたとき)。
{
view_object[0] = object_index;
}
ビューに影響を与えるの次の変数があります。最初の二つを除いて、変数が 0(最初のビ
ュー)〜7(最後のビュー)の配列です。
view_enabled ビューが許可されているかを表します。
view_current* 現在描画中のビュー(0〜7)。これはドローイング・イベントでしか
使わないでください。この変数をチェックすれば一つのビューに幾つかのことを描画
するときに使います。この変数が変更できません。
view_visible[0..7] スクリーンにビューが可視かを表します。
114
view_left[0..7] ルーム内のビューの左位置を示します。
view_top[0..7] ルーム内のビューのトップ位置を示します。
view_width[0..7] ビューの幅(ピクセル数で)を示します。
view_height[0..7] ビューの高さ(ピクセル数で)を示します。
view_x[0..7] スクリーン上のビューの x 座標の位置を示します。
view_y[0..7] スクリーン上のビューの y 座標の位置を示します。
view_hborder[0..7] 可視オブジェクトの上下枠線のサイズ(ピクセル数で)を示
します。
view_vborder[0..7] 可視オブジェクトの左右枠線のサイズ(ピクセル数で)を示
します。
view_hspeed[0..7] ビューの横方向での最大速度を示します。
view_vspeed[0..7] ビューの縦方向での最大速度を示します。
view_object[0..7] ビューに見えるべきオブジェクトのインスタンスを示します。多
数のインスタンスの場合は、最初のは選ばれます。インスタンス id をこの変数に代入
することができます。この場合はそのインスタンスが選ばれます。
ルームの最初の可視ビューでスクリーン上のイメージサイズが決まることに注意しましょう。
ゲーム実行中にビューを変えると、スクリーンに入れなくなるおそれがあります。スクリーンサ
イズは動的に変わらないため、その変更を次の変数を使って手動で行わなければなりませ
ん。
screen_width スクリーン上のイメージの幅、つまり描画の領域です。ビューのない
場合は、room_width の値に等しくなります。
screen_height スクリーン上のイメージの高さ。
32.7 遷移効果
ご存じのように、一つのルームから他のルームへ移動するとき、遷移効果が指定できます。
transition_kind の変数を使えば、ルーム変化無しでも次のフレームへの遷移効果が指
定できます。この変数に 1〜17 の値を与えると、それに対応する遷移効果が使用されます(こ
れはルームに指定できる遷移効果と同様です)。0 の値は遷移効果無しを意味します。これ
は次回のフレームの表示に影響を与えます。次のルームに行く前にこれらの変数がコードで
設定できます。
transition_kind 次のフレームの遷移効果を指定する(0〜13)
transition_time 遷移効果に使用したい総合時間(ミリ秒単位で)
transition_steps 遷移効果のステップ数
32.8 スクリーンの再描画
通常、各ステップ末にルームが再描画されます。それ以外ルームを再描画することは滅多
にありません。あるのは、プログラムが制御を握るときだけです。たとえば、スリープ・モードに
入る前に再描画が必要であり、また、実行中にメッセージを出してユーザーの入力を待つと
きにも再描画が必要です。これを行うために次の二つの関数があります。
screen_redraw() すべての描画イベントを呼び出して、ルームを再描画します。
screen_refresh() 現在のルーム・イメージでスクリーンをリフレッシュします(描画
イベントを行いません)。
2番目の関数を理解するために、描画作業の理解が必要です。内部にイメージが用意さ
れ、このイメージ上に描画作業が行われます。このイメージはスクリーンに表示されず、すべ
ての描画が終わった後、ステップ末にスクリーンがこのイメージに置き換えられます(これは
ダブル・バッファリングという)。上記の最初の関数は内部のイメージを再描画してスクリー
115
ン・イメージをリフレッシュします。第二番目の関数では、スクリーンのイメージしかリフレッシュ
しません。
描画用アクションあるいは関数は描画・イベント以外で使えないことは、この説明で理解で
きたのでしょうか。他のイベントは、内部のイメージ上にものを描きますが、スクリーンに表示
されません。描画イベントが行われると、まずバックグランドが表示されますので、内部イメー
ジに描画したものが削除されてしまいます。しかし、screen_refresh()を描画の後に使用すると、
更新されたイメージがスクリーンに表示されます。このため、たとえば次のようなスクリプトで
スクリーンにメッセージを出して、ユーザーのキー入力を待つことができます。
{
draw_text(screen_width/2,100,'Press any key to continue.');
screen_refresh();
keyboard_wait();
}
描画イベント以外に、描画しようとすると、ビューではなくイメージ上に描画しますので、使
用した座標はビューないときと同じものになってしまいます。
気を付けてこの技術を使いましょう。まずこの技術をよく理解して、またリフレッシュ時間が
短くはないことを覚えておきましょう。
116
117
Chapter 33 GML: サウンドとミュージック
サウンドは、ゲームの重要な部分です。サウンドを大きく分けるとバックグランド用のサウン
ドとサウンド効果が二つあります。バックグランド・サウンドは永遠に繰り返される長い midi
型のミュージックです。一方、サウンド効果は短い wave 型のファイルです。即時効果を持たせ
るために、これらのファイルはメモリに格納されます。このため、その再生時間は長くはないよ
うに気を付けましょう。
サウンドはサウンド・リソースとしてゲームに追加されます。使用する名前は変数名の書式
規則に従うものでなければなりません。サウンドには、サウンドのバッファ数が少々理解しにく
い特徴があります。システムは一度に wave 型の同一サウンドを一回しか再生できないため、
再生中に同じサウンドを用いると再生中のサウンドは中止されます。これは余り望ましくない
効果です。このため、ガン・ショットのようなサウンドを同時に多数用いるときは、同じサウンド
を多数コピーして使用しなければなりません。この数を、サウンドのバッファ数といいます。バ
ッファ数が多ければ、同時に再生できる数も増えます。しかし、これに伴ってメモリの使用も増
加します。このため、その使用に注意が必要です。ゲーム・メーカーはいつも最初の使用可能
バッファを使います。ですから、数を指定すれば、あとは余り心配しなくてもよいです。
サウンド関連の基本関数は5つです。二つは再生用であり、一つはサウンドが再生中かど
うかをチェックするもので、他の二つはサウンドをストップするためのものです。これらすべて
がサウンドのインデックスを使います。サウンドの名前をサウンドのインデックスとなります。イ
ンデックスを変数に格納して使うこともできます。
sound_play(index) 指定されたサウンドを一回再生します。
sound_loop(index) 指定されたサウンドを永遠に再生します。
sound_stop(index) 指定されたサウンドを停止します。共有の index のサウンドの
とき、すべてが停止されます。
sound_stop_all() サウンドすべてが停止されます。
sound_isplaying(index) 指定されたサウンドは生成中か否かを知らせます。
この他のサウンド効果も使えます。しかし、wave ファイルのみ対応になります。特別なサウ
ンド効果が使用したいときは、サウンド・プロパティのアドバンス・タッブにある妥当のチェッ
ク・ボックスをチェックしなければなりません。サウンド効果を使用するサウンドはそれをしな
いサウンドよりシステムのリソースを使うことに注意しましょう。以下に示す関数(コール)を
使うときのみ、該当のボックスをチェックしましょう。サウンド効果が三あります。まず、ボリュー
ムが変更できます。0はサウンドをオフにします。1は元の音量になります(これより大きな音
量が設定できません)。サウンドが流されてくる方向(パンという)も制御できます。0は左から、
1は右から、0.5 はデフォルトで、真ん中からを意味します。これはパンニングといい、たとえば
ものが左から右に移動しているような効果が簡単に実現できます。最後に、サウンドの再生
の周期が変えられます。これは、エンジンのスピードを表現するには使います。0は一番遅い
周期、1は一番早い周期となります。
sound_volume(index,value) サウンドのボリュームを変えます(0は小さい、1は
大きい)。
sound_pan(index,value) サウンドのパンを変えます(0は左、1は右)。
sound_frequency(index,value) サウンドの再生の周期を変えます(0は遅い、1
は速い)。
サウンドは結構複雑なものです。Midi 型のファイルは標準のマルチメディア・プレイヤーで
再生されます。ただし、一回で一つの midi ファイルしか再生できないし、効果サウンドがサポ
ートされていません。ウエーブ(wave)型ファイルの再生にはゲーム・メーカーが DirectSound
を使用しますので、すべてのウエーブ・ファイルはメモリに格納され、そのファイルには効果を
持たせることができます。ゲーム・メーカーはその他のサウンド・ファイルも特に MP3 ファイル
を指定されれば、再生しようとします。このとき、標準のマルチメディア・プレイヤーを使用しま
す。しかし、これは使えるかどうかはシステムやインストールされているソフトに依存します。こ
のため、配布するゲームには、MP3 ファイルを使用しないようにしてください。
118
CD から音楽を再生するための関数が幾つあります。
ウインドウのマルチメディア機能をアクセスするために次の関数があります。
119
120
Chapter 34 GML: Splash 画面、score 表、他のポップ・アップ
数多くのゲームはスプラッシュ画面(スクリーン)を使用します。これらのスクリーンはビデ
オやイメージあるいはテキストを表示します。これらの画面は、ほとんどの場合は、ゲーム開始、
レベルの始まりに、またはゲーム終了時に用いられます。ゲーム・メーカーでは、これらの画
面はいつでも使用できます。スプラッシュ・スクリーンが表示されるとき、ゲームは一時的に停
止します。このような画面の使用には次の関数を使います。
show_text(fname,full,backcol,delay) テキスト・スプラッシュ画面を表示し
ます。fname はテキストのファイル名(.txt または.rtf)です。このファイルをゲームのフォ
ルダに手動でおかなければなりません。スタンド・アロンのゲームの作成のときもこの
ファイルの追加は忘れてはいけません。full は画面全体の使用を示します。backcol は
バックグランドの色で、delay はゲームに戻るまでの遅延時間です(プレイヤーがいつ
でもゲームの画面にクリックすればゲームに戻ります)。
show_image(fname,full,delay) イメージ・スプラッシュのスクリーンを表示しま
す。fname はビデオのファイル名です (.bmp, .jpg と.wmf のみ)。このファイルをゲーム
のフォルダに手動でおかなければなりません。full は画面全体の使用を示します。
delay はゲームに戻るまでの遅延時間です。
show_video(fname,full,loop) ビデオ・スプラッシュのスクリーンを表示します。
fname はビデオのファイル名です (.avi,.mpg)。このファイルをゲームのフォルダに手動
でおかなければなりません。full は画面全体の使用を示します。loop はビデオをルー
プで再生することを示します。
show_info() ゲームの情報用のフォームを表示します。
load_info(fname) ゲームの情報を fname のファイルからロードします。このファイ
ルは rtf 形式でなければなりません。これで色々な場面に色々なヘルプファイルの表
示が可能になります。データ・ファイルのリソースでこれらのファイルの追加ができま
す。
メッセージの表示や、質問、メニューやダイヤログなどのようなポップ・アップを表示する次
の関数があります。
121
message_text_font(name,size,color,style) ポップアップ・ボックスのテキ
ストのフォントを設定します。
message_button_font(name,size,color,style) ポップアップ・ボックスのボ
タンのフォントを設定します。
message_input_font(name,size,color,style) ポップアップ。ボックスの入力
フィルドのフォントを設定します。
message_mouse_color(col) ポップアップ・ボックスのボタン上にマウスが置かれ
るときのボタンのフォント色を設定します。
message_input_color(col) ポップアップ・ボックスの入力フィルドのバックグラン
ド色を設定します。
message_caption(show,str) ポップアップ・ボックスのカプションを設定します。
枠線の表示(1)・非表示(0)を show で指定します。枠線が表示されるとき、str はそ
のカプションを指定します。
message_position(x,y) スクリーン上のポップアップ・ボックスの位置を設定しま
す。
message_size(w,h) ポップアップ・ボックスの大きさを固定します。幅を0に設定す
ると、イメージの幅が使われます。高さを0に設定すると、メッセージの行数に高さが
合わせられます。
show_menu(str,def) ポップアップ・メニューを表示します。str はメニューのテキス
トです。これは縦棒「|」で区切られたメニューの項目です。たとえば、str = 'menu0|
menu1|menu2'その一つを例示します。最初の項目が選択されたとき、0が返され、そ
の次の項目の場合は1、0から始まる項目の位置が返されます。選択がない場合は、
def のデフォルト値が返されます。
show_menu_pos(x,y,str,def) 上記関数と同様ですが、x,y 座標にポップアップ・
メニューを表示します。
get_color(defcol) 色をプレイヤーに要求します。defcol はデフォルトの色です。ユ
ーザが cancel を押すと、−1の値が返されます。
get_open_filename(filter,fname) 指定したフィルターで開くファイル名をプレ
イヤーに要求します。フィルターの書式は:'name1|mask1|name2|mask2|…'です。つまり、
セミコロンで区切られた色々なオプションを含んだマスクです。「*」はいずれの文字
列を意味します。例: 'bitmaps|*.bmp;*.wmf'。ユーザが cancel を押すと、空列が返さ
れます。
get_save_filename(filter,fname) 指定したフィルターで保存されるファイル
名を要求します。ユーザが cancel を押すと、空列が返されます。
get_directory(dname) ディレクトリ名を要求します。dname はデフォルト名です。
ユーザが cancel を押すと、空列が返されます。
get_directory_alt(capt,root) もう一つのディレクトリ要求方法。capt は表示
されるカプションです。root はディレクトリ・ツリーのルートです。空白を与えるとツリー
全体が表示されます。ユーザが cancel を押すと、空列が返されます。
show_error(str,abort) エラー・メッセージを表示します(若しくはログ・ファイル
にこれを保存します)。abort はゲームは終了すべきかを表示します。
最上位得点のリストはゲーム毎で保持される特別なポップ・アップです。これに関連の次
の関数が使用できます。
122
他のスコアーの色です。name は使用するフォントの名前です。size はフォントのサイズ
です。
highscore_clear() スコアー・リストをクリアします。
highscore_add(str,numb) str の名前のプレイヤーを numb というスコアーでリス
トに追加します。
highscore_add_current() 現在のスコアーをリストに追加します。ユーザにその
氏名が要求されます。
highscore_value(place) place の順位(1〜10)にある人のスコアーを返します。
これは自分のスコアー・リストを表示するために使えます。
highscore_name(place) place(1〜10)の順位にある人の名前を返します。
draw_highscore(x1,x2,x3,x4) スコアー・リストを現在のフォントで現在のルー
ムに指定されたボックスに表示します。
ゲームが排他的グラフィックス・モードで実行されているときは、これらのポップアップメニ
ューを表示させることができないことにご注意願います。
123
Chapter 35 GML: リソース
ゲーム・メーカーではスプライト、サウンド、データ・ファイル、オブジェクト等のリソースを定
義することができます。この章ではこれらのリソースを対象にする関数について述べます。そ
の前に、次の説明をよく読んでおいてください。リソースを変更すると元のデータが失われま
す!。そのリソースを使用するすべてのインスタンスが影響を受けます。たとえば、スプライトを
変えると、それを使用するインスタンスはその時点から変更後のスプライトを使用します。ル
ームのリスタートやゲームのリスタートはリソースを元通りにしません。また、ゲームの状態を
セーブするときは変更されたリソースは保存されません。このため、ゲームをロードするとき
はリソースを妥当な状態に戻すのを自分でやらなければいけません。
35.1 スプライト
次の関数はスプライトについて情報を提供します。
スプライトは沢山のメモリを占めます。描画時間を短くにするためにスプライトをビデオ・メ
モリに保存しなければなりません。第14章に示したように、どれがビデオ・メモリに保持するこ
とを指定できます。また、必要に応じたロードも指定可能です。これらのスプライトはレベルの
終了時点で捨てられます。コードを用いればこれがある程度制御できます。このため次の関
数があります。
sprite_discard(numb) スプライト用のビデオ・メモリを解放します。スプライトの
load-on-use プロパティが設定されていれば、完全に削除されます。設定のない場合
は、そのコピーがメイン・メモリに保存され、(通常このメモリが大きいからです)再び
必要であればそこからリストアされます。
sprite_restore(numb) スプライトを(ビデオ)メモリにリストア(再び保存)します。
通常、これは必要に応じて自動的に行われます。しかし、これは load-on-use プロパテ
124
ィが設定されて、スプライトが大きいとき、小さな hick-up を起こします。このため、たと
えばルームの始まりでこれを意図的に使用します。
discard_all() load-on-use プロパティが設定されているすべてのスプライト、バッ
クグランドおよびサウンドを削除します。
ゲームは沢山の異なる大きなスプライト・イメージを使用すると、ゲームファイルを大きくして、
そのロード時間が長くなります。また、必要なときこれらをメモリに保存したい場合は、必要な
メモリ容量が大きくなります。もう一つの選択は、スプライトのイメージ(.bmp、.jpg、あるい
は.gif 形式の)を別にして、ゲーム中にロードするように、ゲームと一緒に配布することができ
ます。このため次の三つの関数があります。
sprite_add(fname,imgnumb,precise,transparent,videomem,loadonuse
,xorig,yorig) ファイル fname にあるイメージをスプライト・リソースに追加しま
す。.bmp、.jpg、あるいは.gif 形式のものしか扱えません。.bmp か.jpg のファイル型の
場合は、サブイメージを含むストリップが使用できます。このとき、imgnum の番号を使
います(1 は単一のイメージを意味します)。.gif またはアニメイテッド gif の場合はこ
の引数を使いません。その代わりに gif ファイルのイメージ数を使用します。precise は、
衝突時に厳密な計算を行うか行わないかを指定します。transparent は、イメージが半
透明かそうでないかを指定し、videomem はスプライトがビデオメモリに保存するかし
ないかを指定し、loadonuse は必要に応じたロードが行うか行わないかを指定します。
最後の xorig と yorig はスプライトのオリジンを指定します。この関数は新しいスプラ
イトのインデックス番号を返しますので描画、またはインスタンスの sprite_index に割
り当てることができます。エラーの場合は−1 の値が返されます。
sprite_replace(ind,fname,imgnumb,precise,transparent,videomem,l
oadonuse,xorig,yorig) 上記の関数と同様ですが ind インデックス番号のスプラ
イトが fname にあるスプライトのイメージに変えられます。関数の返す値は置き換えに
成功したかしなかったかに該当する値です。
sprite_delete(ind) ind インデックス番号のスプライトを削除してそのメモリを解
放します(元に戻すことができません)。
注意:プレイ中にゲームをセーブすると、追加されたスプライトあるいは置き換えられたス
プライトはセーブしたゲームと一緒に保存されません。ですから、再ロードのときそれらはもう
現れません。また、著作権に関わる問題で、gif ファイルは無料でないアプリケーションと配布
することができません。このため、この形式のファイルの使用を避けましょう。
35.2 サウンド
次の関数はサウンドの情報を示します。
サウンドは沢山のリソースを使います。また、数多くのシステムは限られた数のサウンドしか
再生できません。規模の大きいゲームを開発すると、メモリにあるサウンドを制御したくなりま
す。load-on-use オプションを使用すれば、サウンドは使用されるときのみ、ロードさせることが
できます。しかし、サウンドが初めて再生されるとき雑音(hick-up 音)を起こします。大きなル
ームの使用もこれを悪化します。制御をより細かく行うために次の関数が使えます。
125
sound_discard(index) サウンドの使用したメモリを解放します。
sound_restore(index) サウンドを再びメモリに格納します。
discard_all() load-on-use オプションをセットされたスプライト、バックグランドおよ
びサウンドをすべて削除します。
作成したゲームがバックグランド・ミュジックのような色々な複雑なサウンドを使う場合は、こ
れらをゲームと一緒に保存しないようにしましょう。保存すると、ゲームファイルは非常に大き
くなります。それより、別途で提供してゲーム中にロードするようにしましょう。これはゲームの
ロード時間を短縮します。このために次の関数があります。
sound_add(fname,buffers,effects,loadonuse) サウンド・リソースをゲーム
に追加します。fname は追加されるサウンドのファイル名です。buffers は使用するバッ
ファ数です。effects は効果を使用するか否かを、loadonuse はサウンドが内部メモリに
保存するか否かを示します(真か偽で)。関数はサウンドのインデックスを返します。こ
れがサウンドの再生に使用できます(エラー、たとえば、ファイルが存在しないときは
−1 が返されます)。
sound_replace(index,fname,buffers,effects,loadonuse) 上記と同様な
ものですが、新規サウンドではなく、index のサウンドが fname のサウンドに変えられ
ます。元のサウンドのメモリが解放されます。操作が正か否かを示す値が返されます。
sound_delete(index) 指定されたサウンドを削除し、そのメモリを解放します。こ
の操作が復帰不能です。
注意:プレイ中にゲームをセーブすると、追加されたサウンドあるいは置き換えられたサウ
ンドはセーブしたゲームと一緒に保存されません。ですから、再ロードのときそれらはもう現
れません。
35.3 バックグランド
次の関数がバックグランドについて情報を示します。
バックグランド・イメージは沢山のメモリを占めます。これらを高速に描画するためにビデ
オ・メモリに保存する必要があります。第18章に示したようにビデオ・メモリに保持されるバッ
クグランドが指定できます。また、必要に応じたロードの指定も可能です。これらのバックグラ
ンドは、レベルの終了時に削除されます。この過程をある程度コードで次の関数を用いれば
制御できます。
background_discard(numb) バックグランド・イメージ用のビデオ・メモリを解放し
ます。バックグランドの load-on-use プロパティが設定されていれば、完全に削除され
ます。設定のない場合は、そのコピーがメイン・メモリに保存され、(通常このメモリ大
きいからです)再び必要であればそこからリストアされます。
126
background_restore(numb) バックグランド・イメージを(ビデオ)メモリにリストア
(再び保存)します。通常、これは必要に応じて自動的に行われます。しかし、これは
load-on-use プロパティが設定されて、バックグランドが大きいのととき、小さな hick-
up を起こします。このため、たとえばルームの始まりでこれを意図的に使用します。
discard_all() load-on-use プロパティが設定されているすべてのスプライト、バッ
クグランドおよびサウンドを削除します。
ゲームは沢山の異なるバックグランド・イメージを使用すると、ゲームファイルを大きくして、そ
のロード時間が長くなります。また、必要なときこれらをメモリに保存したい場合は、必要なメ
モリ容量が大きくなります。もう一つの選択は、スプライトのイメージ(.bmp、.jpg、あるいは.gif
形式の)を別にして、ゲーム中にロードするように、ゲームと一緒に配布することができます。
このため次の三つの関数があります。この方法はプレイヤーにバックグランドを選ばせたいと
きも使います。また、ゲームのイメージを保存してその後にそれをバックグランドとして使うこ
とがあります(例:ペインティング・ソフトのプログラム)。該当関数は次のものです。
background_add(fname,transparent,videomem,loadonuse) ファイル
fname にあるイメージをバックグランド・リソースに追加します。.bmp、および.jpg、(あ
るいは.gif 形式)のものしか扱えません。transparent は、イメージが半透明かそうでな
いかを指定し、videomem はバックグランドがビデオメモリに保存するかしないかを指
定し、loadonuse は必要に応じたロードが行うか行わないかを指定します。この関数
は新しいバックグランドのインデックス番号を返しますので描画、またはインスタンス
の background_index[0]に割り当てて、現在のルームに表示することができます。エラ
ーの場合は-1 の値が返されます。
background_replace(ind,fname,transparent,videomem,loadonuse) 上
記の関数と同様ですが ind インデックス番号のバックグランドが fname にあるバック
グランドのイメージに変えられます。関数の返す値は置き換えに成功したかしなかっ
たかに該当する値です。現在表示されているバックグランドも入れ替えられます。
background_delete(ind) ind インデックス番号のバックグランドを削除してその
メモリを解放します(元に戻すことができません)。
注意:プレイ中にゲームをセーブすると、追加されたバックグランドあるいは置き換えられ
たバックグランドはセーブしたゲームと一緒に保存されません。ですから、再ロードのときそ
れらはもう現れません。また、著作権に関わる問題で、gif ファイルは無料でないアプリケーシ
ョンと配布することができません。このため、この形式のファイルの使用を避けましょう。
35.4 パス
次の関数はパスについて情報を示します。
35.5 スクリプト
次の関数はスクリプトについて情報を示します。
127
35.6 データ・ファイル
次の関数はデータ・フィルについて情報を示します。
データ・ファイルを自動的にゲーム開始時に輸出(エスポート)しないときは、次の関数が使
えます。
35.7 オブジェクト
次の関数はオブジェクトについて情報を示します。
35.8 ルーム
次の関数はルームについて情報を示します。
ルームがゲーム中に変わるため、ルームの内容を変えるために他のルーチンがあります。
128
129
Chapter 36 GML: ファイル、登録、プログラムの実行
より上級レベルのゲームではゲームと一緒に配布されたファイルからデータを読み込みた
いことがあります。たとえば、ゲーム中の幾つかの場面で起こることを指定するファイルを作
成することができます。また、ゲームの再使用のとき関連の情報(現在のルームなど)を保存
したい場合もあります。このために、次の関数があります。
環境設定(Preferences)で安全モードがチェックされていると、上記の幾つかの関数はパ
ス指定ができなくなります。このとき、アプリケーション・フォルダー内のファイルのみ書き換え
られます。
130
次の読み出し専用変数は役に立ちます。
場合によっては、ゲーム中にペレイヤーにコマンド・ラインの入力を許してあげたいことが
あります(たとえば、トリックや特別モードの作成のため)。その引数を得るために次の関数が
使えます。
parameter_count() コマンド・ラインの引数の数を返します(プログラムはその一
つであることに注意)。
parameter_string(n) n 番目のコマンド・ラインの引数を返します。最初の引数は
0 です。これはプログラム名です。
ゲーム実行の間に少量の情報を保存したいときは、ファイル使用より簡単方法があります。
registry(登録)が使えます。この registry はウインドウスが完備して、プログラムの設定に使用
されている大きなデータベースです。その各項目(entry)は名前と値をもっています。この両
方、つまり文字列と実数が次の関数で使用できます。
実は、registry の値はキーでグループ化されています。上記の関数はゲームのために作成さ
れたキーの下にある値を使います。作ったプログラムがこれらの値で実行環境の情報を収
集することができます。その他のキーの値も読めますし、書き換えます。書き換えを行うと簡単
に自分のシステムを破壊することができますので要注意(システムに障害を与えるため、書
き換えが安全モードで禁止です)。キーもグループ化されています。次の関数は
HKEY_CURRENT_USER のグループのキーでしか使えません。ルートのグループが変えら
れます。ですから、たとえば現在の temp(テンポラリ)ディレクトリを取得したいときは、次の命
令を使います。
path = registry_read_string_ext('/Environment','TEMP');
次の関数があります。
registry_write_string_ext(key,name,str) 指定されたキー(key)の下で
name という名前の文字列を registry に作成します。
registry_write_real_ext(key,name,x) 指定されたキー(key)の下で name
という名前の実数を registry に作成します。
registry_read_string_ext(key,name) 指定されたキー(key)の下で name と
いう名前がもっている文字列を返します(name が存在しないとき空列が返されます)。
registry_read_real_ext(key,name) 指定されたキー(key)の下で name とい
う名前がもっている実数を返します(name が存在しないとき0が返されます)。
131
registry_exists_ext(key,name) 指定されたキー(key)の下で name という名
前があるかないかを返します。
registry_set_root(root) 他のルーチンのルートを設定します。次の値を使いま
しょう。
0= HKEY_CURRENT_USER
1= HKEY_LOCAL_MACHINE
2= HKEY_CLASSES_ROOT
3= HKEY_USERS
ゲーム・メーカーが外部のプログラムを起動することもできます。このために
execute_program および execute_shell 二つの関数があります。execute_program の関数は引
数を用いてプログラムを実行し、その終了を待つことができます(待つとき、ゲームを一時停
止することができます)。execute_shell の関数はファイルを開きます。このファイルは関連のあ
る html やワードなどのようなファイルかプログラムです。この関数は実行終了が待てません
のでゲームが一時停止しません。
ユーザーが安全モードを環境設定(preferences)で設定したとき、この両方の関数は機能し
ません。次の読み出し専用変数でこれがチェックできます。
secure_mode* ゲームが安全モードになっているか否かを示します。
132
133
Chapter 37 GML:マルチプレイヤー・ゲーム
コンピュータを相手にしてゲームをプレイするのは楽しいですが、人間を相手にしたのはも
っと楽しいです。このようなゲームは非常に簡単に実現できます。コンピュータを相手にした
ときに必要となる人工知能(AI)の相手を実現しなくてもよいです。もちろん、同一のコンピュ
ータで異なるキーの組み合わせでもう一人の人と対戦したりすることができるが、それよりお
もしろいのは相手は別のコンピュータを使うことです。また、もっといいのは相手は海外の所
にいながら対戦できることです。ゲーム・メーカーはマルチプレイヤーをサポートしています。
同期できて、待つ時間の短くて効率のよいマルチプレイヤー・ゲームの作成が簡単作業では
ありません。この章は可能な作業等を簡潔に説明します。ゲーム・メーカーの web サイトにも
う少しの情報を提供するチュートリアルがあります。
37.1 接続を設定する
コンピュータ間の通信を可能にするために接続のプロトコルが必要です。他のゲームと同
様にゲーム・メーカーでは四つの接続の仕方が使用できます。これは、IPX、TCP/IP、モデム、
およびシリアルです。IPX の接続(実は一つのプロトコル)はユーザから見えない形で動作し
ます。同じローカル・ネットワークの人とのプレイには使用できます。使用するためにコンピュ
ータにインストールされていなければなりません(動かない場合は、ウインドウスのマニュア
ルを参照して下さい。または、コントロール・パネルのネットワークの設定で IPX を追加して
下さい)。TCP/IP はインターネットのプロトコルです。インターネット上の他人とのプレイに使
用できます。このとき相手の IP アドレスが必要です。ローカル・ネットワーク上では IP アドレ
スなしでも使用できます。モデムの接続はモデム経由で行われます。この場合は、モデム設
定用の文字列と電話番号を指定しなければいけません。シリアル接続では直接にコンピュ
ータとコンピュータをつなぎます。この場合はポート番号を設定しなければなりません。GML
ではこれの設定を行うために次の四つの関数が用いられます。
mplay_init_ipx() ipx の接続を初期化します。
mplay_init_tcpip(addr) TCP/IP の接続を初期化します。addr は IP のアドレス
か web アドレスを含む文字列です。たとえば、www.gameplay.com や
123.123.123.12(そして、:12 のようなポート番号)が使えます。セッションに参加すると
きはアドレスを設定しなければなりません(後述を参照)。ローカル・ネットワークでは
アドレスが不要です。
mplay_init_modem(initstr,phonenr) inistr でモデムを初期化します(inistr 文
字列は空でもよい)。ダイヤルする番号(例:0201234567)を phonenr で指定します。
セッションに参加するときはこの番号は必要です。
mplay_init_serial(portno,baudrate,stopbits,parity,flow) シリアル
接続を初期化します。portno はポートの番号(1〜4)であり、baudrate は転送速度
(100〜256K)であり、stopbits はストップ・ビット数(0 は 1 ビット、1 は 1.5 ビット、2 は 2
ビット)であり、parity は奇遇数のチェックの仕方(0 は無し、1 は奇数、2 は偶数、3 は
マーク使用)を指定します。Flow はフロー制御を指定します(0 は無し、1 は
xon/xoff、2 は rts、3 は dtr、4 は rts と dtr)。成功したかどうかを戻り値です。
記述例:mplay_init_serial(1,57600,0,0,4) 。0 を最初の引数にすると、ダイヤログが現
れ、プレイヤーが設定が変更できます。
ゲームは上記の関数のいずれかの一つのみを一回だけ呼びます。何れの関数は設定に成
功したか否かを知らせます。失敗はプロトコルが使用不能場合に起こります。使用可能な接
続があるかどうかをチェックするには次の関数が用いられます。
mplay_connect_status() 現在の使用可能な接続の表す番号を返します。0 は接
続無し、1 は IPX 接続を、2 は TCP/IP 接続を、3 はモデム接続を、4 はシリアル接続を
使用可能と意味します。
接続のセッションを終わらせるために次の関数を用います。
134
mplay_end 現在の接続を終了させます。
次の関数で相手に自分の IP アドレスを知らせることができます。
37.2 セッションの作成、セッションへの参加
ネットワークに接続すると、そのとき同ネットワークに幾つかのゲームが行われている可能
性があります。ここではこれらをセッションといいます。これらのセッションは異なるゲームか
同一のゲームであるかもしれません。ゲームはネットワーク上で自分の存在を明確にしなけ
ればなりません。しかし、幸いにゲーム・メーカーがこれをやってくれます。ただし、ゲームの id
をオプションで変えるとゲームの id(識別情報)が変わることを覚えておきましょう。これを使
えば、ゲームの古い版のプレイヤーが新版のと対戦しないように設定できます。
新しいマルチプレイヤーゲームを開始したい場合は、新セッションを作成しなければなりませ
ん。このとき次の関数を使います。
mplay_session_create(sesname,playnumb,playername) 現在の接続上で
新セッションを作成します。sesname は新セッションの名前になります。playnumb は最
大のプレイヤー数です(任意に設定したい場合は 0 を使用します)。playname は自分
のプレイヤー名です。作成の成功を表す値を返します。
ゲームの一つのインスタンスがセッションを作成しなければなりません。その他のインスタン
スがセッションに参加するだけです。実は、これはもう少しい複雑ですが。まず、参加可能なセ
ッションをみて、決めます。このために次の三つの重要な関数があります。
mplay_session_find() プレイヤーがまだ参加できるセッションを探して、その数を
返します。
mplay_session_name(numb) numb という番号(0 は最初のセッション)のセッショ
ン名を返します。これは前の関数の実行後にしか使えません。
mplay_session_join(numb,playername) numb で指定したセッションに参加さ
せます(0 は最初のセッション)。playername はそのセッションでのあなたのプレイヤー
名になります。参加に成功したかどうかを表す値を返します。
次の関数でセッション・モードを変えることができます。セッション作成の前に実行すべきです。
mplay_session_mode(move) セッションのホストコンピュータを別のコンピュータ
に移動するかどうかを設定します(現行のホストが終了時)。move は真か偽(デフォ
ルト)かの値を取ります。
現在のセッションの状態を調べるには次の関数を使います。
プレイヤーが次の関数でセッションを終了することができます。
135
37.3 プレイヤー
セッションに参加する各ゲームは一つのプレイヤーになります。プレイヤーが名前をもちま
す。プレイヤー対応の関数には次のものがあります。
mplay_player_find() 現行のセッションのプレイヤー数を返します。
mplay_player_name(numb) numb 番号のプレイヤー名を返します(0 は最初のプ
レイヤーで、自分の番号になります)。これは前の関数の実行後にしか使えません。
mplay_player_id(numb) numb 番号の id を返します(0 は最初のプレイヤーで、自
分の番号になります)。この関数も前の最初の関数の実行後にしか使えません。この
id はメッセージの送受信に使います。
37.4 共有データ
共有データの使用は、ゲームを同期させるには一番簡単な方法です。通信はバックグラン
ド(見えないところ)で行われます。1万個の値が共用できます。ゲームの各成分はこれらにア
クセスすることができます。ゲーム・メーカーは皆同じ値をみることを保証します。これらの値
は実数か文字列です。このための関数が二つあります。
コンピュータ間のデータを一致(同期)させるために保証モード(遅い方)と保証無しモード
が使えます。このモードの変更には次の関数を用います。
37.5 メッセージ
ゲーム・メーカーでサポートされているのもう一つの通信仕組みはメッセージの送受信で
す。一つのプレイヤーがもう一つのプレイヤーかすべてのプレイヤーにメッセージを送ること
ができます。プレイヤーがメッセージをみて、それに対応したことをしたりすることができます。
メッセージも保証モード(遅い)か保証無しモード(速い)で送られます。メッセージ専用関数
には次のものがあります。
mplay_message_send(player,id,val) player(識別子か名前)のプレイヤー(0
はすべてのプレイヤー)に val というメッセージを送ります。id はメッセージの識別番
号です。非保証モードの転送です。
mplay_message_send_guaranteed(player,id,val) player(識別子か名前)
のプレイヤー(0 はすべてのプレイヤー)に val というメッセージを送ります。id はメッセ
ージの識別番号です。保証モードの転送です。
mplay_message_receive(player) player(識別子か名前)のプレイヤー(0 は何
れのプレイヤー)から送られているメッセージ列から次のメッセージを受け取ります。
メッセージかあったか否かを表す値を返します。新しいメッセージがあった場合は、次
の関数が使用できます。
mplay_message_id() 最後に受信したメッセージの識別番号を返します。
mplay_message_value() 最後に受信したメッセージの値を返します。
mplay_message_player() 最後に受信したメッセージの送ったプレイヤーを返しま
す。
mplay_message_name() 最後に受信したメッセージの送ったプレイヤー名を返しま
す。
136
mplay_message_count(player) player からまだ読み出していないメッセージ数
を返します(0 使うとすべて残っているメッセージが数えられます)。
mplay_message_clear(player) player からまだ読み出していないメッセージ数
をすべて削除します(0 使うとすべて残っているメッセージが消去されます)。
ここでもう少し説明しましょう。まず、特定のプレイヤーにのみメッセージを送りたい場合は、そ
のプレイヤーの id が必要です。前に示したように mplayer_player_id()の関数でその id が取
得できます。この id も受信のときも使います。選択ですが、プレイヤーの名前を文字列で指定
することもできます。多数のプレイヤーが同一名をもつ場合は、最初のプレイヤーだけメッセ
ージを受信します。
なぜ各メッセージが識別番号があると疑問に思うのでしょうか。これがアプリケーションに
異なるタイプのメッセージが送られることを可能にします。受信側が識別番号でメッセージに
対応するアクションを選択することができます(通常メッセージは非保証で送られるので、二
つのメッセージに分けて識別値と値を送るのは問題を起こします)。
137
138
Chapter 38 GML:DLL の使用
GML の機能が十分ではない場合は、機能の拡張に plug-in が使用できます。Plug-in は
DLL(Dynamic Link Library)ファイル形式で使います。その DLL ファイルで関数を定義する
ことができます。その関数は DLL をサポートするどんな言語でも作成できます(Delphi
、Visual C++、Visual Basic 等)。もちろんそのために、プログラミングの能力が不可欠です。こ
の plug-in 関数は特定の形式にしたがって作ります。これらの関数は、ゼロから 12 個までの
引数をもつことができます。引数は実数(Cでは double)かヌル(null)を末尾にもつ文字列の
何れか一つのタイプのものです(現在、4つ以上の引数の場合は実数しか使えません)。また、
これらの関数を返すものは、実数かヌルを末尾にもつ文字列だけです。
library MyDLL;
begin
end.
external_define(dll,name,calltype,restype,argnumb,arg1type,arg2
type,…) 外部関数を定義します。dll は dll 型のファイル名です。name は関数の名前
です。calltype は呼び出し方です。ここで dll_cdecl と dll_stdcall が使えます。restype は
結果のタイプを指定します。タイプ指定には ty_real または ty_string を使います。
argnumb は引数の数を指定します(0〜12)。これらのタイプを指定しなければなりま
せん。タイプ指定には ty_real または ty_string を使います。4つ以上の引数の場合は
すべてが実数(ty_real)でなければなりません。
139
この関数がその関数を外部から呼び出すときに必要となる関数の id を返しますので、上記
の例のためにゲームのスタートに次のような GML コードが必要です。
{
global.mmm = external_define('MYOWN.DLL','MyMin',dll_dcecl,
ty_real,2,ty_real,ty_real);
global.ddd = external_define('MYOWN.DLL','DoubleString',dll_dcecl,
ty_string,1,ty_string);
}
関数を呼び出す必要であれば、次の関数を使います。
ですから、次のような記述を使います。
{
aaa = external_call(global.mmm,x,y);
sss = external_call(global.ddd,'Hello');
}
また、DLL に実行可能なスクリプトのファイルを作成させることができます(この関数はその
後ゲームの動作を変更させるにも使えます)。
このように外部の関数を呼んで、返された文字列が次のように実行できます。
{
ccc = external_call(global.mmm,x,y);
execute_string(ccc);
}
滅多に必要はないが、DLL がゲームのメイン・グラフィックスを扱い方(ハンドル)が知らなけ
ればなりません。これは次の関数で実現でき、その結果は DLL に渡せます。
window_handle() メイン・ウインドウのハンドルを返します。
DLL は安全モードで使用できないことに注意しましょう。
140