You are on page 1of 140

Designing Games with Game Maker

version 5.0(April 14, 2003)

Mark Overmars 著

ゲーム・メーカーを使ったゲーム設計

日本語初版:平成 15 年 10 月

Alberto Palacios Pawlovsky 訳

桐蔭横浜大学・工学部・電子情報工学科
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章でご覧下さい。)画面の左にはゲームのリソー
スが出ています。上から、スプライト、サウンド、バックグランド、オブジェクトおよびルームがあ
り、次いでゲームの情報とゲームのオプションが並んでいます。一番上に、ワープロなどでよく
見かけるメニューとその下にあるツールバーが見られます。この章では、メニューの項目やボ
タンなどを説明します。その他の章ではこれらの幾つかをさらに詳細に説明します。以下の
説明でも分かるのですが、同様な操作がメニュー項目の選択でも、ボタンでも、リソース上の
マウスの右クリックでも可能です。

6.1 File メニュー


 File メニューで通常の「ファイルを開く」や「保存」などがありますが、特別なものには、
・ New:新しいゲームを作成するときこのコマンドを使います。もし、そのとき開いている
ゲームが更新された場合はそのゲームを保存するか否かが問われます。ツ−ル・バー
の白い紙のようなボタンでも同様のことができます。
・ Open:ゲームを開きます。ゲーム・メーカーのファイルは.gmd 拡張子をもっています。
ツール・バーの開いているフォルダーはこの機能を持つボタンです。また、ゲームをゲ
ーム・メーカーのウインドウ上に引っ張ればゲームを開くことができます。
・ Recent Files:この項目で最近使用したファイルを再び開くことができます。
・ Save:現在の名前でゲームの設計ファイルを保存します。名前が付けられていないと
き、名前が要求されます。ファイルが更新されたときのみこの項目が有向です。この項
目用のボタンもあります。
・ Save As:別名でゲームの設計ファイルを保存します。この項目でファイル名が要求さ
れます。
・ Create Executable:他人に配布できるゲームのバーションを作るときはこれを使いま
す。この項目の使用で独立に使用できる(スタンド・アロン)ゲームが作成されます。
実行可能な形式のゲームが作成されます。ゲーム配布について第14章でより詳細に
述べます。

16
・ Advance Mode:この項目を選択しますと、ゲーム・メーカーはシンプル・モードとアド
バンス・モードとの間の切り替えを行います。アドバンス・モードで他の選択やリソー
スが使用可能になります。
・ Exit:自明でしょう。これを選択しますとゲーム・メーカーが終了します。現
在開かれているゲームが更新されていれば、そのセーブが行うか否かが問わ
れます。

6.2 Edit メニュー


 編集メニューは現在選択されているリソース(オブジェクト、スプライト、サウンド等)またリ
ソースのグループに関連のあるコマンドを含んでいます。リソースのタイプによって使えない
コマンドがあります。
・ Insert resource:現在選択されているリソースの前に同タイプのものを新作します。
挿入されるリソースの特徴(プロパティ)を設定するためのフォームがが開いてきます。
以下の章でその詳細について述べます。
・ Duplicate:現在のリソースをコピーして追加します。フォームが現れ、リソースが変更
できます。
・ Delete:選択されているリソース(またはグループ)を削除します。これは元に戻すこと
ができないため、注意しましょう。もちろん、該当する注意が表示されます。
・ Rename:リソースに新しい名前を付きます。リソースのプロパティ・フォームでもこれ
が行えます。また、リソースを選択してその名前をクリックすれば、同じことができます。
・ Properties:プロパティを編集するためのフォームを表示させるにはこのコマンドを使
います。プロパティ・フォームはメイン・フォーム内に表示されます。つまり、幾つかのが
同時に編集できます。プロパティ編集がリソースの上にダブルクリックでも可能です。
 これらのコマンドを次の別の方法でも与えられます。リソースかリソース・グループ上に右
クリックすると、該当のポップアップメニューが表示されます。

6.3 Add メニュー


 各タイプのリソースをこのメニューで追加することができます。これらの各々にはツール・バ
ーのボタンもキー・ショットカットもあります。

6.4 Window メニュー


 メイン・フォームのプロパティ・ウインドウを扱うためのコマンドはこのメニューにあります。
・ Cascade:ウインドウのすべてが見えるようにカスケードに並べます
・ Arrange Icons:アイコン化されたウインドウ・プロパティを整理します(メイン・フォーム
をリサイズするとき便利)
・ Close All:変更を保存するかを伺いながら、すべてのプロパティ・ウインドウを閉じま

6.5 Help メニュー


 ヘルプに関連の役立つコマンドには次のものがあります。
・ Contents:この資料のオンライン・バーションにアクセスできます。
・ How to use help:ヘルプの使用についてのヘルプ情報が表示されます。
・ Registration:ゲーム・メーカーは無料で使用することができるが、登録をお
薦めします。登録するとナッグ・画面が消え、ゲーム・メーカーの開発に貢
献できるようになります。この項目で登録の仕方に関する情報が表示されま
す。登録後、登録のキーを用いて登録情報の記入が可能です。
・ Web site:ゲーム・メーカーのウエーブ・サイトに接続します。そこで最新情報やゲーム
のコレクションやリソースなどが公開されています。このサイトを一ヶ月に一回見てい
ただきたいです。

17
・ Forum:ゲーム・メーカーの情報交換のフォーラムに接続します。そこで質
問したり、情報を得たりすることなどができます。
・ About Game Maker:ゲーム・メーカーのバーションについて情報を表示します。

6.6 リソース・エクスプローラ
 メイン画面の左にはリソース・エクスプローラが出ています。ツリーのような階層でゲーム
のリソースが見られます。ウインドウのエクスプローラと同様なものです。項目の前の四角に
プラス(+)があるとき、それをクリックすれば項目内のリソースが見られます。マイナス(−)に
変わった四角を再びクリックすれば項目のみ表示されます。項目内のリソースをワン・クリッ
クで選択した後、その名前が変えられます。しかし、項目名が変えられません。リソース上をダ
ブル・クリックすると、そのプロパティを変更することができます。右ボタンのクリックでも Edit
メニューのコマンドが起動できます。ドラッグで項目やグループの位置が変えられます。もち
ろん、妥当なところに移動しないとだめです(駄目な例:サウンドをスプライトに移動する)。

18
Chapter 7 スプライトの定義
 スプライトは、ゲームのオブジェクトの外観です。スプライトは、ドロー・ソフトで作成された
一つのイメージか、あるいは動きを表現するイメージの集まりです。たとえば、次のイメージは
右に移動するパックマン用のスプライトです。

 ゲームを作るときは、まずゲーム用のスプライトを集めます。ゲーム・メーカーのサイトでは
通常のスプライトとアニメイテッド(動きのある)スプライト両方が提供されています。その他
のスプライトはインターネットで探すことができます。通常アニメイテッド gif のものが多いです。

 スプライトを追加するときは、Add のメニューから Add Sprite の項目を使用します。また、


ツール・バーの該当ボタンを使います。このとき、次のフォームが現れます。

 一番上にスプライトの名前を記入します。スプライト(他のリソースも)すべてが名前をもっ
ています。できるだけスプライトの役割を分かりやすくする名前を与えましょう。また、すべての
リソースには異なる名前をもたせましょう。決まりではないが、英字で始まる英数字、アンダ
ー・バー( _ )からなるもののみをスプライト(他のリソース)の名付けに使いましょう。スペー
ス(空白)を極力に使わないで下さい。これは、特にコードを用いるときは重要となります。

 スプライトをロードするために Load Sprite のボタンをクリックします。標準のダイアログが


表示され、そこでロードしたいスプライトを指定します。ゲーム・メーカーは幾つかの種類のグ
ラフィクス・ファイルをロードすることができます。アニメイテッド gif 型ファイルをロードするとき
は、このファイルのサーブ・イメージがスプライトを構成します。スプライトがロードされると最
初のイメージが右の枠に表示されます。多数のイメージがある場合は、矢印のキーでこれら
を眺めることができます。

Transparent のチェックボックスは、スプライトのバックグランドが透明に設定するかを表しま
す。ほとんどのスプライトのバックグランドは透明です。このバックグランド色はイメージの一
番左下のピックセルで決まります。このため、その他のピクセルがこの色を持っていないこと
を確認しなければなりません(gif イメージが自分の透明色を定義しますが、これはゲーム・メ
ーカーでは使用しません)。

19
Edit Sprite のボタンでスプライトの編集もでき、新しいスプライトの作成もできます。作成や
編集についての詳細については第14章に述べます。

20
Chapter 8 サウンドとミュージック
 ほとんどのゲームはサウンド効果およびバックグランド・ミュージックを使用します。役に立
つ幾つかのサウンドはゲーム・メーカーのサイトにあります。インターネットでその他数多くの
サウンドが手に入れられます。

 ゲームにサウンド・リソースを追加するときは、Add メニューの Add Sound の項目を使用


します。または、ツール・バーの該当ボタンを使います。この項目の選択で次のフォームが現
れます。

 サウンドをロードするために Load Sound のボタンを押します。ファイル選択用のダイアロ


グが表示され、サウンド・ファイルの選択ができます。サウンド・ファイルはタイプが wave 型お
よび midi 型二つあります(MP3 ファイルについては第17章を参照)。Wave ファイルは短いサ
ウンド効果に用います。このファイルは、大きなメモリを使用するが、迅速に再生されます。サ
ウンド効果にこのタイプのファイルを使用しましょう。Midi ファイルは異なる形でミュージック
を表現します。このため、wave ファイルより小さなメモリを使用します。しかし、その用途はバ
ックグランド・インストルメンタル・ミュージックに限られています。また、サウンド効果(wave サ
ウンド)と異なって、ある時点で一つの midi サウンドしか再生できません。

 ミュージック・ファイルをロードすると、その種類と時間の長さが表示されます。プレイ・ボタ
ンでサウンドの再生ができます。Save Sound を使えば、現在のサウンドをファイルに保存する
ことができます。このボタンが重要はないが、損失した元のサウンドのときに必要になります。

21
Chapter 9 バックグランド
 三番目の基本的なリソース・タイプはバックグランドです。通常、バックグランドは、ゲーム
のルームの下敷きに使用できる大きなイメージです。ほとんどの場合は、タイルのようにマス
目を埋めるようなものです。この場合は、画面はパターンで埋めることができます。タイルの
幾つかがゲーム・メーカーのサイトにあります。インターネットでその他数多くのものがありま
す。

 ゲームにバックグランド・リソースを追加するとき、Add メニューの Add Background 項目


を選択します。また、ツール・バーの該当ボタンを押します。この項目を使用すると、次のフォ
ームが表示されます。

 バックグランド・イメージをロードするには、Load Background のボタンを押します。ゲー


ム・メーカーは色々なイメージのフォーマートをサポートします。ただし、アニメイテッド・イメー
ジが使用できません。Transparent のチェックボックスでバックグランドの(半)透明度が指定
できますが、通常バックグランドではこれをチェックしません。使用したとき、透明色はイメージ
の一番左下のピクセルの色に設定されます。

 Edit Background のボタンでバックグランドの変更、あるいは新作成ができます。詳細に


ついて第18章をご覧ください。

22
23
Chapter 10 オブジェクトの定義
 ここまで、ゲームにはイメージやサウンド等を追加できても、これら自身は何もしません。そ
こで、ここではゲーム・メーカーの最も重要リソースであるオブジェクトについて述べます。オ
ブジェクトは、ゲームの「役」であり、動作するものです。オブジェクトを見えるものにするため
に外観としてスプライトが割り当てられます。オブジェクトはイベントに反応できるために動作
するものになっています。バックグランドを除けばゲーム内に見えるものはすべてオブジェクト
です(明確に言うと、オブジェクトのインスタンス(オブジェクトの一つの出現)です)。キャラク
ターや、モンスターや、ボールや、壁等は皆オブジェクトです。もちろん、ゲームの場面を制御
するような見えないオブジェクトもあります。

 スプライトとオブジェクトの違いをよく理解しましょう。スプライトは、動作しない、ただ単に
(アニメイテッド)イメージです。オブジェクトの外観はスプライトですが、オブジェクトが動作可
能なものです。オブジェクト無しでゲームが作れません!

 オブジェクトとインスタンスの違いも理解していただきたいです。オブジェクトはモンスター
のようなゲームのエンティティ(主役など)を定義します。ゲームには、このオブジェクトの多数
のインスタンス(出現)があり得ます。インスタンスについて語るときは、オブジェクトの特定の
インスタンスのことを意味します。オブジェクトについて語るときは、すべてのインスタンスのこ
とを意味します。

ゲームにオブジェクトを追加するために、Add のメニューから Add Object を選択します。する


と、次のウインドウが現れます。

これは少々複雑です。左にはオブジェクトの一般的な情報があります。真ん中にオブジェクト
に起こり得るイベント・リストがあります。詳細について次の章を見てください。右には、オブジ
ェクトの行えるアクションがあります。これについては第12章に述べます

 いつもの通りオブジェクトにも名前を与えてください。名前を与えた後、オブジェクトのスプ
ライトを指定します。このため、スプライトの欄に左クリックするか、その欄の隣にあるメニュ
ー・ボタンを使用します。すると、使用できるスプライトのメニューが現れます。そこからオブジ
ェクトに対応させたいスプライトを選びます。スプライト欄の下に二つのチェックボックスがあ
ります。Solid の名札のものは、壁のような固体を指します。固体であるものとの衝突と、固体
でないものとの衝突とは、その扱いは違います。この詳細について次の章を見てください。
Visible は見えるものを意味します。明らかに、ほとんどのオブジェクトは可視です。しかし、場

24
合によっては透明のものが便利です。たとえば、モンスターの通り道に使用できます。透明の
オブジェクトは他のオブジェクトにぶつかるとき、およびイベントに反応します。

25
Chapter 11 イベント
 ゲーム・メーカーはイベント・ドリブンというアプローチを用いています。つまり、いずれの場
合でもオブジェクトのインスタンスはイベント(起こったことを知らせるメッセージのようなも
の)をゲットします。インスタンスはこのメッセージに反応してアクションを行います。オブジェク
ト毎に、どのようなイベントにどのように反応してアクションするのを設定しなければなりませ
ん。複雑に聞こえるが、実は簡単に行えます。まず、ほとんどのイベントに対してはオブジェクト
が何も反応しなくててもよいのケースが多いです。対象になるイベントに対しては、ドラッグ・
アンド・ドロップ操作で該当するアクションを指定することが容易にできます。

 オブジェクトのプロパティ・ウインドウ(下図を参照)の真ん中にオブジェクトが反応しなけ
ればならないイベント・リストがあるいます。このリストに Add Event のボタンでイベントを追
加することができます。このボタンを押しますと、選択できるイベントが現れます。項目によって
サブメニューの選択も可能になります。たとえば、キー・ボードのイベントでは対象のキーを選
択しなければなりません。これらは異なるイベントです。この次には、完全なリストと説明を述
べます。図の暗くなっているイベントは現在編集中のものです。対象のイベントを変えたいと
きは、イベントの上に(左)クリックします。その右に小さなアイコンで表示されているのは、こ
のイベントに対応するアクションです。ウインドウの一番右にはこれらのアクションはタッブ付
きページで分類されています。次の章ですべてのアクションについて述べ、これらが何をする
かを説明します。イベントとアクションの間にアクション・リストがあります。このリストには現
在のイベントのとき行うべきのアクションが表示されます。アクションを追加するときは、ウイン
ドウの右からアクションをマウスでドラッグしてこのリストに引っ張ります。リストに簡単な説明
と一緒に並べられます。アクションを追加しますと、その設定が要求されます。これについても
次章で述べます。幾つかのアクションを追加すると、図のような状況になります。

 その他のイベントに同様にアクションを追加することができます。イベントを選択するとき、
そのイベントを左クリックで選びます(ボタンが暗くなります)。そして、そのイベントにアクショ
ンを追加します。

 リストにあるアクションの位置がドラッグ・アンド・ドロップで変えられます。<Ctrl>キーを押
したままアクションをドラッグすると、そのアクションがコピーされます。オブジェクト同士のア
クション・リスト間のドラッグ・アンド・ドロップも可能です。アクションの上にマウスを右クリック
すると、メニューが現れ、アクションの削除(<Del>キーでも可能)や、コピーやペストなどが施
行できます。マウスをアクションの上に移動して止めると、アクションの説明が表示されます。
アクションの詳細については次の章で述べます。

26
 現在のイベントと関連のアクションすべてを削除するには、Delete ボタンを使用します(ア
クションのないイベントは、オブジェクト・プロパティを閉じるときに自動的に削除されます)。
イベントを変えたいときは、Change ボタンを押して、他のイベントを選択します(ただし、既に
定義されているイベントを再び選択することができません)。

 上記に説明したようにイベントを追加するときは、Add Event を押します。このボタンを押


すと、次のポップ・アップ・フォームが現れます。

ここから、追加したいイベントを選びます。イベントによっては、更にサーブ・メ
ニューを表示するものがあります。以下ではこれらのイベントを説明します(通常、
この中から少数しか使わないことを覚えましょう)。

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 イベント
 インスタンスは可視のとき、ゲームの各ステップに自分のスプライトをスクリーンに表示し
ます。このイベントでアクションを指定すると、スプライトが表示されないで、その代わり指定
されたアクションが実行されます。これは、スプライトの代わり他のものを表示するには用い
られます。または、スプライトの引数の変更に使用します。ドローイング・イベントに専用化さ
れたアクションがいくつあります。このイベントはオブジェクトが可視のときのみ実行されます。
もちろん、描き方と関係ないでコリーション・イベントの発生がインスタンスのスプライトのみ
に基づいています。

Key Press イベント


 このイベントはキー・ボードのイベントと同様ですが、発生するのは一回のみ、キーが押さ
れるときのみです。アクションを一回だけ起こさせたいときにこれは便利です。

Key Release イベント


 このイベントはキー・ボードのイベントと同様ですが、発生するのは一回のみ、キーを解放
するときのみです。

色々な場面でゲーム・メーカがどの順序でイベントを処理することが理解する必要がありま
す。この処理順序は次の通りです。

 開始ステップ・イベント
 アラーム・イベント
 キー・ボード、キー押す、キー解放のイベント
 マウス・イベント
 通常のステップ・イベント
 (すべてのインスタンスが新位置に設定される)
 衝突イベント
 終了ステップ・イベント
 ドローウイング・イベント

29
発生、破壊、またはその該当のことが発生するとき。

30
Chapter 12 アクション
 アクションはゲーム・メーカーで起こる物事です。アクションはオブジェクトのイベントに置
かれます。イベントが発生すれば、そのアクションが起動されます。数多くのアクションがあり、
それぞれの使い方を理解する必要があります。この章では基本的なアクションのすべてにつ
いて述べます。他のアクションはライブラリ(アクションの集まり)の形で提供することができま
す。これらはゲーム・メーカーの機能を拡張します。ウエブ・サイトにアクセスして追加できるア
クション・ライブラリについて確認しましょう。

  オブジェクトのプロパティ・フォームの右には、アクションがタッブ付きのページで分類され
ています。アクションのセットが7つです。セットがタッブのクリックで選択できます。アクション
の上にマウスを止めるとアクションの機能について簡潔な説明が表示されます。

 繰り返してみましょう。イベントにアクションを付けるには、該当のタッブ・ページからアクシ
ョンをリストにドラッグします。リスト内の順序を変えるには移動したいアクションをドラッグし
ます。<Ctrl> キーを押したまま一つのアクションをドラッグするとそのアクションがコピーされ
ます(オブジェクト同士のリスト間でもこれは可能です)。アクションを削除するときには、マウ
スの右クリックを用います(<Del>も使えます)。マウスの右クリックでもコピーやペストもでき
ます。

 アクションをリストにドロップすると、ほとんどの場合はアクションの設定用のウインドウが
現れます。多数のアクションには2種類のパラメーターがあります。ウインドウの上部にアクシ
ョンの対象になるインスタンスを指定することができます。デフォルトは、(オブジェクトのイン
スタンス)自分自身です。ほとんどの場合は、デフォルトの設定を使用します。コリーション・イ
ベントの場合は、他方のインスタンスにアクションを適用できます。たとえば、他方のインスタ
ンスを破壊することができます。また、アクションを特定のオブジェクトのすべてのインスタン
スに適用することが選択できます。これで、たとえばすべての赤ボールを青ボールに変換する
ことができます。もう一つのパラメーターはチェック・ボックス Relative にあります。このボック
スをチェックすると、設定で記入する値は現在値に対して相対値になります。これで、たとえ
ば現在のスコアーを変えずに、これに何かを増加したりすることができます。その他のパラメ
ーターについては後述します。パラメーターの変更はアクジョン上のダブル・クリックで行えま
す。

12.1 移動・アクション
 最初のアクション・セットはオブジェクトの移動(動き)についてです。そのために次のアク
ションがあります。

Start moving in a direction


 インスタンスにある方向へ動かせるために、このアクションを用います。方向を設定ウインド
ウの矢印で指定します。矢印の真ん中にあるボタンで動きを止めます。動きのスピードの設
定も必要です。このスピードは、ピクセル数/ステップ で与えます。デフォルト値は8です。
できるだけ否定値を使わないでください。多数方向が同時に指定できます。この場合は、ラン
ダムに方向が選ばれます。このようにモンスターに左右に動かせます。

Set direction and speed of motion


 方向と速度を設定するための二番目の方法です(青い矢印のもので)。この設定では、よ
り精密な方向が設定できます。これは 0〜360 の角度で与えます。0 は右を、90度は上を意
味します。方向は反時計回りになります。ランダムな設定は random(360)の記入で実現で
きます。後述で分かるように、random は指定の数字より小さいランダム数を生成します。設
定画面には Relative のチェック・ボックスがあり、チェックされると、指定された値は現在の値
に加えられます。たとえば、インスタンスが上に移動している場合は、設定で左が加えられる
と、インスタンスは北西に動き出します。

31
Set the horizontal speed
 インスタンスのスピードは垂直の成分と水平の成分で構成されます。このアクションでは
水平の速度を変えます。肯定の水平スピードは右方向のものになります。否定のは左方向
になります。垂直のスピードは変わりません。相対(relative)を使うと肯定値で加速、否定値
で減速の設定が可能です。

Set the vertical speed


 上述と同様にこのアクションでは、インスタンスの垂直速度を変えます。

Move towards a point


 このアクションでも移動の設定が可能です。目的位置と速度を設定すると、インスタンスは
その位置に向かって指定された速度で動き出します(その位置に止まらないことに注意!)。
たとえば、弾丸を宇宙船の位置に飛ばせたいときは、spaceship.x、および
spaceship.y を位置として使えます(このような変数について後で述べます)。相対
(Relative)のボックスをチェックすると、方向は現在の方向に対して設定されます(スピード
に適用されません。つまり、指定された速度でインスタンスが移動します)。

Set a path for the instance


 (アドバンス・モードだけで有効)このアクションは、インスタンスをあるパスを通るように指
定できます。パスを指定し、パス上のスタート位置(0:パスのスタート点、1:パスの終了点)、
移動速度も指定します。第21章のパスについての説明をご覧下さい。

Set the gravity


 このアクションでオブジェクトの引力を設定することができます。方向(0〜360 度)とスピー
ドを指定すると、これらの値はステップ毎にインスタンスのそれぞれの現在値に加えられます。
通常、小さな増加分しか必要はないです(例:0.01)。古典的な方向は 270 度(下)方向です。
相対(Relative)のボックスをチェックすると、引力の速度と方向が増加されます。自然と違っ
て、物事に異なる引力方向を与えることができます。

Set the friction


 摩擦はインスタンスの動きを遅くするものです。摩擦量を設定すると、各ステップにこの摩
擦量が速度からその値がゼロになるまで引かれます。通常小さな値です(例:0.01)。

Jump to a given position


 このアクションを用いると、インスタンスをある特定の場所に移動することができます。x,y
の座標を指定しますと、インスタンスとそのリファレンス・ポイントはそこに置かれます。相対(
Relative)ボックスをチェックすると、現在の位置に対する移動が行われます。このアクション
はインスタンスを連続的に移動するにはよく用いられます。各ステップに位置を少々増加しま
す。

Jump to the start position


 このアクションでインスタンスをインスタンスの生成時の位置に戻します。

Jump to a random position


 このアクションはインスタンスをランダムに生成された位置に移動します。固体にぶつから
ない位置しか選択されません。スナピングの設置もできます。肯定のスナピングを指定すると、
x,y の座標値はその倍数になります。これは、ゲームにセルを使った場合は、インスタンスを
セルに沿って並ばせるために使えます。垂直と水平の別々のスナピングが指定できます。

Snap to grid

32
 このアクションでインスタンスの位置をグリッドにフィットさせます。横と縦のスナピングの値
(グリッドのセル・サイズ)が設定できます。これはインスタンスをグリッド内に置かせるには便
利です。

Reverse horizontal direction


 このアクションでインスタンスの横の移動方向を逆にします。これは、たとえばインスタンス
は垂直の壁にぶつかったときに使えます。

Reverse vertical direction


 このアクションでインスタンスの縦の移動方向を逆にします。これは、たとえばインスタンス
は水平の壁にぶつかったときに使えます。

Move to contact position


 このアクションで他のオブジェクトに接触するまでインスタンスをある方向に動かすことが
できる。現在の位置に衝突があった場合は、インスタンスが移動されません。その代わりに、
インスタンスが衝突前の位置に戻されます。移動方向だけでなく、最大の移動距離も指定で
きます。インスタンスが落ちているとき、他のものに接触するまでの最大距離を指定できます。
また、固体のオブジェクトかすべてのオブジェクトを対象にするかが指定できます。通常、この
アクションを衝突イベントに置き、衝突に関わる他のインスタンスに対して、該当のインスタン
スを確実に停止させるために使います。

Bounce against objects


 このアクションを他方のオブジェクトとの衝突イベントに置くと、該当のインスタンスがその
オブジェクトにぶつかるとき、自然にはねて離れます。厳密(preci-se)というパラメーターを
false に設定すると、垂直と水平の壁にしか対応しません。厳密(precise)を true にすると、斜
面(もしくは曲線状の)壁も対象になります。しかし、処理が遅くなります。すべてのオブジェク
トかあるいは固体オブジェクトかが選択できます。はね方は多数のプロパティに依存している
ため、完璧なものではありません。しかし、ほとんどの場合は十分によい効果をもたらします。

12.2 main1 のアクション


 次のアクションは、サウンド、ルーム、及びオブジェクトのインスタンスの生成、変更、破壊に
関するものです。

Create an instance of an object


 このアクションでオブジェクトのインスタンスを生成することができます。生成するオブジェ
クトとその位置を指定します。相対(Relative)ボックスをチェックすると、新インスタンスの位
置は現在のインスタンスの位置に相対的なものになります。ゲーム中にインスタンスの生成
ができるのはとても便利です。宇宙船が弾丸を生成したり、爆弾が爆発を生成したりすること
ができます。ゲームによって、コントローラが設けられ、そのコントローラが時々モンスターや
他のオブジェクトを生成します。新インスタンスにはクリエーション・イベントが施されます。

Change the instance


 このアクションで現在のインスタンスを他のオブジェクトのインスタンスに変換することが
できます。たとえば、爆弾のインスタンスを爆発のインスタンスに変えられます。元の移動方
向や変数の値などの設定は変わりません。現行のインスタンスにデストロイ(破壊)・イベント
を施すか、および新オブジェクトにクリエーション・イベントを施すかが指定できます。

Destroy the instance


 このアクションで現在のインスタンスを破壊します。デストロイ・イベントはこのインスタンス
に施されます。

33
Destroy instances at a position
 このアクションで特定の座標を含むバウンディング・ボックスのインスタンスをすべて破壊
します。これは、爆弾を爆発させるときには、便利です。相対(Relati-ve)ボックスをチェックす
ると、指定の位置は現在の位置に対して相対的に計算されます。

Change the sprite


 インスタンスのスプライトを変えるときにこのアクションを使います。新スプライトを指定し
ます。スケール係数(ファクター)も指定できます。その値(倍率)は 1 のとき、スケール(サイズ
変更)無しを意味します。この値は 0 以上でなければなりません。スプライトをスケーリングし
ますと、描画作業は遅くなります。スプライトの変更はとても重要なものです。たとえば、オブ
ジェクトの移動方向によってそのスプライトを変えたくなることが多いです。これは方向毎に
スプライトを作れば、実現できます。キーボード・イベント内の矢印のキーで移動方向とスプラ
イトを設定します。

Play a sound
 このアクションでサウンド・リソースを再生します。サウンドの指定および再生回数が指定
できます。デフォルトは一回であり、永遠に(ループ)の再生も選択できます。多数の wave 型
のサウンドが同時に再生できますが、midi 型のものの再生は一つしかできません。このタイ
プのサウンドを生成すると、現在の midi 型のサウンドの再生が止まります。サウンドが多数
のバッファをもたない限り、サウンドの一つのインスタンスしか再生できません(第17章を参
照)。このため、再生中のサウンドが指定された場合は、まずこのサウンドが止められ、そして
先頭から再び再生されます。

Stop a sound
 このアクションは指定のサウンドを止めます。サウンドの多数のインスタンスが再生中の場
合は、すべてが止まります。

If a sound is playing
 指定されたサウンドが再生中であればリストの次のアクションが施行されますが、再生中
でなければそのアクションが飛ばされ、施行されません。否定の条件も選べます。つまり、指
定のサウンドが再生中ではないとき、リストの次のアクションを施行します。たとえば、あるバ
ックグランド音楽が再生中か否かをテストして、新しいバックグランド音楽を流すことができ
ます。このようなチェックを行うための情報については第34章を参照して下さい。

Go to the previous room


 前のルームに移動します。遷移効果のタイプを指定することもできます。色々試しましょう。
最初のルームにいるときにこれを使うと、エラーが起こります。

Go to the next room


 次のルームに移動します。遷移効果のタイプを指定することができます。

Restart the current room


 現在のルームはリスタートされます。遷移効果を指定します。

Go to a different room
 このアクションで特定のルームに移動することができます。ルームと遷移効果を指定します。

If previous room exists


 このアクションで前のルームが存在するか否かをチェックします。存在するときは、リストの
次のアクションが施行されます。通常、前のルームに移動する前にこのアクションを使用しま
す。
34
If next room exists
 このアクションで次のルームが存在するか否かをチェックします。存在するときは、リストの
次のアクションが施行されます。通常、次のルームに移動する前にこのアクションを使用しま
す。.

12.3 main2 のアクション


 ここでタイミング、ユーザーへのメッセージ、ゲーム全体に関するアクションがあります。

Set an alarm clock


 このアクションでインスタンスの8つのアラームの内一つを設定することができます。ステッ
プ数とアラームクロックを指定します。指定されたステップ数の後、インスタンスがアラーム・
イベントを受けます。相対(Relative)のチェック・ボックスで値を増加したり減少したりするこ
ともできます。アラーム・クロックの値を 0 以下に設定しますと、そのアラームクロックが無効に
なり、イベントが生成されません。

Sleep for a while


 このアクションで特定のシーンを停止することができます。これはゲームのある段階の始ま
りかその終わりか、またはプレイヤーにメッセージを表示するときに使います。スリープ時間を
ミリ秒単位で指定します。また、スリープする前に最新の状況を反映するすスクリーンを描画
するか否かを指定することができます。

Set a time line


 (アドバンス・モードのときのみ有効)このアクションでオブジェクトのインスタンスの特定タ
イム・ラインを設定することができます。タイム・ラインを指定して、タイム・ライン内のその開始
位置を指定します(0はスタートです)。このアクションで No Time Line を値として指定すると
あるタイム・ラインを終了させることができます。

Set the time line position


 (アドバンス・モードのときのみ有効)このアクションで現在のタイム・ラインの位置を変える
ことができます。これを使えば、タイム・ラインの一部分を飛ばしたり、もしくは特定の部分を
繰り返したりするとができます。ループのタイムラインを実現するにはこのアクションを現在の
タイムラインの最後に位置を0にするこのアクションを置きます。何かが起こるまで待つため
にこのアクションが使用できます。このため、アクションをテストして、否定の場合はタイム・ラ
インの位置を−1に相対的設定する。

Display a message
 このアクションでダイアログ・ボックスにメッセージを表示することができます。メッセージの
作成だけが必要です。メッセージ内に#の記号を使用すると、改行として見なされます(この
記号をテキストに記入するには「\#」を使います)。メッセージはクオテーションまたはダブル・
クオテーションで始まると、式として見なされます。これについて後述を参照されたい(このア
クションはゲームが排他的モードで実行されているときは無効です。第26章を参照)。

Show the game information


 このアクションでゲームの情報ウインドウをポップ・アップします。ゲーム情報の作成につい
ては第25章を参照してください(このアクションもゲームが排他的モードで実行されていると
きは無効です)。

Restart the game


 このアクションでゲームを最初からリスタートさせます。

35
End the game
 このアクションでゲームを終了させます。

Save the game


 このアクションでゲームの現在の状態を保存することができます。保持用のファイル名を指
定します(そのファイルはゲームのワーキング・ディレクトリに生成されます)。ゲームのロード
は次に示すアクションで行えます。

Load the game


 ゲームの状態をファイルから読み込みます。ファイル名を指定します。必ず同じゲームのフ
ァイルであることと、そのゲームの生成に同じゲーム・メーカーのバーションが使われたことを
確かめましょう。これが一致しないと、エラーが発生します(厳密にいうと、現在のステップの
終了時にゲームがロードされます。このため、現在のゲームの現在のアクションの後にある
幾つかのアクションが施行されます)。

12.4 制御
 他のアクションの施行を制御する色々なアクションがあります。これらは、ほとんど問いをし
ます。たとえば、ある場所は空かを聞いたりします。答えは「はい」(true)であれば、リスト内の
次のアクションが実行され、「いいえ」の場合は次のアクションが無視されます。一つ以上の
アクションを判定の対象にしたいときは、これらは一つのブロックに置きます。このため、グル
ープの先頭にスタート・ブロックを、その末尾にエンド・ブロックを置きます。答えは「いいえ」
に対応するブロックも同様に構成できます。古典的な問いの構成は次の頁の図に示します。

 この例では、現在のインスタンスのためのある場所は衝突フリーであるかどうかを問いま
す。コリーションの無い場所であれば、問の答えは「はい」となり、インスタンスがある方向に
移動します。答えは「いいえ」のとき、インスタンスが指定された位置に飛び移ります。

 すべての問いには NOT というラベルの枠があります。この枠にチェックを入れる


と、反転した結果が採用されます。つまり、「はい」を「いいえ」となり、「いい
え」を「はい」と見なされます。これでは、問の答えは「いいえ」のとき、あるア
クションを施行することができます。

36
 数多くの問いは、その対象をオブジェクトのすべてのインスタンスに指定することができま
す。この場合は、結果が真(true)になるのは、すべてのインスタンスに対して真であるときだ
けです。たとえば、すべてのボールの右の場所は空いているかどうかをチェックすることがで
きます。

 次の問およびそれに関連されたアクションがあります(これらのアクションは他
のアクションと区別しやすくするために独特のアイコンとバックグランド色をもっ
ています)。

If a position is collision free


 この問いは、現在のインスタンスが特定の位置に置かれたとき、他のオブジェクトとコリー
ションしないと、「真」を返します。位置を「絶対」(absolute)か、あるいは「相対」(relative)に
指定できます。また、固体のオブジェクトのみか、すべてのオブジェクトを対象にすることも指
定できます。このアクションは現在のインスタンスが特定の位置に移動できるかどうかをチェ
ックするために用いられます。

If there is a collision at a position


 これは、先のアクションの反対のものです。現在のインスタンスが特定の位置に置かれた
とき、他のオブジェクトとコリーションすると、「真」を返します(このアクションでも固体のオブ
ジェクトのみか、すべてのオブジェクトを対象にすることが指定できます)。

If there is an object at a position


 この問いは、現在のインスタンスが指定された位置で指定されたオブジェクトのインスタン
スに合うと、「真」(true)を返します。

If the number of instances is a value


 オブジェクトと数を指定します。オブジェクトのインスタンス数は指定された数に一致する
とき、この問いは「真」(true)を返します。一致しないとき、「偽」(false)を返します。大小関係
のチェックを指定することもできます。通常、このようなチェックはオブジェクトの数はすべて使
い尽くしたかの調べに使います。ほとんどの場合は、これはレベルかゲームの終了を指しま
す。

If a dice lands on one


 サイコロの面数を指定します。出た面が一のとき、このアクションが「真」(true)を返し、次
のアクションが施されます。これはゲームにランダムな「行動」をもたせるには使います。この
アクションを用いれば、各ステップにある確率で爆弾を生成したり、移動方向を変えたりする
ことができます。サイコロの面数が多ければその確率が小さくなります。実数も使えます。たと
えば、面数を 1.5 に設定すると、2/3 の確率で該当のアクションが施行されます。1 より小さい
値を使うのは意味がありません。

If the user answers yes to a question


 問いを指定します。これは「はい」と「いいえ」のボタンをもつダイアログでプレイヤーに表
示されます。プレイヤーが「はい」を選んだとき、問いは「真」を返します。このアクションは排
他的モードで使用できません。そのとき、問いはいつも「はい」を返します。

If an expression is true
 これは最も一般的な問いです。式を記入します。式の値は「真」(値の場合は 0.5 以上のも
の)となると、このアクションの次のアクションが実行されます。式について後述の文を参考に
してください。

If a mouse button is pressed

37
 指定されたマウスのボタンが押されると、このアクションが「真」を返します。通常ステップ・
イベントに用いられます。マウス・ボタンが押されたかをチェックして、「真」の場合は、マウス
のクリック位置にインスタンスを移動することができます(この場合は、座標 mouse_x および
mouse_y の jump to a given position のアクションを使用します)。

If instance is aligned with grid


 インスタンスの位置がグリッドに沿っているとき、この問いは「真」(true)を返します。縦と横
のグリッドの小間の大きさを指定します。このアクションはとても便利です。たとえば、グリッド
に沿って曲がらないとその操作が許せないときにこれを使います。

Else
 ある問いの答えは「偽」の場合、このアクションの後に実行される部分が来ます。

Start of block
 アクションのブロックの始まりを示します。

End of block
 アクションのブロックの終わりを示します。

Repeat next action


 このアクションは、指定された数で次のアクションまたはアクションのブロックを繰り返し実
行します。数だけを指定します。

Exit the current event


 このアクションがあるとイベントのその他のアクションがもう実行されません。これは特に問
いの後に使います。たとえば、ある位置はフリーであると、やることはないためイベントを終了
します。この例ではその次にあるアクションはコリーションが起こるときのみ施行されます。

12.5 描画アクション
 描画アクションはドローイング・イベントだけで有効です。他には無視されます。スプライト
やバックグランド以外を描くのは遅いです。このためこれを必要なときにだけ使いましょう。

Draw a sprite image


 スプライト、その位置(相対か絶対か)、およびサブイメージを指定します(サブイメージ番
号は 0 からです)。現在のサブイメージを用いたいときはその番号を-1 にします。

Draw a background image


 バックグランド、その位置(相対か絶対か)、およびイメージをタイルで画面上に表示するか
否かを指定します。

Draw a rectangle
 現在のインスタンスの位置(相対か絶対か)に対して描画する長方形の互いに対角にあ
る二つの点の座標を指定します。

Draw an ellipse
 現在のインスタンスの位置(相対か絶対か)に対して楕円を囲む長方形の互いに対角に
ある二つの点の座標を指定します。

38
Draw a line
 現在のインスタンスの位置(相対か絶対か)に対して線の両端の座標を指定します。

Draw a text
 テキストとその位置を指定します。テキストに#の記号を使用すると、改行として見なされ
ます(この記号をテキストに記入するには「\#」を使います)。このように多行数のテキストを
作成することができます。テキストはクオテーションまたはダブル・クオテーションで始まると、
式として見なされます。たとえば、次のように書くと、
'X: ' + string(x)

インスタンスの x 座標値を表示します(x の変数は x 座標値を保持し、string()の関数はその


値を文字列に変化します。上記では+は先頭の文字列と string()で得た文字列を合併しま
す)。

Set the colors


 長方形および楕円を塗りつける色を設定します。また、線、長方形および楕円の周辺の線
の色を設定します。

Set a font for drawing text


その時点以降テキストに使われるフォントを設定します。

Change fullscreen mode


 このアクションで通常のウインドウサイズからフル・ウインドウまたその逆にスクリーンを設
定することができます。その切り替えか、通常のウインドウ・サイズかフル・ウインドウかが指定
できます(このアクションは排他的モードで無効です)。

12.6 スコアー関連のアクション
 ほとんどのゲームにプレイヤーが何らかのスコアーをもちます。また、数多くの
ゲームにはプレイヤーに幾つかのライブが与えられます。更に、プレイヤーがある
ヘルスももちます。次に示すアクションはプレイヤーのスコアー、ライブ数、ヘル
スの管理を容易にします。

Set the score


  ゲーム・メーカーはスコアーの仕組みをもっています。このスコアーは、ウインドウのカプシ
ョン(上部)に表示されます。このアクションでスコアを変更します。新スコアを指定するだけ
です。指定の値をスコアーに加えたいときは、Relative(相対)ボックスをチェックしましょう。

If score has a value


 この問いでスコアーが特定の値に達成したかをチェックすることができます。その値を指定
し、スコアーの値がそれより小さいか大きいか等しいかを指定します。

Draw the value of score


 このアクションでスコアーの値をスクリーンの特定の場所に表示することができます。その
位置とスコアーの前に置くカプションを与えます。スコアーが現在のフォントで表示されます。
このアクションはオブジェクトのドローウイングにしか使えません。

Clear the highscore table


 このアクションはスコアー表を削除します。

39
Display the highscore table
 ゲーム毎に最高の 10 個のスコアーが保持されます。このアクションはトップ・スコアーのリ
ストを表示します。現在のスコアーはトップ・テンの中にあれば、このスコアーが挿入され、プ
レイヤーが自分の名前を記入することができます。スコアー表の表示を色々な形、色、使用フ
ォントなどに設定することができます。(このアクションは排他的モードで動作しません)。

Set the number of lives


 ゲーム・メーカーはライブ(命管理)・システムをもっています。このアクションでは残りの命
数を変更することができます。通常、最初にこの数を3のような値にしてゲームの進み具合を
見ながらこれを減らしたり増加したりします。初期値を減らしたり、増やしたりするには
Relative(相対)ボックスの選択が必要です。命の数が 0(又は0以下)になると、「no more
lives」イベントが生成されます。

If lives is a value
 この問いでライブ数が特定の値に達成したかをチェックすることができます。その値を指定
し、ライブ数の値がそれより小さいか大きいか等しいかを指定します。

Draw the number of lives


 このアクションでライブ数の値をスクリーンの特定の場所に表示することができます。その
位置とライブ数の前に置くカプションを与えます。ライブ数が現在のフォントで表示されます。
このアクションはオブジェクトのドローウイングにしか使えません。

Draw the lives as image


 ライブ数の値を表示するよりその数をイメージで表した方が良いです。このアクションはこ
れを可能にします。その位置と使用するイメージを指定すると、そこでライブ数をイメージで表
示されます。このアクションはオブジェクトのドローウイングにしか使えません。

Set the health


ゲーム・メーカーはヘルス(健康状態)・システムをもっています。このアクションではヘルスを
変更することができます。100という値は最高の健康状態と見なされています。0は不健康で
す。更新用の値を与えます。通常、ヘルスを減らしたり、増やしたりすることをします。このとき、
Relative(相対)ボックスの選択が必要です。ヘルスが 0(又は0以下)になると、「out of
health」イベントが生成されます。

If health is a value
 この問いでヘルスが特定の値に達成したかをチェックすることができます。その値を指定
し、ヘルスの値がそれより小さいか大きいか等しいかを指定します。

Draw the health bar


 このアクションでヘルスがヘルス・バーの形で表示できます。ヘルスが100の場合は、フー
ル・バーが表示されます。0の場合はバーは空です。バーの位置、サイズ、色、及びその背景
色を指定します。

Set the window caption information


 通常、ウインドウのカプション(上部)にルームの番号とスコアーが表示されます。このアク
ションではこれを変えることができます。このアクションでスコアー、ライブ数、およびヘルスの
表示・非表示、およびそれぞれのカプションが指定できます。

40
12.7 コード関連のアクション
 最後に、特にコードにかかわるアクションが幾つかあります。

Execute a script
 (アドバンス・モードのときのみ有効)このアクションでゲームに追加したスクリプトを実行
することができます。スクリプトとその引数(5つまで)を指定します。スクリプトについて第21
章をご覧ください。

Execute a piece of code


 このアクションを追加すると、コードの入力用のフォームが現れてきます。これはスクリプト
を定義するときと同様です(第21章を参照)。主な違いは、対象のインスタンスが指定できる
ことにあります。このアクションを小さなコードに使いましょう。大きなコードの場合はスクリプ
トの使用をお勧めします。

Set the value of a variable


 ゲームに色々な組み込み変数があります。このアクションでこれらの値が変えられます。ま
た、自分の変数を宣言して初期化することもできます。変数の名前とその値を指定します。
Relative(相対)のボックスをチェックすると、変数の現在値に指定した値が加えられます。も
ちろん、これは変数は既に値をもつときだけ有効です。変数について後述の文を参照しましょ
う。変数について後述の文を参照しましょう。

If a variable has a value


 このアクションで特定の変数の値をチェックすることができます。変数の値は指定した値に
一致比すると、返される値は「真」となり、一致しないと「偽」が返される。大小関係も調べる
ことができます。実際に、このアクションでは2つの式をを比較することができます。

Call the inherited event


 (アドバンス・モードのときのみ有効)このアクションは、対象のオブジェクトが親オブジェク
トをもつときだけ有効です(第19章を参照)。親オブジェクトの該当イベントを呼ぶアクション
です。

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
ックグランドの位置も指定できます(これはタイリングに影響を与えます)。最後に、バックグラ
ンドにスコロリングの動きが横方向か縦横の速度で与えられます。

 もう一つの Foreground image というラベルのチェックボックスがあります。これをチェック


すると、バックグランドをフォアグランドになり、最前面に表示されます。もちろん、使用可能に
するために半透明のものとして使います。

46
Chapter 14 ゲーム配布
 ここまでみてきた情報ではゲームを作成することができます。ゲームを作成すると、他人に
見て遊んでもらいたいですね。ゲームの配布を自由に行ってください。売っても構いません。
詳細については、ライセンスを見てください。

 基本配布方法は三つあります。一番簡単なのは、ゲームの*.gmd ファイルを配布すること
です。しかし、この場合は、相手はゲーム・メーカーをもたなければなりません(ゲーム・メーカ
ーを作成したゲームと一緒に配布してはいけません)。この配布では相手はゲームを変更す
ることもできます。

 第二の方法は、スタンド・アロンの(実行可能な)バーションを作成することです。このため、
File メニューの Create Executable の項目を選択します。すると、フォームが現れ、ゲームの
実行ファイル名が要求されます。名前を記入して、OK ボタンを押すと、誰にでも配布できる
スタンド・アロンのゲームができあがります。オプション・フォームでスタンド・アロンのゲーム
のアイコンを設定することができます(他の必要なファイルはスタンド・アロン・ゲームの含む
フォルダにコピーして置いてください)。このフォルダで配布できます(圧縮してからでも)。

 最後の三つ目の方法は、インストラーを作成することです。インターネットで色々なフリーの
インストーラーがあります。この方法でもスタンド・アロンのバーションを作成して、インストー
ラにインストールを任せます。やり方は、使うインストーラーに依存します。

47
Chapter 15 アドバンス・モード

 ここまでゲーム・メーカーのシンプルな特徴だけみてきました。しかし、その他
色々なことができます。その他の特徴を利用できるためにゲーム・メーカーをアド
バンス・モードで起動しなければなりません。その切り替えは簡単です。File メニュ
ーから Advance mode を選択して下さい(その効果をみるために、ゲーム・メーカーをリスタ
ートするか現在のゲームを保存して再ロードするかの何れの一つが必要です)。
 ゲーム・メーカーをアドバンス・モードで起動すると次の画面が現れます。

ここでは、シンプル・モードの項目が表示されますが、リソースやボタンやメニュ
ーの項目が増えます。また、次の章に示すようにリソースには更に幾つかのオプシ
ョンが使用可能になります。以下ではその他のメニュー項目について説明します。

15.1 File メニュー


 ファイル・メニューには次の項目が追加されます。
・ Import scripts:ファイルから役立つスクリプトを読み込むには使用します。第21章に
は、またこれについて述べます。
・ Export scripts:自分で作成したスクリプトをファイルにセーブには使用します。これに
ついても第21章で触れます。
・ Merge Game:この命令(項目)を使えば、他のゲームのリソース(スプライ
ト、サウンド、オブジェクト、ルーム、など)を現在のゲームに統合するこ
とができます。これは再利用の部分を作成するには便利です(たとえば、メ
ニュー・システムなど)。この場合はすべてのリソース、インスタンス、お
よびタイルは新しい ID をもつようになることに注意しましょう。合併するフ
ァイルにあるものは異なる名目をもつようにしましょう。そうでないと、
色々な問題が起こります。
・ Preferences:これで色々なゲーム・メーカーの環境設定が可能です。設定の変更は
記憶されます。次の設定が可能です。
o Show recently edited games in the file menu.チェックされると、最近編集し
た8つのゲーム・リストがファイル・メニューに表示されます。

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 は内
蔵のエディターを使います。別よりよいエディターのある場合はその
使用をこの項目で指定できます。

15.2 Edit メニュー


Edit メニューには次の新たなコマンドがあります。
・ Insert group: リソースはグループ化することができます。大きなゲームを作るときは
これはとても便利です。たとえば、一つのオブジェクトに関するサウンドを一つのグル
ープに集めることができます。または、ゲームのあるレベルで使用されるオブジェクト
を一緒にすることもできます。このコマンドで現在のリソースタイプにグループを作り
ます。その名前が要求されます。グループ内にグループが作れます。後述に記すよう
にリソースをこれらのグループにドラッグすることができます。
・ Find Resource:このコマンドでリソースの名前を記入して、該当のプロパティ・フォー
ムを開くことができます。
・ Show Object Information:このコマンドでゲームのすべてのオブジェクトのオバービ
ューが得られます。
 これらのコマンドを別のもう一つの方法でも与えられます。リソースかリソース・グループ
上に右クリックすると、該当のポップアップメニューが表示されます。

49
15.3 Add メニュー
 各タイプのリソースをこのメニューで追加することができます。これらの各々にはツール・バ
ーのボタンもキー・ショットカットもあります。

50
Chapter 16 もう少しスプライトについて
 ここまでスプライトをファイルから読み込みました。しかし、ゲーム・メーカーではこれらを作
成したり変更したりすることができます。これを行うために、スプライトのプロパティ・ウインド
ウをスプライトのダブルクリックで開きましょう(新規作成でも可能)。次いで、Edit Sprite の
ボタンを押します。スプライトを構成するサブイメージがもう一つのフォームに現れます。

16.1 自分のスプライトを作成する
 開かれるフォームは次のようなものになります。

 右にはスプライトを構成するイメージが見えます。ゲーム・メーカーではサブイメージすべて
が同じ大きさでなければなりません。サブイメージの左にアニメイテッド・スプライトが再生さ
れます。再生されないとき、Show Preview のボックスをチェックして下さい。プレビューの下に
再生速度およびバックグランド色の変える欄およびボタンがあります。プレビューでアニメー
ションがゲームに使われたときの様子が確認できます(このスピードは実際のスピードでは
ないことに注意しましょう。ゲームでのスピードはルームで設定した再生速度に依存します)。

 スプライト・エディターのコマンドでスプライトを作成したり変えたりすることができます。こ
れらのコマンドはすべてメニューによって提供されています(幾つかのコマンドに対するボタ
ンもツールバーにあります)。その中には単一のイメージにしか適用できないものがあります。
これらを使うときはまずサブイメージをマウスで選択します。

16.1.1 File メニュー


 このメニューにはスプライトのロードおよびセーブに関連のコマンドがあります。

 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. スプライトの変更を保存してフォームを閉じます。変更をセー
ブしたくないときウインドウの閉じる用のボタンを押します。

16.1.2 Edit メニュー


 このメニューには、現在選択されているスプライトに関連のコマンドがあります。スプライト
をカットしてクリップボードに保存したり、クリップボードからイメージをペストしたり、現在のス
プライトをクリアしたり、削除したり、左右に移動したりすることもできます。また、ゲーム・メー
カーにあるペインティング・プログラムで一つのイメージの編集も可能です(後述文を参照)。

16.1.3 Transform メニュー


 このメニューではイメージの変更(変形・変質)が行えます。

 Mirror horizontal. イメージを横回転します。


 Flip vertical. イメージを縦回転します
 Shift. 指定した量でイメージが水平にあるいは垂直に移動できます。
 Rotate. イメージを 90 度、180 度、または自由に回転することができます。この最後の
ではその品質も指定できます。最もよい効果を得るために色々試してみましょう。
 Resize Canvas. キャンバスのサイズを変えます。古いイメージが新しいキャンバスに
配置するか否かを指定することもできます。
 Stretch. イメージを新しいサイズにストレッチします。スケール・ファクターおよび品質
の指定ができます。
 Scale. このコマンドがイメージをスケール化します(イメージ・サイズが変わりませ
ん!)。スケール・ファクター、品質、およびスケール化されたイメージ内の現在のイメー
ジの位置を指定することができます。

16.1.4 Images メニュー


 このメニューではイメージを対象に色々な操作ができます。

 Cycle left. サイクルでイメージすべてを左に移動します。これでアニメーションが異な


るイメージで始まります。
 Cycle right. サイクルでイメージすべてを右に移動します。
 Black and white. スプライトを白黒にします(これは透明色に影響を与えません)。
 Colorize. イメージの色(色合い)を変えます。スライダで色を選びます。
 Intensity. イメージの色の飽和と強烈の値で色の明るさを変えます。
 Fade. このコマンドで一色と一つの値を指定します。イメージの色はこの色にフェード
します。
 Transparency. これでスクリーン・ドア透明度のレベルを指定します。これは幾つかの
ピクセルを透明することで実現できます。
 Blur. イメージをぼんやりさせると、色が混合してイメージがはっきり表示されません。
大きな値を用いると、イメージがかなりぼんやり見えます。

52
 Crop. イメージをできるだけ小さくします。これはとても便利です。大きなイメージが大
きなビデオメモリを使うからです。場合によって透明性関連の問題を避けるためにイ
メージの周辺の境界線を残すことがあります。

目的のスプライトが出来上がるまでこれらのコマンドを色々試さなければなりません。

16.1.5 Animation メニュー


 このメニューで現在のアニメーションに基づいて新しいアニメーションが作れます。目的の
効果を得るために色々なオプションを試みなければなりません。また、出来上がったアニメー
ションをセーブしてから現在のものに加えることもできます。さらに、イメージを削除したり追
加したりすることもできます。簡潔にこれらの使用について述べます。

 Set Length. アニメーションの長さを変えます。アニメーションは指定されたフレーム


数を満たすために繰り返されます(通常、この値は現在のフレーム数の倍数です)。
 Stretch. このコマンドもアニメーションの長さを変えます。しかし、この場合は、目的の
数を得るためにフレームの重複か、あるいはフレームの削除が行われます。この場合
は、フレーム数が増加すると、アニメーションの再生は減速し、数が減少するとアニメ
ーションの再生は速くなります。
 Reverse. 名前通りこれはアニメーションを逆にします。つまり、巻き戻し方向で再生さ
れます。
 Add Reverse. この場合は、逆順のイメージが追加され、フレーム数が2倍となります。
このコマンドは、オブジェクトが右から左へまたその逆の動きをもたせるには、あるい
は色の変化を繰り返して行えるように便利です。場合によって、二重化される先頭と
末尾のフレームを一つ削除する必要があります。
 Translation sequence. 各ステップに少々移動するアニメーションが作成できます。フ
レーム数および垂直と水平の移動分を指定しなければなりません。
 Rotation sequence. 回転するアニメーションを作成します。時計回りまたは反時計回
りを指定することができます。フレーム数とトータルの角度を指定します(360 度は一
回完全回りです)。イメージが見えるためにキャンバスのリサイズを要する場合があり
ます。
 Colorize. 対象のイメージを特定の色に変えるアニメーションを生成します。
 Fade to color. 対象のイメージを特定の色にフェードするアニメーションを生成します。
 Disappear. スクリーン・ドア・透明性を用いて、イメージが消えるようにします。
 Shrink. イメージが消えるまでシューリンク(縮める)します。方向が指定できます。
 Grow. イメージがどこからも現れるようにします。
 Flatten. イメージをある方向に平らにします(畳められます)。
 Raise. ある方向からイメージを引き上げます(現れるようにします)
 Overlay. アニメーションをファイルにある他のイメージかアニメーションと重なります。
 Morph. アニメーションをファイルにある他のアニメーションかイメージにモーフィング
させます。対象の両方のイメージが同じ領域を占めるとき、このモーフィングの効果は
最高です。領域が異なると、途中でピクセルが突然消えたり現れたりします。

 特に、最後の二つのコマンドは強力なものです。たとえば、オブジェクトを爆発させるには、
幾つかのコピーと幾つかの空フレームを追加します。次いで、これらは爆発のアニメーション
とオバーレイします。または、爆発にモーフィングさせます。練習すれば、インパクトのあるスプ
ライトが作れます。

16.1.6 ストリップ
 上記に示したように、スプライトは通常アニメイテッド GIF ファイルかストリップとして保存
されます。ストリップはイメージを並べて保存する大きなビットマップです。唯一の問題は、
各々のサブイメージの大きさがこのイメージに保存されていないことです。また、インターネッ
トで手に入れるストリップの中には多数のスプライトを保存するものもあります。たとえば、次
のストリップ・ファイルの一部分には四つのアニメーションが入っています。
53
 このようなファイルからスプライトを指定するために、File メニューから Create from Strip
か、または Add from Strip を選択します。

該当のストリップ・イメージ・ファイルを指定すると、次のフォームが現れます。

 ウインドウの右には選択したストライプの一部分が見えます。左に対象のサブイメージを設
定するパラメーターが幾つ指定できます。表示される長方形は選択されているイメージを囲
みます。次のパラメーターが設定できます。

 Number of images. ストリップからとりたいイメージ数。


 Images per row. 行ずつのイメージ数。たとえば、1にこれを設定すると、一列のイメー
ジが得られます。
 Image width. 各イメージの幅。
 Image height. 各イメージの高さ。
 Horizontal cell offset. 左トップにあるイメージを選択したくないときは、これで水平に
スキップ(無視)するイメージ数が設定できます。
 Vertical cell offset. 垂直にスキップするイメージ数を指定します。
 Horizontal pixel offset. 時々左上に追加スペースがあります。これでその量を指定し
ます(ピクセル数で)。
 Vertical pixel offset. 垂直の追加スペース。

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 のボタンを押すことが
でき、現在のサウンドを編集することができます(編集中にゲーム・メーカーの設計ウインドウ
が隠され、サウンド・エディターを閉じると、再び表示されます)。

 wave ファイルと midi ファイルの他には mp3 型のファイルがあります。これらは縮小された


wave ファイルです。これらは、サウンド・ファイルを選択するとき表示されないがゲーム・メーカ
ーで使用できます。このため、まずすべてのファイルを示すようにオープン・ファイルのダイアロ
グで選びます。次いで、ファイルを選びます。しかし、短所があるので、気を付けましょう。まず、
解凍しなければなりませんので処理時間がかかり、ゲームが遅くなります。ファイル・サイズ
が小さいが、必要なメモリは小さくはありません。また、すべての機械で再生できることは限り
ません。そのため、作ったゲームは幾つかの機械で実行できなくなります。できるだけこれら
のファイルをそのまま使用しないで、wave ファイルに変換してから使いましょう。どうしても使
用したいときはバックグランドミュージックとして使いましょう。

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つのアクションがあります。

Set a time line


 このアクションでインスタンスの特定におタイムラインを設定します。タイム・ラインおよびそ
のスタート位置を指定します(0はタイム・ラインのスタートを指します)。また、このアクション
の No Time Line の選択でタイム・ラインを終わらせることができます。

Set the time line position


 このアクションでタイム・ライン内の現在の位置を変えることができます(絶対的にか、ある
いは相対的に)。これを用いれば、タイム・ラインの特定の部分を飛ばしたり、繰り返して使用
したりすることができます。ループ型のタイム・ラインを使用したいときは、タイム・ラインの最
後の時刻にこのアクションでタイム・ラインを前頭から再スタートさせます。特定の出来事を
待つこともできます。テスト・アクションを使用して、偽のとき、タイムラインを相対的に−1に設
定します。

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 ファイル(後述を参照),若しくは自分のフォントなどがあります。これ
らのファイルがゲームと一緒に配布できますが、ゲームに組み込んだ方がよいでしょう。この
ために、データ・ファイルのリソースが使用できます。データ・ファイルのリソースは、ただ単に
ファイルの内容を保存します。ゲームの開始時にこのファイルはディスクに書き込まれ、ゲー
ムで使用可能になります。

 データ・ファイルを追加するために Add メニューから Add data File を選択します。次のフ


ォームが現れます。

このリソースにも名前を与えることができます。該当ファイルをリソースに割り当てるために
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 をダブル・クリックしま
す。小さなビルトインのエディターが起動され、ゲーム情報が編集できます。色々なフォントや、
色や、スタイルを選択することができます。バックグランド色の選択も可能です。

 Format メニューには、Mimic Main Form という面白いオプションがあります。このオプショ


ンをチェックすると、ヘルプのフォームはゲームのフォームに合わせられ、その位置とサイズの
ものになります。つまり、ヘルプはゲームのウインドウに表示されているような効果が得られま
す。適切なバックグランド色を選べば、ヘルプの表示はとてもよくなります(ヘルプの下にユ
ーザが Esc キーでゲームに戻ることを記入しましょう)。

 情報を短くて、正確に書きましょう。ここにもあなた、作者の名前も書きましょう。提供されて
いる例題ゲームにはこの情報ファイルがあり、ゲームの作成についても触れています。
 よりきれいな資料を作りたいときは、たとえばワードを使いましょう。作成後コピー・ペスト
でゲーム情報のエディター・ウインドウに入れましょう。

75
76
Chapter 26 ゲームのオプション
 ゲームに変えられる色々なオプションがあります。リソース・ツリーの Game Options 項目
をダブル・クリックすると、これらのオプションが表示されます。オプションがタブ持ちのページ
毎に分類されています。

26.1 グラフィックス・オプション
 このタブでゲームのグラフィカルな外観に関連のオプションを設定することがで
きます。これらの設定がゲームの表示を左右するので必ずこれらのオプションをチ
ェックしておきましょう。異なるユーザが異なる機械を使用しますので、できるだ
けこれらの設定を色々な機種で動作確認しましょう。

Start in fullscreen mode


 これをチェックすると、ゲームはスクリーン全体を使います。チェックされないと、ウインドウ
で実行されます。

Scale percentage in windowed mode


 ウインドウ・モードでのスケールを設定します。100 の値はスケールなしを意味します。スプ
ライトとルームが小さいときにこのオプションを使います。スケーリングは遅いのですが、グラ
フィック・カードはこの作業が容易にできます。スケーリング・ダウンはとても遅いので、100 以
下の値の使用を避けましょう。

Scale percentage in fullscreen mode


 フル・スクリーン・モードのスケールを設定します。100 の値はスケールなしを意味します。0
の値は最大のスケール率を意味します。スケーリングは遅いのですが、グラフィック・カードは
これが容易にできます。スケーリング・ダウンはとても遅いので、100 以下の値の使用を避け
ましょう。

Only scale when there is hardware support


 このオプションをチェックすると、該当のハードウェアが設置されているときのみスケーリン
グが行われます。これを使っても、グラフィック・カードによって該当のサポートがないにもか
かわらずサポートのあるように指定してしまうことがあります。

Don’t draw a border in windowed mode


 ウインドウエッド・モードでチェックされると、ゲームのウインドウはボーダーもカプション・バ
ーももちません。

Don’t show the buttons in the window caption


 ウインドウエッド・モードでチェックされると、ウインドウのカプションは縮小用および閉じる
用のボタンを表示しません。

Wait for vertical blank before drawing


 コンピュータのスクリーンは一秒に何回もリフレッシュされます(通常 50 回〜100 回)。リフ
レッシュの後に垂直のブランクが起こり、その間にスクリーンには何も起こりません。スクリー
ンを頻繁に描画すると、前のイメージの一部と後のイメージの一部が重なって見えて、ビジュ
アル効果が悪くなります。次のフレームを描画する前に垂直ブランクを待てばこの問題が無
くなります。この策の欠点はプログラムが垂直ブランクをまつと、プログラム自身(その実行)
が遅くなります。

Display the cursor


 マウス・ポインターを表示するか否かを指定します。オフにすると、処理が早く、画面がきれ
いに見えます(ゲーム・メーカーでは自分のカーソル・オブジェクトも作れます)。

77
Display the caption in fullscreen mode
 チェックされると、フル・スクリーンのモードではトップの左の白いボックスにルームのカプ
ション、スコアー、およびライブ数が表示されます。これをオフにすることができます。通常これ
らの情報を自分でルーム内に配置・表示すると、よりきれいにできあがります。

Freeze the game when the form looses focus


 チェックされると、プレイヤーが前面に(他のアプリケーション等の)フォームを出したとき、
ゲームが一時停止します。ゲーム・ウインドウに戻ったときにゲームの実行が再び再開されま
す。

26.2 解像度
 このタブでゲーム実行時にの解像度を設定することができる。

Set the resolution of the screen


 スクリーンは特定の解像度をもっています。これは、3つの値で設定されます。その第一は、
垂直と水平のピクセル数です。第二は、色を表現するためのビット数です。最後は、スクリー
ンのリフレッシュ頻度です。通常、ゲーム・メーカーがこれらの設定を変えません。つまり、コン
ピュータの設定を使用します。しかし、場合によってはこれは低いレベルのグラフィックス効果
になってしまいます。たとえば、ゲームのルームが小さいとき、しかもユーザーの解像度が高
い場合は、ゲームの画面は小さくなります。これは、フール・スクリーン・モード使用とスケイリ
ングで解決できますが、実行が遅くなる可能性があります。より良い方法は、ゲーム・メーカー
にスクリーンの解像度を変えさせることです。ゲーム・メーカーが後にこれを元通りにします。
これを行うために、このオプションをチェックして下さい。これと他のオプションの設定も可能
になります。まず、カラーの深さを指定することができます(16か32。通常16は最適です。ウイ
ンドウ98では32を指定しても、16ビット・モードでゲームが実行されます)。第二は、スクリー
ン・サイズが指定できます(320x240、640x480、800x600、1024x768、1280x1024、あるいは
1600x1200)。ここで注意しなければならいことがあります。小さいスクリーン(例:320x240)を
選択すると、ウインドウは、その他のアプリケーションのウインドウべてをこのサイズに合わせ
ます。場合によっては、これは問題になるでしょう。これを避けるために、排他的モードを使用
しましょう。最高サイズの2つを使うときも注意が必要です。これらのサイズはすべてのコンピ
ュータで使用できません。最後に、周波数(リフレッシュ頻度)を指定することができます(デフ
ォルト、60、70、85、100)。最高値より高い値を指定すると、デフォルトの値が使用されます。次
のオプションも使用できます。

Use exclusive graphics mode


 排他的モードでゲームはスクリーンの制御を行います。他のアプリケーションはスクリーン
が使用できません。これは、グラフィックスを高速にし、特別な効果を有効にします(ガンマ設
定等)。適切な設定のスクリーンが使用されることを保証したいときはこの排他的モードを使
いましょう。しかし、使用時に注意しなければなりません。このモードでは他のスクリーンが表
示されません。つまり、ゲームではメッセージか問いかを表示するアクション、スコアー表示、
ゲーム情報等が使用できません。また、エラーも表示されません。通常、このモードでの非常
状態でゲームが終了し、コンピュータの再スタートが要求されます。このモードを使う前にゲ
ームはエラー無しで実行できることを確認しましょう。さらに、このモードを使用すると、デバッ
グモードが使用不能です。

26.3 キー・オプション
Let <Esc> end the game
 チェックされると、Esc キーが押されると、ゲームが終了します。アドバンス・ゲームはゲーム
を終了する前に(セーブ等の)処理を行うため、これは望ましくない特徴です。この場合は、こ
のオプションを外したままにして、Esc キーにはアクションを与えてください(ウインドウの×にク
リックすると、Esc キー・イベントが発生します)。

Let <F1> show the game information


 チェックされると、F1 キーが押されたとき、ゲームの情報が表示されます(排他的モード以
外のときのみ)。

78
Let <F4> switch between screen modes
 チェックされると、F4 でフル・スクリーンとウインドウ・モードの切り替えが行われます(排他
的モード以外のときのみ)。

Let <F5> and <F6> load and save the game


 チェックされると、F5 キーでプレイヤーの現在のゲーム状態がセーブでき、F6 で最後にセ
ーブしたゲームのロードができます。

26.4 ロード・オプション
 ゲームをロードするときに起こるべきことがこれらのオプションで指定できます。まず、ロー
ディング・イメージを指定することができます。第二は、イメージの下にローディング・バーを表
示するかどうかが指定できます。この設定では、ローディング・バーなし、デフォルトのローディ
ング・バー使用、またはローディング・バーのバックグランドとフォアーグランドのイメージのい
ずれか一つ選ぶことができます(最後のでは両方のイメージの指定が必要です)。第二は、ゲ
ームのアイコンが指定できます。使用可能なアイコンは 16 色、32×32 のものだけです。これ以
外の特徴のものを設定すると警告が現れます。
 最後に、第三のではゲームの唯一の id 番号が変えられます。この id はスコアー・リストお
よびゲーム・ファイルの保存に用いられます。ゲームの新バーションを作成するときは、古い
得点リストを参照したくないときこの番号を変えましょう。

26.5 エラー・オプション
 エラー報告に関連のオプションをこれで設定できます。

Display error messages


 チェックすると、エラー・メッセージがプレイヤーに表示されます(排他的モードのとき以外)。
ゲームのファイナル・バーションではこれを外しましょう。

Write error messages to file game_errors.log


 チェックされると、すべてのエラー・メッセージがゲーム・フォルダの game_errors.log に書き
込まれます。

Abort on all error messages


 通常、エラーが致命的か無視できるのかの何れの一つです。このオプションをチェックする
と、すべてのエラーが致命的であると見なされ、ゲームは終了されます。ゲームの最終バーシ
ョンでこのオプションを使いましょう。

Treat unitialized variables as 0


 初期化されていない変数の使用はよくある誤りの一つです。これは避けにくいことです。こ
のオプションをチェックすると初期化されていない変数はエラーを起こさなく、ゼロに設定さ
れたように扱われます。しかし、これを使うと、タイピング・ミスを発見できなくなります。

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進(真偽の値しかとれない)演算子があります
(優先順位で)。

 &&, ||, ^^ : ブルー型の値を組み合わせる (&& は、かつの意味, || は、またはの


意味、^^は、排他的の意味)
 <, <=, ==, !=, >, >= : 比較、結果は真(1)あるいは偽(0)
 | & ^ : ビット演算子(| OR、& AND、^ XOR)
 << >> : ビット演算子(<< 左シフト、 >> 右シフト)
 +, - : 加算、引き算
 *, /, div, mod : 掛け算、割り算、整数の割り算、モジュール演算

次の単一演算子もあります。

 ! :  否定、真を偽に、偽を真に反転します
 - :  直後に書く値を否定します
 ~ : ビット単位で(ビット)反転を行います

 値として、数字や、変数や、値を返す関数などが使えます。サブ式が大カッコで囲めます。す
べての演算子は実数に適用できます。比較は文字列にも使えます。プラス「+」は文字列の
結合に使います(通常の言語と異なり、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;
}

 最後の文は次のように解釈できます。最初のフラッグの id をもって、その id のインスタンス


の x 座標を 12 にします。
 オブジェクト名、特別なオブジェクト、およびインスタンスの id を幾つかの関数でも使えま
す。

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 文は次の書式があります。

repeat (<expression>) <statement>

文(statement)は式で得られた(概数の)値(回数)にしたがって、繰り返して実行されます。


 次のプログラムは五つのボールをランダムに生成された位置に生成します。
{
repeat (5) instance_create(random(400),random(400),ball);
}

28.10 While 文
while 文は次の書式があります。

while (<expression>) <statement>

 カッコ内の式が真である限り文(複合文)が繰り返し実行されます。While を使うときに気
を付けましょう。注意しないと、永遠に繰り返されるものを作成してしまい、ゲームがユーザー
の入力に反応しなくなります。


 次のプログラムは現在のオブジェクトを空いている場所への移動を試みます(ランダムに
オブジェクトを移動することと同様なものです)。
{
while (!place_free(x,y))
{
x = random(room_width);
y = random(room_height);
}
}

28.11 Do 文
do 文は次の書式があります。

do <statement> until (<expression>)

87
 カッコ内の式が真となるまで、文(複合文)が繰り返し実行されます。文は少なくもと1回実
行されます。do を使うときに気を付けて使いましょう。注意しないと、永遠に繰り返されるもの
を作成してしまい、ゲームがユーザーの入力に反応しなくなります。


 次のプログラムは現在のオブジェクトを空いている場所への移動を試みます(ランダムに
オブジェクトを移動することと同様なものです)。
{
do
{
x = random(room_width);
y = random(room_height);
}
until (place_free(x,y))
}

28.12 For 文
for 文は次の書式があります。

for (<statement1> ; <expression> ; <statement2>) <statement3>

 次のように説明できます。最初の文(statement1)が実行されます。その次に式
(expression)が評価されます。真であれば、三番目の文(statement3)が実行され、2番目の
文(statement2)が実行されます。その後、再び式が評価されます。これは式が偽になるまで
繰り返して行われます。
 これは複雑と思いますが、次のように解釈しましょう。最初の文はループを初期化します。
式はループから脱出するか否かをチェックします。第二の文は次のループの式のチェックに
繋ぐものです。
 ある範囲内で繰り返しのカウンタの役割を果たすものとしてよく使います。


次のプログラムは 1〜10 の値で長さ 10 の配列を初期化します。

{
for (i=0; i<9; i+=1) list[i] = i+1;
}

28.13 Switch statement


 色々な場面で、アクションを特定の値に依存させ、選択したいときがあります。これは、幾つ
かの if 文の組み合わせで実現できますが、 switch 文の使用でより容易に実現できます 。
Switch 文は次の書式があります。

switch (<expression>)
{
case <expression1>: <statement1>; … ; break;
case <expression2>: <statement2>; … ; break;

default: <statement>; …
}

これは、次のように機能します。まず、switch の式が評価されます。その値は case の各々の式


の値と比較されます。一致する値以降、break 文まですべての命令は実行されます。一致する
値が存在しない場合は、default の文が実行されます(default 文は必須ではありません)。共
88
通の実行文の case 文も構成できます。Break 文も必須ではありません。Case の文の後に
break がない場合は実行は次の case の文に続きます。


次のプログラムはキーの押されることに反応します。
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

for ループ、while ループ、repeat ループ、switch 文、 あるいは with 文に使いますと、ループか


文を終了します。ループ外に使用しますと、プログラムが終了されます(ゲームは終了されま
せん)。

28.15 Continue statement


 continue 文は次の書式があります。

continue

for ループ、while ループ、repeat ループ、あるいは with 文に使いますと、ループか with 文の


次の繰り返しの文の実行に移ります。

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 文で終了します。


 この例は引数の二乗を計算するスクリプトの定義を示します。
{
return (argument0*argument0);
}

スクリプトをコードから呼び出すときは、関数を呼ぶときと同様にその呼び出しを行います。
つまり、スクリプト名の後に括弧で囲んだ引数を指定します。

28.19 With 文
 上記に示したように、他のインスタンスの変数を読んだり、更新したりすることができます。
しかし、場合によっては、インスタンスを対象にそれ以上の操作をしたい場合があります。たと
えば、すべてのボールを8ピクセル分下の方へ動かしたいことを考えましょう。次のコードで
実現できると考えられます。
ball.y = ball.y + 8;

しかし、これは間違いです。等式の右側では、最初のボールの y 座標だけを取得して、それに
8を加えます。この値は左のすべてのボールの y 座標として代入されます。結果は、すべての
ボールは同じ y 座標を得るだけです。次の文でも

ball.y += 8;

同様なことが行われます。上記の代入文の簡略版だけです。目的の操作を実現するために
次の with 文が大いに役立ちます。この文の一般的書式は次のようになります。

with (<expression>) <statement>

式(expression)では一つ以上のインスタンスを指します。このためインスタンスの id、オブジ
ェクト名(オブジェクトのすべてのインスタンスを対象にしたいとき)、特別なオブジェクト
(all、self、other、noone)を用います。文(statement)は指定された各インスタンスに、現在のイ

90
ンスタンス(self)のように実行されます。このため、すべてのボールを8ピクセル分移動する
ために次のように書けます。
with (ball) y += 8;

 複数文を同時に実行したいときは、大カッコで囲みましょう。たとえば、すべてのボールをラ
ンダムに計算された位置に移動させたいときは次の文が使えます。
with (ball)
{
x = random(room_width);
y = random(room_height);
}

この複数文では指定されたインスタンスは self インスタンスのように扱われます。また、現在


のインスタンスはその中では他方のもの(other)として見なされます。このため、すべてのボ
ールを現在のボールの位置に移動させたいときは、次のように書けます。
with (ball)
{
x = other.x;
y = other.y;
}

 with 文の使用は強力です。もう少しその応用例を見ましょう。すべてのボールを破壊する
ために次のように書きます。
with (ball) instance_destroy();

 爆弾が爆発して、しかもその近辺にあるインスタンスを破壊したいときは次のコードが使え
ます。
with (all)
{
if (distance_to_object(other) < 50) instance_destroy();
}

28.20 コメント
 プログラムにコメントを付けることができます。「//」の後に書かれるものは無視され、内部
では改行の目印として扱われます。多数の行をコメント・アウトしたいときは、該当の行を/*と
*/で囲みます(これを使うと、コロリング(文の類による色づけ)は働くなることがあります。こ
の場合は F12 を押して色づけのやり直しを行いましょう)。

28.21 GML の関数と変数


 GML は数多くの組み込み(ビルトイン)関数と変数があります。これらではゲームのどん
な部分も制御することができます。各アクションに対応する関数がありますので、コードだけ
を使いたいときはアクションは不要です。しかし、アクションで制御できない側面が関数なら
できます。このため、アドバンス・ゲームの作成を考えているのなら、可能なことについて理解
するために、これからのすべての章を読むことをお勧めします。これらの関数と変数はアクシ
ョンに値を与えるためにも使えます。ですから、コードの使用や、スクリプトの作成を考慮して
いなくてもその情報が大いに役に立ちます。
 以下では次の決まりことがあります。「*」(米印)でマークされている変数は読み出し専用
です。つまり、値の変更が不能です。変数名に[0..n]が付いているときは、変数は配列です。そ
の範囲は与えられたインデックスで定められます。

91
92
Chapter 29 計算
 ゲーム・メーカーには色々な計算を行うための関数があります。ここでその完全なリストを
示します。

29.1 定数
 次の定数があります。

true 1 に等しい
false 0 に等しい
pi 3.1415…に等しい

29.2 実数値の関数
 実数を扱う関数には次のものがあります。

random(x) 0〜x までの間ランダムに生成された数を返します。返される値はいつも


x より小さい値です。
abs(x) x の絶対値を返します。
sign(x) x の符号(-1 か 1)を返します。
round(x) x は一番近い整数値に変換されます。
floor(x) x のフロアーを返します。つまり、x は x より小さくて一番近い整数に変換
されます。
ceil(x) x のセイリングを返します。つまり、x は x より大きくて一番近い整数に変換
されます。
frac(x) x の小数部を返します。
sqrt(x) x の平方根を返します(x は肯定のみです)。
sqr(x) x*x の値を返します。
power(x,n) x の n 乗を返します。
exp(x) e の x 乗を返します。
ln(x) x の自然対数の値を返します。
log2(x) 2 基数の x の対数値を返します。
log10(x) 10 基数の x の対数値を返します。
logn(n,x) n 基数の x の対数値を返します。
sin(x) x のサイン(正弦)の値を返します(ラジアン単位で)。
cos(x) x のコサイン(余弦)の値を返します(ラジアン単位で)。
tan(x) x のタンジェント(正接)の値を返します(ラジアン単位で)。
arcsin(x) x のサインの逆関数の値を返します。
arccos(x) x のコサインの逆関数の値を返します。
arctan(x) x のタンジェントの逆関数の値を返します。
arctan2(y,x) (y/x)のタンジェントの逆関数の値を計算して、角度を該当の座標で
返します。
degtorad(x) 度をラジアンに変換します。
radtodeg(x) ラジアンを度に変換します。
min(x,y) x と y の最小値を返します。
max(x,y) x と y の最大値を返します。
min3(x,y,z) x、y と z の最小値を返します。
max3(x,y,z) x、y と z の最大値を返します。
mean(x,y) x と y の平均値を返します。

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 文字列を扱う関数
 次の関数は文字と文字列の扱いに使えます。

chr(val) val の ASCII コードをもつ文字列を返します。


ord(str) 文字列 str の最初の文字の ASCII コードを返します。
real(str) str を実数に変換します。Str は否定の符号、小数点、もしくはエクスポネ
ンシャルの部分がもてます。
string(val) val の実数を文字列に変換します。標準変換で、対象の値は小数部
無しの整数か2桁の小数部のものに変換されます。
string_format(val,tot,dec) tot の全桁数および dec で指定された小数部の
桁数で val を文字列に変換します。
string_length(str) 文字列の文字数を返します。
string_pos(substr,str) 文字列内のサブ文字列の先頭位置を返します(不一
致の場合は0を返します)。
string_copy(str,index,count) count の長さで、index を先頭とするサブ文字
列を str 文字列から抽出します。
string_char_at(str,index) str 内の index の位置にある文字を返します。
string_delete(str,index,count) count の長さで、index を先頭とするサブ文
字列を str から除いた文字列(str 一部のコピー)を返します。
string_insert(substr,str,index) substr の文字列を index の位置に挿入し
た str のコピーを返します。
string_replace(str,substr,newstr) 最初の substr の文字列を newstr に置き
換えた str のコピーを返します。
string_replace_all(str,substr,newstr) すべての substr の文字列を
newstr に置き換えた str のコピーを返します。
string_count(substr,str) str 内に substr の文字列の発生数を返します。
string_lower(str) 小文字に変換した str のコピーを返します。
string_upper(str) 大文字に変換した str のコピーを返します。
string_repeat(str,count) count で指定した str のコピーを含む文字列を返し
ます。
string_letters(str) str に入っている文字のみで構成される文字列を返します。
string_digits(str) str に入っている数字のみで構成される文字列を返します。
string_lettersdigits(str) str に入っている数字および数字のみで構成される
文字列を返します。

次の関数でクリップボードを使用するテキストの扱いを行えます。

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;}
}
}
}

 ループの後、maxid の変数は最大のパワーのインスタンス id を保存します(このようなル


ープではインスタンスを破壊しないでください。それらは自動的に配列から削除され、配列の
インデックスはそれに伴って替わりますので、インスタンスを飛ばすことになってしまいます)。

instance_find(obj,n) obj タイプの(n+1)番目のインスタンスの id を返します。


Obj は、オブジェクト、あるいは all のキーワードです。そのインスタンスが存在しないと
きは、noone の特別なオブジェクトが返されます。
instance_exists(obj) obj タイプのインスタンスが存在するかどうかを返します。
Obj はオブジェクト、インスタンスの id、あるいは all のキーワードです。
instance_number(obj) obj タイプのインスタンスの数を返します 。Obj は、オブジ
ェクト、あるいは all のキーワードです。
instance_position(x,y,obj) 座標(x,y)にある obj タイプのインスタンスの id を
返します。多数存在するときは、最初のが返されます。Obj は、オブジェクト、あるいは
all のキーワードです。そのインスタンスが存在しないときは、noone の特別なオブジ
ェクトが返されます。
instance_nearest(x,y,obj) 座標(x,y)に一番近い obj タイプのインスタンスの
id を返します。Obj は、オブジェクト、あるいは all のキーワードです。
instance_furthest(x,y,obj) 座標(x,y)に一番遠い obj タイプのインスタンスの
id を返します。Obj は、オブジェクト、あるいは all のキーワードです。
98
instance_place(x,y,obj) 現在のインスタンスが座標(x,y)に置かれたとき、そこ
に合う obj タイプのインスタンスの id を返します。Obj は、オブジェクト、あるいは all の
キーワードです。そのインスタンスが存在しないときは、noone の特別なオブジェクト
が返されます。

次の関数はオブジェクトの作成とその破壊に使用できます。

instance_create(x,y,obj) 座標(x,y)に obj タイプのインスタンスを作成します。


関数は新インスタンスの id を返します。
instance_copy(performevent) 現在のインスタンスのコピーを作成します。関数
の引数は生成(クリエーション)イベントをコピーされたインスタンスに施すか否かを
指定します。この関数は生成されたインスタンスの id を返します。
instance_destroy() 現在のインスタンスを破壊します。
instance_change(obj,perf) 現在のインスタンスを obj タイプに変換します。perf
は破壊とクリエーション・イベントを行うかどうかを指定します。
position_destroy(x,y) (x,y)のポジションをもつスプライトのすべてのインスタ
ンスを破壊します。
position_change(x,y,obj,perf) 座標(x,y)にあるすべてのインスタンスを obj
タイプに変換します。perf は破壊とクリエーション・イベントを行うかどうかを指定しま
す。

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* 現在時間の秒数。

時々、ゲームを一時的停止したいことがあります。このためにスリープ関数を使います。

sleep(numb) numb で指定されたミリ秒数スリープします。

 最後に、もう既に知っているように各インスタンスが設定可能な異なる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>を押すと、ゲームのロードができます。コードでもこのゲーム
のセーブ(保存)とロード(開く)が可能です(ローディングは現在のステップの終了時に行わ
れます)。

game_save(string) string のファイル名にゲームをセーブします。.


game_load(string) string のファイル名からゲームをロードします。

 ゲームのもう一つの重要な特徴はスコアー、ヘルスおよびライブ数です。ゲーム・メーカー
は、グローバル変数 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 イベントの生成
 ご存じのようにゲーム・メーカーはイベントで動きます。すべてのアクションはイベントの結
果です。異なる幾つかのイベントがあります。クリエーションと破壊のイベントは、それぞれイ
ンスタンスの生成とその破壊によって発生します。各ステップにシステムはまずアラームイベ
ントを処理します。その次に、キーボードおよびマウス・イベントを扱います。その後、インスタ
ンスが新位置に着いたときコリーション・イベントが処理されます。最後に、ドロー・イベントを
使ってインスタンスの描画が行われます(多数ビューの場合は、ドロー・イベントは各ステップ
に数回呼び出されます)。コードからもイベントを現在のインスタンスに適用することができま
す。そのために、次の関数があります。

event_perform(type,numb)現在のインスタンスに type 型の numb イベントを適


用します。次のイベント・タイプを指定することができます。
ev_create
ev_destroy
ev_step
ev_alarm
ev_keyboard
ev_mouse
ev_collision
ev_other
ev_draw
ev_keypress
ev_keyrelease

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: ユーザーとのやり取り
 ユーザーとやり取りしないゲームはありません。ゲーム・メーカーでのこれを実現するため
の標準的なやり方では、マウスもしくはキーボード・イベントにアクションを設定します。しかし、
より厳密な制御の場合もあります。コードを用いれば、キーボードのキーが押されているかど
うかやマウスの位置やまたそのボタンが押されているか否かをチェックすることができます。
通常、これをコントローラ型のオブジェクトのステップ・イベントでチェックして、アクションを起
こします。このため、次の変数と関数があります。

mouse_x* マウスの x 座標。変更不能変数


mouse_y* マウスの y 座標。変更不能変数
mouse_button 現在押されているマウスのボタン。値として mb_none、
mb_any、mb_left、mb_middle、あるいは mb_right を使います。
keyboard_lastkey 最後に押されたキーのコード。キーの定数について後述の文
を参照しましょう。これを 0 に設定したり、変えたりすることができます。
keyboard_key 現在押されているキーのコード(以下を参照;0 は無し)。
keyboard_lastchar 最後に押されたキーの文字(文字列として)
keyboard_string 最後にタイプインされた 80 文字の文字列。この文字列は印刷
可能なもののみで構成されています。バックスペースの操作にも正しく反応します。つ
まり、バックスペースが押されたとき、文字一つが文字列の末尾から削除されます。

 時々、一つのキーを他のキーに対応させることが便利です。たとえば、プレイヤ
ーに矢印のキーとテンキーのキーが使えるようにしたいことがあります。アクショ
ンを二重化するよりテンキーのキーを矢印のキーに対応することができます。また
は、キーの設定をプレイヤーに任せたいこともあります。この場合は、次の関数が
使用できます。

keyboard_set_map(key1,key2) 最 key1 コードのキーを key2 コードのキーに対


応させます。
keyboard_get_map(key) key の現在のマッピングを返します。
keyboard_unset_map() すべてのキーのマッピングを自分自身にリセットします。

 どれのマウス・ボタン、あるいはキーが押されたかを調べるために次の関数を使うことがで
きます。これらは、特に複数のキーが押されたとき便利です。

keyboard_check(key) key コードのキーが押されているか否かを調べる。


keyboard_check_direct(key) key コードのキーが押されているか否かを直接に
ハードウェアで調べる。アプリケーションと独立に行われます。その他の幾つかのチェ
ックも可能です。特に、vk_lshift、vk_lcontrol、vk_lalt、vk_rshift、vk_rcontrol、および
vk_ralt キー・コードで shift、control、および alt キーを調べることができます(W95 で
使用不能)。
mouse_check_button(numb) マウス・ボタンが押されているか否かを調べます(使
う値は、mb_none、mb_left、mb_middle、または mb_right です)。

 キーボードの状態を扱うために次のルーチンを使用することができます。
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 を使用します。

joystick_exists(id) ジョイスティック id(1 か 2)が存在するか否かを返します。


joystick_name(id) ジョイスティック id の名前を返します。
joystick_axes(id) ジョイスティック id の軸の数を返します。
joystick_buttons(id) ジョイスティック id のボタンの数を返します。
joystick_has_pov(id) ジョイスティック id が pov(point-of-view)機能を持つか
否かを返します。
joystick_direction(id) ジョイスティック id(1 か 2)の向きに対応するキー・コー
ド(vk_numpad1〜vk_numpad9)を返します。
joystick_check_button(id,numb) ジョイスティック・ボタンが押されているか否
か(ボタン番号:1〜4)を返します。
joystick_xpos(id) ジョイスティック id の x 座標(-1 か 1)を返します。
joystick_ypos(id)ジョイスティックの y 座標を返します。
joystick_zpos(id) ジョイスティックの z 座標を返します。
joystick_rpos(id) ジョイスティックの r 座標(rudder 位置、4番目の軸)を返しま
す。
joystick_upos(id) ジョイスティックの u 座標(5番目の軸)を返します。
joystick_vpos(id) ジョイスティックの v 座標(6番目の軸)を返します。
joystick_pov(id) ジョイスティック id の pov(point-of-view)を返します。これは角
度で、0-360 の間の値です。0は前進(フォワード)、90は右、180は後退(バックワー
ド)へ、270は左です。Pov が押されていないときは−1が返されます。

106
107
Chapter 32 GML: ゲームのグラフィクス
 ゲームの一つの重要な要素はグラフィックスです。通常ゲーム・メーカーが管理しますから、
簡単なゲームでは我々がほとんど何もしなくてもよいです。しかし、自分で制御したいときも
あります。多少のものにはそれに対応するアクションがありますが、幅広い制御の場合はコー
ドを使用します。この章はこのために用いる関数や変数について述べ、発生することの詳細
について触れています。

32.1 ウインドウとカーソル
 デフォルトでゲームはスクリーンの真ん中に配置されるウインドウで実行されます。プレイヤ
ーは、こらが<F4>のキーでフル・スクリーンに変更できます(これは無効でない場合)。プログ
ラムに次の変数を用いれば、同様のことが実現できます。

full_screen この変数はフル・スクリーン・モードで true です。この変数でモードが


変えられます(false で通常サイズ)。

フル・スクリーン・モードでカプションおよびスコアがスクリーンに表示されます(これは、ゲー
ムのオプションを使えば無効にすることができます)。フル・スクリーン・モードでイメージが中
央に表示されるか、あるいはスケール化されます。これが次の変数で制御できます。

scale_window ウインドウ・モードのスケール率を示す変数です。100 はスケール無


しを意味します。
scale_full フル・スクリーン・モードのスケール率を示す変数です。100 はスケール
無しを意味し、0 は最大のスケール率を指します。

スケール・モードは遅いマシンや遅いグラフィクス・カードではゲームを遅くしてしまいます。デ
フォルトで、ゲーム実行中にカーソルが表示されます。ほとんどのゲームにはこれは不要です。
カーソルを排除するために次の変数を使います。

show_cursor false に設定するとカーソルがゲーム領域内に表示されませんが、true


の場合は表示されます。

ウインドウで予め定義されているカーソルを次の関数で使用することができます。

show_cursor(cur) カーソルを cur に設定します。次の定数が使えます。


cr_default、cr_none、cr_arrow、cr_cross、cr_beam、cr_size_nesw、cr_size_ns、cr_size_n
wse、cr_size_we、cr_uparrow、cr_hourglass、cr_drag、cr_nodrop、cr_hsplit、cr_vsplit、cr
_multidrag、cr_sqlwait、cr_no、cr_appstart、cr_help、cr_headpoint、cr_size_all。

ところで、カーソルを作成するのはとても簡単です。否定の深さのオブジェクトを作成して、そ
のステップのイベントでマウスの位置を追跡するようにします。

モニターの解像度を調べるには次の読み出し専用の変数を使います。

monitor_width* ピクセル単位のモニターの横幅
monitor_height* ピクセル単位のモニターの縦幅

32.2 スプライトとイメージ
 各オブジェクトはスプライトをもちます。これは単一のイメージかあるいは多数のイメージ
のものです。オブジェクトの各インスタンスのために、プログラムはそれに該当するイメージを
スクリーンに表示します。その(スプライトで指定された)原点はオブジェクトの x、y 座標とな

108
ります。多数のイメージのものの場合は、一つずつを表示して動きのある効果を実現します。
イメージの描画に影響を与える変数が幾つかあります。これらを使えば描画効果が変えます。
各インスタンスは次の変数をもちます。

visible この変数が1(true)に設定されると、イメージが描画され、false の場合は表


示されません。透明のインスタンスはアクティブですので、衝突イベントも起こします。
ただ、見えないだけです。このように可視性を false にすると、制御用のオブジェクト
(衝突イベントを起こさないために非固定ものにしましょう)に使えますし、隠れたスイ
ッチにも使用できます。
sprite_index インスタンスの現在のスプライトのインデックスです。これを変えると
インスタンスに他のスプライトが与えられます。値として定義したスプライトの名前が
使えます。スプライトを変えても現在表示されているサブイメージのインデックスが変
わりません。
sprite_width* スプライトの横幅を表し、変えられないが使用できます。
sprite_height* スプライトの縦幅を表し、変えられないが使用できます。
sprite_xoffset* スプライトの横方向でのオフセットを表し、変えられないが使用
できます。
sprite_yoffset* スプライトの縦方向でのオフセットを表し、変えられないが使用
できます
image_number* インスタンスの現在のスプライトのサブイメージ数(変更不能)
image_index イメージが多数のサブイメージを持つとき、プログラムはこれら一つず
つを繰り返し使います。この変数は現在描画されているサブイメージを指します(これ
らが 0 から番号付けられています)。現在のイメージがこの変数の変更で変えられま
す。プログラムはこのインデックスからサブイメージを一つずつ繰り返し使います。
image_single 時々一つのイメージだけを使いたいことがあります。そのときはこの
変数を見たいサブイメージのインデックスに設定します(最初のサブイメージは 0 で
す)。−1に設定すると、プログラムはサブイメージを一つずつを繰り返し使います。多
数の外観のオブジェクトの場合はこれが役に立ちます。たとえば、回転のできるオブ
ジェクトがあったとします。このときオブジェクトのスプライトが(反時計)各方向用の
サブイメージを持つとします。このオブジェクトのステップのイベントでは次のようなコ
ードが使えます。
{
image_single = direction * image_number/360;
}

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 のタイルの有無を表します。

tile_get__x(id) 指定された id のタイルの x 座標を返します


tile_get__y(id) 指定された id のタイルの y 座標を返します。
tile_get__left(id) 指定された id のタイルの left 値を返します。
tile_get__top(id) 指定された id のタイルの top 値を返します。
tile_get_width(id) 指定された id のタイルの幅を返します。
tile_get_height(id) 指定された id のタイルの高さを返します。
tile_get_depth(id) 指定された id のタイルの深さを返します。
tile_get__visible(id) 指定された id のタイルが可視か透明かを表す値を返し
ます。
tile_get__xscale(id) 指定された id のタイルの xscale 値を返します。
tile_get__yscale(id) 指定された id のタイルの yscale 値を返します。
tile_get__background(id) 指定された id のタイルのバックグランドを返します。
tile_get__alpha(id) 指定された id のタイルの alpha 値を返します。

tile_set__position(id,x,y) 指定された id のタイルの x、y 座標を設定します。


tile_set__region(id,left,right,width,height) 属するバックグランド内
に、指定された id のタイルの領域を設定します。
tile_set__background(id,background) 指定された id のタイルのバックグラ
ンドを設定します。
tile_set__visible(id,visible) 指定された id のタイルを可視か透明かを設
定します。
tile_set__depth(id,depth) 指定された id のタイルの深さを設定します。
tile_set__scale(id,xscale,yscale) 指定された id のタイルのスケールを設
定します。
tile_set__alpha(id,alpha) 指定された id のタイルの alpha 値を設定します。

32.5 描画用の関数
 オブジェクトはそのイメージと全く異なる形にすることができます。色々な形のものを描くた
めに数多くの関数があります。テキストを表示する関数もあります。これらの関数をオブジェ
クトのドローイング(描画用)・イベントで使うべきです。他のコードでは意味がありません(後
述の 32.8 節を参照)。コンピュータのグラフィクス・ハードウェアはグラフィックスの表示を高
速化するだけです。このため、他のドローイング・ルーチンはかなり遅くなります。また、ゲー
ム・メーカーは高速なイメージ表示に最適化されています。このため、できるだけ他のドロー
イング・ルーチンの使用を避けてもらいたいです(それより、可能な限りビットマップ素材を作
成しましょう)。インスタンス間の衝突は、描画されることではなくオブジェクトの外観であるス

111
プライト(あるいはマスク)で決定されることを忘れないでほしい。イメージ関連の関数には次
のものがあります。

draw_sprite(n,img,x,y) スプライトの n 番目(インデックス:−1 は現在)のサブイ


メージ img を座標 (x,y)に描きます。
draw_sprite_scaled(n,img,x,y,s) スケール・ファクター s でスプライトを描画
します。
draw_sprite_stretched(n,img,x,y,w,h) 座標(x,y)を一番左上の角を基準と
して、幅 w と高さ h の領域を全部使うようにスプライトを表示します。
draw_sprite_transparent(n,img,x,y,s,alpha) スケール s でバックグランド
の色と混合したスプライトを描画します。透明度は alpha で指定します。 0 の値はスプ
ライトを完全に透明にし、1 の値はスプライトを可視にします。この関数で非常によい
効果が実現できます(半透明爆発などがその一つの例です)。この効果はソフトで行
われるのでとても遅く、注意して使いましょう。

draw_background(n,x,y) インデックス n のバックグランドを座標(x,y)に描画しま


す。
draw_background_scaled(n,x,y,s) バックグランドをスケール化して描画しま
す。
draw_background_stretched(n,x,y,w,h) 指定された領域にバックグランドを
ストレッチして描画します。
draw_background_transparent(n,x,y,s,alpha) 透明度 alpha(alpha: 0〜1)
とスケール係数 s でバックグランドを描画します。
draw_background_tiled(n,x,y) ルーム全体をバックグランドのタイルで描画し
ます。

 次の関数で基本的な形を描画します。これらの関数は色々なプロパティ、特にブラシおよ
びペンの色を用います。その設定は色々な変数で可能です。

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 から音楽を再生するための関数が幾つあります。

cd_init() 他の関数を使用する前に呼び出すべき関数です。また、 CD が変えられ


たときに呼び出すべきです(または時々呼び出しましょう)。
cd_present() CD が挿入されているかを返します。
cd_number() CD 上のトラック数を返します。
cd_playing() CD が再生中かを返します。
cd_paused() CD が一時停止かを返します。
cd_track() 現在のトラック番号を返します(1は最初のトラック)。
cd_length() CD の総合再生時間をミリ秒単位で返します。
cd_track_length(n) CD の n 番目のトラックの再生時間をミリ秒単位で返します。
cd_position() CD 上の現在の位置をミリ秒単位で返します。
cd_track_position() 現在のトラック上の現在の位置をミリ秒単位で返します。
cd_play(first,last) トラックから last トラックまで CD の再生を指示します。全
曲の再生を指定するには 1 と 1000 を使いましょう。
cd_stop() 再生を止める。
cd_pause() 再生を一時停止します。
cd_resume() 再生を再開始します。
cd_set_position(pos) CD 上の位置をミリ秒単位で設定します。
cd_set_track_position(pos) 現在のトラック上の現在の位置をミリ秒単位で
設定します。
cd_open_door() CD のトレイを開きます。
cd_close_door() CD のトレイを閉めます。

ウインドウのマルチメディア機能をアクセスするために次の関数があります。

MCI_command(str) この関数は MCI(Media Control Interface)を使ってウインドウ


のマルチメディア・システムに命令列を送ります。返し列を返します。これで色々なマ
ルチメディア装置を制御することができます。ウインドウの資料を参考にして、該当の
命令の使用を調べましょう。たとえば、 MCI_command('play cdaudio from 1')
の命令で 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 形式でなければなりません。これで色々な場面に色々なヘルプファイルの表
示が可能になります。データ・ファイルのリソースでこれらのファイルの追加ができま
す。

 メッセージの表示や、質問、メニューやダイヤログなどのようなポップ・アップを表示する次
の関数があります。

show_message(str) str の文字列をメッセージとしてダイアログ・ボックスを表示し


ます。
show_message_ext(str,but1,but2,but3) str の文字列をメッセージとして3つ
のボタンのダイアログ・ボックスを表示します。But1、but2、but3 はボタンのテキストで
す。空白の文字列はそのボタンを表示しないを意味します。&と文字を使うと、その文
字はボタンのショットカットになります。この関数は押されたボタンの番号を返します
(Esc が押されると、0を返します)。
show_question(str) 質問を表示します。ユーザーが yes を選んだとき true を返し、
yes ではないとき、false を返します

get_integer(str,def) ダイアログ・ボックスで値(整数)を要求します。str はメッ


セージです。def はデフォルトの値です。
get_string(str,def) ダイアログ・ボックスで文字列を要求します。str はメッセー
ジです。def はデフォルトの文字列です。
message_background(back) 上記の関数のポップアップ・ボックスのバックグラン
ド・イメージを設定します。back はゲームで定義されたバックグランドの一つでなけれ
ばなりません。
message_button(spr) ポップアップ・ボックスのボタンのスプライトを設定します。
これは三つのイメージで構成されていなければなりません。最初のは、ボタンが押さ
れてないしマウスはその上にないときのイメージです。2番目は、ボタンが押されてな
いがマウスはその上にあるときのイメージです。3番目はボタンが押されたときのイメ
ージです。

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 はゲームは終了すべきかを表示します。

 最上位得点のリストはゲーム毎で保持される特別なポップ・アップです。これに関連の次
の関数が使用できます。

highscore_show(numb) スコアー表を示します。numb は新スコアーです。これが現


行スコアーよりよいものであれば、スコアー表に入れられ、プレイヤーが氏名を記入す
ることができます。−1の値を使うと、現在のリストだけ表示されます。
highscore_show_ext(numb,back,border,col1,col2,name,size) スコアー
表を示します。numb は新スコアーです。これが現行スコアーよりよいものであれば、
スコアー表に入れられ、プレイヤーが氏名を記入することができます。−1の値を使うと、
現在のリストだけ表示されます。back は使用するバックグランド・イメージを指定しま
す。border は枠線を表するか否かを指定します。col1 は新スコアーの色、col2 はその

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 スプライト
 次の関数はスプライトについて情報を提供します。

sprite_exists(ind) インデックス ind のスプライトが存在するか否かを返します。


sprite_get_name(ind) インデックス ind のスプライト名を返します。
sprite_get_number(ind) インデックス ind のスプライトのサブイメージ数を返しま
す。
sprite_get_width(ind) インデックス ind のスプライトの幅を返します。
sprite_get_height(ind) インデックス ind のスプライトの高さを返します。
sprite_get_transparent(ind) インデックス ind のスプライトが透明か否かを返
します。
sprite_get_xoffset(ind) インデックス ind のスプライトの x オフセットを返します。
sprite_get_yoffset(ind) インデックス ind のスプライトの y オフセットを返します。
sprite_get_bbox_left(ind) インデックス ind のスプライトのバウンディング・ボッ
クスの左サイドを返します。
sprite_get_bbox_right(ind) インデックス ind のスプライトのバウンディング・ボ
ックスの右サイドを返します。
sprite_get_bbox_top(ind) インデックス ind のスプライトのバウンディング・ボッ
クスのトップ・サイドを返します。
sprite_get_bbox_bottom(ind) インデックス ind のスプライトのバウンディング・
ボックスのボトム・サイドを返します。
sprite_get_precise(ind) インデックス ind のスプライトが厳密な衝突の計算を
使用するか否かを返します。
sprite_get_videomem(ind) インデックス ind のスプライトがビデオ・メモリを使用
するか否かを返します。
sprite_get_loadonuse(ind) インデックス ind のスプライトが使用のときだけロー
ドされるか否かを返します。

 スプライトは沢山のメモリを占めます。描画時間を短くにするためにスプライトをビデオ・メ
モリに保存しなければなりません。第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 サウンド
 次の関数はサウンドの情報を示します。

sound_exists(ind) インデックス ind のサウンドが存在するか否かを返します。


sound_get_name(ind) インデックス ind のサウンド名を返します。
sound_get_kind(ind) Returns the kind of the sound with the given index (). インデ
ックス ind のサウンドの種類を返します(0=wave、1=midi、2=mp3、10=未知)。
sound_get_buffers(ind) インデックス ind のサウンドのバッファ数を返します。
sound_get_effect(ind) インデックス ind のサウンドが特別効果を許すか否かを
返します。
sound_get_loadonuse(ind) インデックス ind のサウンドが必要に応じてロードさ
れるか否かを返します。

サウンドは沢山のリソースを使います。また、数多くのシステムは限られた数のサウンドしか
再生できません。規模の大きいゲームを開発すると、メモリにあるサウンドを制御したくなりま
す。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 バックグランド
 次の関数がバックグランドについて情報を示します。

background_exists(ind) インデックス ind のバックグランドが存在するか否かを


返します。
background_get_name(ind) インデックス ind のバックグランド名を返します。
background_get_width(ind) インデックス ind のバックグランドの幅を返します。
background_get_height(ind) インデックス ind のバックグランドの高さを返しま
す。
background_get_transparent(ind) インデックス ind のバックグランドが透明か
否かを返します。
background_get_videomem(ind) インデックス ind のバックグランドがビデオ・メモ
リを使用するか否かを返します。
background_get_loadonuse(ind) インデックス ind のバックグランドが必要に応
じてロードされるか否かを返します。

 バックグランド・イメージは沢山のメモリを占めます。これらを高速に描画するためにビデ
オ・メモリに保存する必要があります。第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 パス
 次の関数はパスについて情報を示します。

path_exists(ind) インデックス ind のパスが存在するか否かを返します。


path_get_name(ind) インデックス ind のパス名を返します。
path_get_length(ind) インデックス ind のパスの長さを返します。
path_get_kind(ind) インデックス ind のパスの接続タイプ(0=直線 1=滑らか)を
返します。
path_get_end(ind) インデックス ind のパスの末に起こること(0=停止、1=スタート
へジャンプ、2=スタートに接続する、3=逆方向、4=続ける)を返します。

35.5 スクリプト
 次の関数はスクリプトについて情報を示します。

script_exists(ind) インデックス ind のスクリプトが存在するか否かを返します。


script_get_name(ind) インデックス ind のスクリプト名を返します。
script_get_text(ind) インデックス ind のスクリプトのテキストを返します。

127
35.6 データ・ファイル
 次の関数はデータ・フィルについて情報を示します。

datafile_exists(ind) インデックス ind のデータ・ファイルが存在するか否かを返


します。
datafile_get_name(ind) インデックス ind のデータ・ファイル名を返します。
datafile_get_filename(ind) インデックス ind のデータ・ファイルのファイル名を
返します。

データ・ファイルを自動的にゲーム開始時に輸出(エスポート)しないときは、次の関数が使
えます。

datafile_export(ind,fname) 指定された ind データ・ファイルを fname ファイル


名のファイルへエスポーとします(デフォルトでこれを行わないとき実行されます)。
datafile_discard(ind) 指定された ind データ・ファイルのメモリを解放します。

35.7 オブジェクト
 次の関数はオブジェクトについて情報を示します。

object_exists(ind) インデックス ind のオブジェクトが存在するか否かを返します。


object_get_name(ind) インデックス ind のオブジェクト名を返します。
object_get_sprite(ind) インデックス ind のオブジェクトのデフォルトのスプライ
トのインデックスを返します。
object_get_solid(ind) インデックス ind のオブジェクトがデフォルトで個体か否
かを返します。
object_get_visible(ind) インデックス ind のオブジェクトがデフォルトで透明か
否かを返します。
object_get_depth(ind) インデックス ind のオブジェクトの深さを返します。
object_get_persistent(ind) インデックス ind のオブジェクトがパシステントか
否かを返します。
object_get_mask(ind) インデックス ind のオブジェクトのマスクのインデックスを
返します(特別なマスクがない場合は−1が返されます)。
object_get_parent(ind) インデックス ind のオブジェクトの親オブジェクトのイン
デックスを返します(親がない場合は−1が返されます)。
object_is_ancestor(ind1,ind2) インデックス ind2 のオブジェクトが ind1 のオ
ブジェクトの祖先であるか否かを返します。

35.8 ルーム
 次の関数はルームについて情報を示します。

room_exists(ind) インデックス ind のルームが存在するか否かを返します。


room_get_name(ind) インデックス ind のルーム名を返します。

ルームがゲーム中に変わるため、ルームの内容を変えるために他のルーチンがあります。

128
129
Chapter 36 GML: ファイル、登録、プログラムの実行
 より上級レベルのゲームではゲームと一緒に配布されたファイルからデータを読み込みた
いことがあります。たとえば、ゲーム中の幾つかの場面で起こることを指定するファイルを作
成することができます。また、ゲームの再使用のとき関連の情報(現在のルームなど)を保存
したい場合もあります。このために、次の関数があります。

file_exists(fname) 指定した fname のファイルがある(true)かない(false)を返


します。
file_delete(fname) 指定した fname ファイルを削除します。
file_rename(oldname,newname) ファイルの名前 oldname を newname に変えま
す。
file_copy(fname,newname) ファイル fname を newname にコピーします。
file_open_read(fname) 指定された fname ファイルを読み出し専用に開きます。
file_open_write(fname) 指定した fname ファイルを書き込み可能にして開きま
す。ファイルが存在しない場合は、新規作成します。
file_open_append(fname) 指定した fname ファイルを書き込み追加可能にして
開きます。ファイルが存在しない場合は、新規作成します。
file_close() 現在のファイルを閉じます(ファイルが開いている場合は最後に必ず
これを使用して下さい)。
file_write_string(str) 現在開いてあるファイルに str の文字列を書き込みま
す。
file_write_real(x) 現在開いてあるファイルに x の実数を書き込みます。
file_writeln() ファイルに改行コードを書き込みます。
file_read_string() ファイルから行末までの文字列を読み込み、これを返します。
file_read_real() ファイルから実数を読んでその値を返します。
file_readln() 現在の行から飛び出して次の行の先頭に移動します。
file_eof() ファイル末に着いたことを知らせます。
directory_exists(dname) 指定されたディレクトリの存在の有無を知らせます。
directory_create(dname) 指定されたディレクトリが存在しないとき新規作成し
ます(パスを含めた作成に成ります)。
file_find_first(mask,attr) 指定された mask および attr の特徴を満たす最
初のファイルの名前を返します。そのファイルが存在しないときは空列を返します。マ
スクにパスおよびワイルド文字が記入できます。たとえば、‘C:\temp\*.doc’が可能で
す。アトリビュートは他みたいファイルの特徴を指します(通常、マスクを満たすファイ
ルが返されます)。次の定数を使えばみたいファイルを指定することができます。
fa_readonly 読み出し専用ファイル
fa_hidden 非表示ファイル
fa_sysfile システム・ファイル
fa_volumeid volume-id ファイル
fa_directory ディレクトリ
fa_archive アーカイブ・ファイル
file_find_next() 指定されたマスクと特徴を満たす次のファイルを返します。そ
のファイルが存在しないときは空列が返されます。
file_find_close() ファイルを取り扱った後必ずこの関数を呼んでメモリを解放し
ましょう。
file_attributes(fname,attr) 指定された fname のファイルは指定された特徴
を持つか否かを返します。上記の定数の組み合わせを使います。

 環境設定(Preferences)で安全モードがチェックされていると、上記の幾つかの関数はパ
ス指定ができなくなります。このとき、アプリケーション・フォルダー内のファイルのみ書き換え
られます。

130
次の読み出し専用変数は役に立ちます。

game_id* ゲームの唯一の id です。唯一のファイル名が必要のときこれが使用でき


ます。
working_directory* ゲームのワーキング・ディレクトリ(最後のバックスラッシュを
除いた文字列)
temp_directory* ゲーム用の一時的なディレクトリ。一時的なファイルをここで保
存できます。ゲーム終了時にこれらは削除されます。

 場合によっては、ゲーム中にペレイヤーにコマンド・ラインの入力を許してあげたいことが
あります(たとえば、トリックや特別モードの作成のため)。その引数を得るために次の関数が
使えます。

parameter_count() コマンド・ラインの引数の数を返します(プログラムはその一
つであることに注意)。
parameter_string(n) n 番目のコマンド・ラインの引数を返します。最初の引数は
0 です。これはプログラム名です。

 ゲーム実行の間に少量の情報を保存したいときは、ファイル使用より簡単方法があります。
registry(登録)が使えます。この registry はウインドウスが完備して、プログラムの設定に使用
されている大きなデータベースです。その各項目(entry)は名前と値をもっています。この両
方、つまり文字列と実数が次の関数で使用できます。

registry_write_string(name,str) registry に name の名前と str の値で一つ


の項目を生成します。
registry_write_real(name,x) registry に name の名前と x の(実数)値で一つ
の項目を生成します。
registry_read_string(name) name の名前で保存されている文字列を返します
(name が存在しないとき空列が返されます)。
registry_read_real(name) name の名前で保存されている(実数)値を返します
(name が存在しないとき0が返されます)。
registry_exists(name) name の名前があるかないかを返します。

実は、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 やワードなどのようなファイルかプログラムです。この関数は実行終了が待てません
のでゲームが一時停止しません。

execute_program(prog,arg,wait) prog のプログラムを arg の引数で実行しま


す。wait は終了を待つか否かを指定します。
execute_shell(prog,arg) シェルでプログラム(ファイル)を実行します。

ユーザーが安全モードを環境設定(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 アドレスを知らせることができます。

mplay_ipaddress() 自分のコンピュータの IP アドレスを返します(たとえば、


123.123.123.12 のような文字列が返されます)。これがスクリーンのどこかに表示でき
ます。この関数は遅いので、頻繁に使用しないで下さい。

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 は真か偽(デフォ
ルト)かの値を取ります。

現在のセッションの状態を調べるには次の関数を使います。

mplay_session_status() 現行のセッションの状態を返します。0 はセッションが


ない、1 は作成したセッション、2 は参加したセッション。

プレイヤーが次の関数でセッションを終了することができます。

mplay_session_end()ends the session for this player.このプレイヤーのセッション


を終了します。

135
37.3 プレイヤー
 セッションに参加する各ゲームは一つのプレイヤーになります。プレイヤーが名前をもちま
す。プレイヤー対応の関数には次のものがあります。

mplay_player_find() 現行のセッションのプレイヤー数を返します。
mplay_player_name(numb) numb 番号のプレイヤー名を返します(0 は最初のプ
レイヤーで、自分の番号になります)。これは前の関数の実行後にしか使えません。
mplay_player_id(numb) numb 番号の id を返します(0 は最初のプレイヤーで、自
分の番号になります)。この関数も前の最初の関数の実行後にしか使えません。この
id はメッセージの送受信に使います。

37.4 共有データ
 共有データの使用は、ゲームを同期させるには一番簡単な方法です。通信はバックグラン
ド(見えないところ)で行われます。1万個の値が共用できます。ゲームの各成分はこれらにア
クセスすることができます。ゲーム・メーカーは皆同じ値をみることを保証します。これらの値
は実数か文字列です。このための関数が二つあります。

mplay_data_write(ind,val) ind(0〜10000)で指定された場所に val という値


(実数か文字列)を格納します。
mplay_data_read(ind) ind(0〜10000)で指定された場所に格納されている値
(実数か文字列)を返します。初期値すべてが 0 です。

コンピュータ間のデータを一致(同期)させるために保証モード(遅い方)と保証無しモード
が使えます。このモードの変更には次の関数を用います。

mplay_data_mode(guard) 保証モードを使うか否かを設定します。guard は真(デ


フォルト)か偽の値です。

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つ以上の引数の場合は実数しか使えません)。また、
これらの関数を返すものは、実数かヌルを末尾にもつ文字列だけです。

 Delphi では、そのメニューから New を File メニューからを選び、DLL を選択します。次に


示すのは、ゲーム・メーカーで使用可能な Delphi で作成した DLL ファイルの例です(これは
Delphi コードで、GML ではないことに注意)。

library MyDLL;

uses SysUtils, Classes;

function MyMin(x,y:real):real; cdecl;


begin
if x<y then Result := x else Result := y;
end;

var res : array[0..1024] of char;

function DoubleString(str:PChar):PChar; cdecl;


begin
StrCopy(res,str);
StrCat(res,str);
Result := res;
end;

exports MyMin, DoubleString;

begin
end.

この DLL は、二つの値のその最小値を出す MyMin および文字列を倍にする DoubleString


二つの関数を定義します。メモリ管理を厳密に行うことを忘れないように注意しましょう。この
ため、結果の文字列をグローバルとしました。また、cdecl の呼び出し方の使用にも注意され
たい。呼び出しには cdecl か stdcal を使用できます。Delphi で DLL を作ると、MyDLL.DLL
のファイルが得られます。このファイルはゲームの実行用ディレクトリに置かなければなりま
せん(またはウインドウス OS に見つけられる場所でもよい)。
 このような DLL をゲーム・メーカーで用いるために、まず使いたい外部関数およびその引
数を指定しなければなりません。このため、GML には次の関数があります。

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);
}

関数を呼び出す必要であれば、次の関数を使います。

external_call(id,arg1,arg2,…) 指定された id をもつ外部関数を呼び出しま


す。適切な引数の数とタイプを指定しなければなりません(実数か文字列)。この関
数は外部関数の結果を返します。

ですから、次のような記述を使います。
{
aaa = external_call(global.mmm,x,y);
sss = external_call(global.ddd,'Hello');
}

ゲーム用 DLL の作成はどうやってやると疑問に思うのでしょうか。たとえば、ゲームにインス


タンスを追加するプログラムを作りたいことを仮定しましょう。一番簡単作りは GML コードを
文字列で返す関数で実現できます。返された文字列のコードが次の GML 関数で実行でき
ます。

execute_string(str) str の文字列にあるコードを実行します。

また、DLL に実行可能なスクリプトのファイルを作成させることができます(この関数はその
後ゲームの動作を変更させるにも使えます)。

execute_file(fname) fname のコードを実行します。

このように外部の関数を呼んで、返された文字列が次のように実行できます。
{
ccc = external_call(global.mmm,x,y);
execute_string(ccc);
}

滅多に必要はないが、DLL がゲームのメイン・グラフィックスを扱い方(ハンドル)が知らなけ
ればなりません。これは次の関数で実現でき、その結果は DLL に渡せます。

window_handle() メイン・ウインドウのハンドルを返します。

DLL は安全モードで使用できないことに注意しましょう。

 外部の DLL の使用は強力なツールです。しかし、やっていることをよく分かっているときの


みこれを利用ください。

140

You might also like