gamemaker-expert について
GameMaker Studio 2 と GML の開発を支援するスキルです。オブジェクトやリソースの作成、言語仕様、設計、トラブルシューティングを扱い、ゲームの開発や保守に利用できます。詳細な確認先として公式マニュアルも案内します。
主な機能
- 01オブジェクト、イベント、リソース作成の案内
- 02GML の構文とデータ構造の解説
- 03設計パターンと落とし穴の参考情報
- 04メモリ管理とファイル処理を網羅
- 05公式マニュアルの参照を案内
活用シーン
- 01GameMaker のオブジェクトやスクリプトを作成・編集
- 02コンパイルエラーや実行時の問題を調査
- 03衝突判定、描画、ネットワーク機能を実装
- 04プロジェクト構成やパフォーマンスを改善
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ leihaht/ gamemaker-skills --skill gamemaker-expertインストール後、Claude Code で/gamemaker-expertを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/ADVANCED_TOPICS.mdARCHITECTURE_PATTERNS.mdBUILT_IN_VARIABLES.mdCOMMON_PITFALLS.mdGML_REFERENCE.mdMANAGER_CONSTRUCTOR_GUIDE.mdQUICK_REFERENCE.md詳細
GameMaker エキスパート
概要
このスキルでは、あらゆる GameMaker プロジェクトに役立つ、GameMaker Studio 2 と GML(GameMaker Language)の包括的な専門知識を提供します。基本的なオブジェクトの作成から、シェーダープログラミング、ネットワーク、プラットフォーム固有の開発などの高度なトピックまでを網羅しています。
このスキルを使用する場面:
.gmlファイル(GML スクリプトとイベント)を扱うとき.yyファイル(オブジェクト定義、スプライト定義など)を作成または変更するとき.yypプロジェクトファイルを編集するとき- GameMaker のオブジェクト、スクリプト、アセットを作成するとき
- GameMaker のコンパイルエラーや実行時の問題をデバッグするとき
- GameMaker の機能(描画、衝突、ネットワークなど)を実装するとき
- GameMaker のパフォーマンスを最適化するとき
- GameMaker Studio 2 の開発タスク全般
GameMaker 公式マニュアル
主な参照先:包括的で最新のドキュメントを確認するには、必ず GameMaker 公式マニュアルを参照してください。 https://manual.gamemaker.io/monthly/en/
マニュアルの主なセクション
- GML の概要:https://manual.gamemaker.io/monthly/en/GameMaker_Language/GML_Overview.htm
- 変数、データ型、演算子、キーワード、制御フロー
- GML リファレンス:https://manual.gamemaker.io/monthly/en/GameMaker_Language/GML_Reference.htm
- カテゴリ別に整理されたすべての組み込み関数(描画、数学、文字列、インスタンスなど)
- オブジェクトとイベント:https://manual.gamemaker.io/monthly/en/The_Asset_Editors/Objects.htm
- オブジェクトのプロパティ、イベントシステム、親子関係
- スプライト:https://manual.gamemaker.io/monthly/en/The_Asset_Editors/Sprites.htm
- スプライトエディター、衝突マスク、アニメーション
- データ構造:https://manual.gamemaker.io/monthly/en/GameMaker_Language/GML_Reference/Data_Structures.htm
- ds_list、ds_map、ds_grid、ds_priority、ds_queue、ds_stack
- ファイル処理:https://manual.gamemaker.io/monthly/en/GameMaker_Language/GML_Reference/File_Handling.htm
- ファイル入出力、JSON、バッファー、ディレクトリ
公式マニュアルを使用する場面:
- 関数のシグネチャとパラメーターを調べるとき
- プラットフォーム固有の動作を理解するとき
- IDE のバージョンにおける最新の構文変更を確認するとき
- GameMaker の機能について詳しく調べるとき
追加の参考資料
高度なアーキテクチャ設計の指針:
- アーキテクチャパターン:references/ARCHITECTURE_PATTERNS.md
- GameMaker 固有のパターン(サービスロケーター、コマンドパターン、イベント駆動フロー)
- GML に応用した SOLID 原則
- マネージャーコンストラクターを使ったカプセル化パターン
- パフォーマンスパターンとアンチパターン
- マネージャーコンストラクターガイド:references/MANAGER_CONSTRUCTOR_GUIDE.md
- マネージャーコンストラクターの作成手順
- パブリック API の設計パターン
- 下位互換性のための参照公開パターン
- クリーンアップの責務とテスト戦略
- 組み込み変数:references/BUILT_IN_VARIABLES.md
- GameMaker の予約変数一覧
- 位置、スプライト、物理演算、パス、タイムラインのカテゴリ
- 非推奨のグローバル変数(
health、score、lives) - 安全な代替手段と検証チェックリスト
- GML リファレンス:references/GML_REFERENCE.md
- 言語構文、演算子、データ型
- よくある落とし穴:references/COMMON_PITFALLS.md
- よくある間違いとその解決策
- クイックリファレンス:references/QUICK_REFERENCE.md
- よく使うパターンのチートシート
これらの参考資料を使用する場面:
- ゲーム全体の状態を管理するマネージャーコンストラクターを設計するとき
- GameMaker の組み込み変数との競合を避けるとき
- GML でカプセル化パターンを実装するとき
- 疑似プライベートメンバーに使う
__プレフィックスの慣例を理解するとき - GameMaker の文脈で SOLID 原則を学ぶとき
- 保守しやすいコードのアーキテクチャパターンを探すとき
GameMaker の主要なワークフロー
オブジェクト作成のワークフロー(重要)
GameMaker オブジェクトを作成するには、4 つの手順をすべて完了する必要があります。いずれかの手順を省略すると、オブジェクトが IDE に表示されなかったり、コンパイルに失敗したりします。
手順 1:オブジェクトのディレクトリを作成する
objects/objYourObjectName/
命名規則:
objプレフィックスで始める- PascalCase を使用する(例:
objPlayer、objEnemyMelee、objInventoryUI) - 目的を示すわかりやすい名前にする
手順 2:イベントファイルを作成する
オブジェクトで必要な各イベントに .gml ファイルを作成します。
一般的なイベント:
| イベントファイル | イベントタイプ | 使用するタイミング |
|---|---|---|
Create_0.gml | 作成イベント | 変数を初期化する(必ず含める) |
Step_0.gml | ステップイベント | 毎フレーム、ロジックを更新する |
Draw_0.gml | 描画イベント | ゲーム内のグラフィックを描画する |
Draw_64.gml | GUI 描画イベント | UI オーバーレイを描画する |
Destroy_0.gml | 破棄イベント | 破棄時にクリーンアップする |
Collision_objX.gml | 衝突イベント | 衝突を処理する |
イベントの命名規則:
- 作成:
Create_0.gml - ステップ:
Step_0.gml - 描画:
Draw_0.gml - GUI 描画:
Draw_64.gml(Draw_GUI_0.gmlではありません!) - 衝突:
Collision_objTargetName.gml
Create_0.gml の例:
/// objPlayer Create Event
// Initialize player variables
// Movement
move_speed = 4;
direction = 0;
// Stats
health = 100;
max_health = 100;
// State
is_moving = false;
show_debug_message("objPlayer created");
手順 3:.yy ファイルを作成する(必須)
ファイル:objects/objYourObjectName/objYourObjectName.yy
テンプレート:
{
"$GMObject":"",
"%Name":"objYourObjectName",
"eventList":[
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":64,"eventType":8,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
{"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
],
"managed":true,
"name":"objYourObjectName",
"overriddenProperties":[],
"parent":{
"name":"Objects",
"path":"folders/Objects.yy",
},
"parentObjectId":null,
"persistent":false,
"physicsAngularDamping":0.1,
"physicsDensity":0.5,
"physicsFriction":0.2,
"physicsGroup":1,
"physicsKinematic":false,
"physicsLinearDamping":0.1,
"physicsObject":false,
"physicsRestitution":0.1,
"physicsSensor":false,
"physicsShape":1,
"physicsShapePoints":[],
"physicsStartAwake":true,
"properties":[],
"resourceType":"GMObject",
"resourceVersion":"2.0",
"solid":false,
"spriteId":null,
"spriteMaskId":null,
"visible":true,
}
イベントタイプ番号:
| イベント | eventType | eventNum |
|---|---|---|
| 作成 | 0 | 0 |
| ステップ | 3 | 0 |
| 描画 | 8 | 0 |
| GUI 描画 | 8 | 64 |
| 破棄 | 1 | 0 |
重要なフィールド:
%Nameとname:オブジェクト名と完全に一致させる必要がありますeventList:作成した各.gmlファイルのエントリを含めますparentObjectId:継承を使用する場合は、親オブジェクトのリソースパスを設定します(例:{"name":"objCreature","path":"objects/objCreature/objCreature.yy"})persistent:オブジェクトをルーム間で維持する場合はtrueに設定しますvisible:スプライトを持たないコントローラーオブジェクトの場合はfalseに設定します
手順 4:プロジェクトファイルに登録する(必須)
ファイル:YourProject.yyp
場所:"resources":[ 配列を探します
エントリを追加する(アルファベット順):
{"id":{"name":"objYourObjectName","path":"objects/objYourObjectName/objYourObjectName.yy",},},
例:
"resources":[
{"id":{"name":"objInventoryUI","path":"objects/objInventoryUI/objInventoryUI.yy",},},
{"id":{"name":"objPlayer","path":"objects/objPlayer/objPlayer.yy",},},
{"id":{"name":"objYourObjectName","path":"objects/objYourObjectName/objYourObjectName.yy",},},
]
重要:この手順を省略すると、「object not found」などのコンパイルエラーが発生します。
GML 言語の基本
変数のスコープ
// Local variable (function/script scope only)
var _local_var = 100;
// Instance variable (attached to object instance)
instance_var = 50;
// Global variable (accessible everywhere)
global.game_state = "playing";
ベストプラクティス:わかりやすくするため、ローカル変数名の先頭にアンダースコア _ を付けます。
データ型
- Real:数値
var _x = 100;var _pi = 3.14159; - String:テキスト
var _name = "Player"; - Boolean:真/偽
var _is_alive = true; - Array:
var _items = [1, 2, 3];var _nested = [[1,2], [3,4]]; - Struct:
var _player = { x: 0, y: 0, health: 100 }; - Undefined:
undefined(is_undefined()で確認します) - ポインター/ID:インスタンス、データ構造、アセットへの参照
演算子
算術:+ - * / div mod
比較:== != > < >= <=
論理:&& || ! ^^ (and, or, not, xor)
ビット演算:& | ^ << >> ~
三項演算子:condition ? true_value : false_value
重要 - 三項演算子の連結:
三項演算子を連結する場合、ネストされた条件は必ず二重かっこで囲む必要があります。
// ✅ CORRECT
var _result = condition_a ? "foo" : ((condition_b ? "bar" : "baz"));
// ❌ WRONG (will cause compile error in some versions)
var _result = condition_a ? "foo" : condition_b ? "bar" : "baz";
リファレンス:https://manual.gamemaker.io/beta/en/GameMaker_Language/GML_Overview/Expressions_And_Operators.htm
制御フロー
// If statement
if (condition) {
// code
} else if (other_condition) {
// code
} else {
// code
}
// Switch statement
switch (value) {
case 1:
// code
break;
case 2:
case 3:
// code for 2 or 3
break;
default:
// code
break;
}
// For loop
for (var _i = 0; _i < 10; _i++) {
show_debug_message(_i);
}
// While loop
while (condition) {
// code
}
// Repeat loop
repeat (10) {
// code
}
// With loop (iterate instances)
with (objEnemy) {
health -= 10;
}
データ構造とメモリ管理
Struct(軽量 - 推奨)
// Create struct (no manual cleanup needed!)
var _player = {
name: "Hero",
health: 100,
max_health: 100,
level: 1
};
// Access properties
show_debug_message(_player.name); // "Hero"
_player.health -= 10;
// Check if property exists
if (variable_struct_exists(_player, "mana")) {
// property exists
}
// Dynamic property access
var _prop_name = "health";
var _value = _player[$ _prop_name]; // Same as _player.health
用途:軽量なデータコンテナー、設定データ、シンプルなキーと値のペア。 利点:手動でのクリーンアップは不要で、自動的にガベージコレクションされます。
ds_list(動的配列)
// Create
var _list = ds_list_create();
// Add items
ds_list_add(_list, "apple", "banana", "cherry");
ds_list_insert(_list, 1, "orange"); // Insert at index
// Access
var _item = _list[| 0]; // "apple"
var _size = ds_list_size(_list);
// Iterate
for (var _i = 0; _i < ds_list_size(_list); _i++) {
show_debug_message(_list[| _i]);
}
// CRITICAL: Always destroy when done!
ds_list_destroy(_list);
用途:大きなコレクション、特定のリスト操作が必要な場合、パフォーマンスが重要なコード。
重要:メモリーリークを防ぐため、ds_list_destroy() で手動で破棄する必要があります。
ds_map(キーと値のペア)
// Create
var _map = ds_map_create();
// Add items
_map[? "name"] = "Player";
_map[? "health"] = 100;
// Access
var _hp = _map[? "health"]; // 100
// Check if key exists
if (ds_map_exists(_map, "mana")) {
// key exists
}
// Iterate
var _key = ds_map_find_first(_map);
while (!is_undefined(_key)) {
show_debug_message(_key + ": " + string(_map[? _key]));
_key = ds_map_find_next(_map, _key);
}
// CRITICAL: Always destroy when done!
ds_map_destroy(_map);
使用する場面:レガシーコード、特定のマップ操作が必要な場合、既存の ds_map コードとの統合。
重要:ds_map_destroy() で手動で破棄する必要があります。破棄しないとメモリーリークが発生します。
推奨:可能であれば ds_map の代わりに構造体を使用してください。よりシンプルで、手動でクリーンアップする必要もありません。
メモリーリークの防止
必ず破棄する必要があるデータ構造:
ds_list_destroy(_list)ds_map_destroy(_map)ds_grid_destroy(_grid)ds_priority_destroy(_priority)ds_queue_destroy(_queue)ds_stack_destroy(_stack)surface_free(_surface)buffer_delete(_buffer)
Destroy イベントでクリーンアップするパターン:
/// objPlayer Destroy Event
// Clean up data structures
if (ds_exists(inventory_list, ds_type_list)) {
ds_list_destroy(inventory_list);
}
if (surface_exists(shadow_surface)) {
surface_free(shadow_surface);
}
ファイルシステムと永続化
datafiles/ フォルダー(同梱ファイル)
重大な制限:一部の GameMaker バージョンでは、datafiles/ 内のルート階層にあるファイルのみサポートされ、サブディレクトリは使用できません。
✅ CORRECT:
datafiles/config.json
datafiles/items.json
datafiles/level_data.json
❌ WRONG (may not work in all versions):
datafiles/configs/game_config.json
datafiles/data/items/weapons.json
登録が必要です:datafiles/ 内のすべてのファイルを .yyp プロジェクトファイルに登録する必要があります。
{"$GMIncludedFile":"","%Name":"config.json","CopyToMask":-1,"filePath":"datafiles","name":"config.json","resourceType":"GMIncludedFile","resourceVersion":"2.0",},
JSON ファイル
// Load JSON from datafiles/
function load_json_file(_filename) {
if (!file_exists(_filename)) {
show_debug_message("ERROR: File not found: " + _filename);
return noone;
}
var _file = file_text_open_read(_filename);
var _json_string = "";
while (!file_text_eof(_file)) {
_json_string += file_text_read_string(_file);
file_text_readln(_file);
}
file_text_close(_file);
return json_parse(_json_string);
}
// Save JSON to working directory
function save_json_file(_filename, _data) {
var _json_string = json_stringify(_data);
var _file = file_text_open_write(_filename);
file_text_write_string(_file, _json_string);
file_text_close(_file);
}
セーブファイルの保存場所
// Working directory (platform-dependent save location)
var _save_path = working_directory + "savegame.json";
// Game save ID (unique folder for your game)
// On Windows: %LOCALAPPDATA%/[game_save_id]/
var _save_id = game_save_id;
イベントシステムと実行順序
イベントの実行順序(フレームごと)
- Begin Step - メインロジックの前
- Alarm Events - カウントダウンタイマー
- Keyboard/Mouse Events - 入力の検出
- Step - メインの更新ロジック
- Collision Events - 移動後
- End Step - すべてのロジックの実行後
- Draw - ゲーム内グラフィックスの描画
- Draw GUI - UI オーバーレイの描画
- Draw End - 後処理
永続オブジェクト
ルーム遷移後も存続させるには、.yy ファイルで persistent: true を設定します。
重要:イベントハンドラーを持つ永続オブジェクトを使用する場合は、ルームに再入室するときにハンドラーを解除し、登録の重複を防いでください。
// rmGameplay Room Creation Code
// Clear handlers to prevent duplicates
global.input_controller.clear_all_handlers();
// Register handlers fresh
global.input_controller.register_handler("ACTION", function(_cmd) {
// handle action
});
描画とグラフィックス
基本的な描画
// Draw sprite
draw_sprite(spr_player, image_index, x, y);
draw_sprite_ext(spr_player, image_index, x, y, scale_x, scale_y, rotation, color, alpha);
// Draw text
draw_text(x, y, "Hello World");
draw_set_font(fnt_arial);
draw_set_color(c_white);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
// Draw shapes
draw_rectangle(x1, y1, x2, y2, outline);
draw_circle(x, y, radius, outline);
draw_line(x1, y1, x2, y2);
サーフェス(レンダーターゲット)
// Create surface
if (!surface_exists(shadow_surface)) {
shadow_surface = surface_create(room_width, room_height);
}
// Draw to surface
surface_set_target(shadow_surface);
draw_clear_alpha(c_black, 0);
// ... draw operations ...
surface_reset_target();
// Draw surface to screen
draw_surface(shadow_surface, 0, 0);
// CRITICAL: Free surface when done
if (surface_exists(shadow_surface)) {
surface_free(shadow_surface);
}
パフォーマンスの最適化
ドローコールの最適化
- スプライトをテクスチャページにまとめ、ドローコールを最小限に抑えます
- 静的コンテンツ(背景、タイル)にはレイヤーを使用します
- コストの高い計算はキャッシュします(Draw イベント内で再計算しないでください)
- Draw イベント内でインスタンスを作成または破棄しないでください
コリジョンの最適化
- 正確なコリジョン判定の前に、広域フェーズの距離チェックを行います
- 適切なコリジョンマスク(正確なマスクとバウンディングボックス)を設定します
- コリジョンレイヤーとグループを使用します
- インスタンスが必要な場合は、
place_meeting()の代わりにinstance_position()の使用を検討します
メモリー管理
- データ構造は使用後に必ず破棄します
- 不要になったサーフェスは解放します
- バッファーは使用後に削除します
- Destroy イベントでクリーンアップします
よくある落とし穴と解決策
包括的なトラブルシューティングガイドについては、COMMON_PITFALLS.md を参照してください。
クイックリファレンス
オブジェクトの作成に関する問題:
- .yy ファイルがない → オブジェクトが IDE に表示されない → 上記のテンプレートを使って .yy ファイルを作成します
- .yyp への登録がない → コンパイルエラー「object not found」 → .yyp のリソース配列にエントリーを追加します
- イベント名が間違っている → イベントが実行されない → 正確な名前を使用します(Draw_64.gml。Draw_GUI_0.gml ではありません)
メモリーに関する問題:
- データ構造のリーク → メモリー使用量が増加する → ds_destroy 関数を必ず呼び出します
- サーフェスのリーク → メモリー使用量が増加する → surface_free() を必ず呼び出します
- Destroy イベントがない → リソースがクリーンアップされない → クリーンアップコードを含む Destroy イベントを追加します
ファイルシステムに関する問題:
- datafiles/ のサブディレクトリ → ファイルが見つからないエラー → ファイルを datafiles/ のルート階層に移動します
- .yyp への登録がない → 同梱ファイルが見つからない → ファイルを .yyp に登録します
GML の構文に関する問題:
- 三項演算子の連鎖 → コンパイルエラー → ネストされた条件を二重の括弧で囲みます
- 変数のスコープ → 未定義の変数 → ローカル、インスタンス、グローバルの各スコープを確認します
- 配列の境界 → インデックスが範囲外 → アクセスする前に配列のサイズを確認します
高度なトピック
高度な機能について詳しくは、以下をご覧ください。
- GML_REFERENCE.md - カテゴリ別にまとめたGML関数の完全なリファレンス
- QUICK_REFERENCE.md - テーブル、定数、クイックリファレンス
- ADVANCED_TOPICS.md - シェーダー、ネットワーク、プラットフォーム固有の開発
シェーダープログラミング(GLSL ES)
シェーダーを使用する場面:
- 高度な視覚効果(ライティング、ぼかし、輪郭線、カラーグレーディング)
- ピクセル単位の処理(カスタムレンダリング効果)
- パフォーマンスの最適化(GPUベースの計算)
基本的なシェーダーのワークフロー:
- IDE でシェーダーアセットを作成します
- 頂点シェーダー(.vsh)とフラグメントシェーダー(.fsh)を記述します
- シェーダーを設定します:
shader_set(shd_outline); - ユニフォームを渡します:
shader_set_uniform_f(u_time, current_time); - スプライト/サーフェスを描画します
- シェーダーをリセットします:
shader_reset();
GLSL ES の構文、例、一般的なシェーダーパターンについては、ADVANCED_TOPICS.md をご覧ください。
ネットワークとマルチプレイヤー
ネットワークを使用する場面:
- マルチプレイヤーゲーム(クライアント/サーバー、ピアツーピア)
- オンラインランキング
- HTTP API の統合
- クラウドセーブシステム
非同期 HTTP の例:
// Send GET request
var _request_id = http_get("https://api.example.com/data");
// In Async HTTP event
var _id = async_load[? "id"];
if (_id == _request_id) {
var _status = async_load[? "status"];
if (_status == 0) {
var _result = async_load[? "result"];
var _data = json_parse(_result);
// Process data
}
}
ネットワークソケット、バッファー、マルチプレイヤーのアーキテクチャ、同期パターンについては、ADVANCED_TOPICS.md をご覧ください。
プラットフォーム固有の開発
モバイル(iOS/Android):
- タッチ入力:
device_mouse_x_to_gui()、device_mouse_y_to_gui() - 仮想ボタン:
virtual_key_add() - センサー:
device_get_tilt_x()、device_get_tilt_y()
コンソール(PlayStation、Xbox、Nintendo Switch):
- ゲームパッドのサポート:
gamepad_button_check()、gamepad_axis_value() - プラットフォームの検出:
os_type、os_get_config()
HTML5:
- ブラウザーとの連携:
clickable_add()、clickable_set_style() - JavaScript の実行:
js_runner_eval()
デスクトップ(Windows、macOS、Linux):
- ファイルダイアログ:
get_open_filename()、get_save_filename() - ウィンドウの制御:
window_set_fullscreen()、window_set_size()
プラットフォーム固有の開発ガイドについて詳しくは、ADVANCED_TOPICS.md をご覧ください。
リソース
このスキルには、包括的なリファレンスドキュメントが含まれています。
references/
GML_REFERENCE.md(約1500行)
- カテゴリ別に整理されたGML関数の完全なリファレンス
- 描画、数学、文字列、インスタンス、ルーム、データ構造、ファイル、ネットワーク、シェーダー、サーフェス、パーティクル、オーディオ
- よくあるタスク(インベントリ、ステートマシン、会話、セーブ/ロード、カメラシステム)向けのコードパターン
- StructとObjectの使い分けに関する指針
- コンストラクターパターンとメソッド変数
ARCHITECTURE_PATTERNS.md(約500行)
- GameMaker固有のアーキテクチャパターン(サービスロケーター、コマンドパターン、イベント駆動フロー、手続き型ロジック、データ駆動設計)
- ゲームエンジンでMVC/MVPを使わない理由(イベント駆動型とリクエスト/レスポンス型のアーキテクチャ)
- GMLのコンテキストにおけるSOLID原則(SRP、OCP、LSP、ISP、DIPをコード例とともに解説)
- 設計原則(DRY、KISS、YAGNI)
- パフォーマンスパターン(ホットパスの最適化、structとds_mapの使い分け、ルックアップマップ)
- 避けるべきアンチパターン(globalの乱用、深い階層、関数の再定義)
COMMON_PITFALLS.md(約800行)
- オブジェクト作成時の問題(.yyの不足、.yypへの登録漏れ、イベント名の誤り)
- ファイルシステムの問題(datafiles/のサブディレクトリ、.yypへの登録漏れ、パス)
- GML構文の落とし穴(三項演算子、変数のスコープ、配列の境界、未定義値へのアクセス)
- メモリ管理(ds_*のリーク、サーフェスのリーク、バッファーのリーク、クリーンアップパターン)
- パフォーマンスの問題(描画の最適化、衝突判定の最適化、インスタンス管理)
- ネットワークの問題(非同期イベント、バッファーの型、タイムアウト、プラットフォームの違い)
- シェーダーの問題(GLSL ESとの互換性、uniformの命名、テクスチャサンプリング)
QUICK_REFERENCE.md(約600行)
- 実行順序を含む、イベントの種類/番号の完全な一覧表
- キーボード定数(vk_*定数、ord()の使用方法、キー押下とキー状態の確認)
- マウス定数(mb_*定数、マウスイベントの種類、device_mouse_*関数)
- よく使うGMLパターン(距離の確認、方向の計算、衝突判定、乱数範囲)
- 色関数(定数、make_color_、color_get_、merge_color)
- IDEバージョンのリファレンス(一般的なバージョン、機能、互換性に関する注意事項)
ADVANCED_TOPICS.md(約1000行)
- シェーダープログラミング(GLSL ES構文、頂点/フラグメントシェーダーの例、uniform、多段パス技法、デバッグ)
- ネットワークパターン(クライアント/サーバーアーキテクチャ、ロビーシステム、パケット構造、レイテンシ補正、バッファー)
- プラットフォーム固有の開発(モバイルのタッチ/センサー、コンソールのゲームパッド/実績、HTML5のブラウザーAPI、デスクトップOSとの連携)
- 高度なグラフィックス(サーフェス、ライティングシステム、法線マップ、パーティクル、タイルマップ、カメラ)
- パフォーマンスのプロファイリング(デバッグオーバーレイ、ボトルネックの特定、メモリのプロファイリング、描画コールの削減、コードのプロファイリング)
注意:このスキルはガイダンスとリファレンスを提供します。最新かつ包括的なドキュメントについては、必ずGameMaker公式マニュアルを参照してください!