# GameMakerのゲームを、書き出しライセンスのいらないプロジェクトへ移植する

> GameMakerのゲームの移植とは、権利のあるプロジェクトを作り直すことだ。ルームはシーンに、オブジェクトはノードに、GMLのイベントはスクリプトのコールバックになる。

- URL: https://www.summerengine.com/ja/port-a-gamemaker-game
- Keyword: GameMakerのゲームを移植する
- Related: https://www.summerengine.com/ja/porting

GameMakerのゲームの移植とは、権利のあるプロジェクトを別のエンジンで作り直すことだ。GMLはGameMaker固有で、.yypのプロジェクトファイル、ルーム、オブジェクト定義を取り込むものは他にない。とはいえ作り直しは機械的に進む。GameMakerのモデルはシーンツリーにきれいに対応するからだ。

自分のGMLと自分のアートは自分のものなので、GameMakerの移植の大半は持ち出せる。マーケットプレースのアセットは個別に確認する。ライセンスがGameMakerのプロジェクトに用途を限っていることがある。

Summer Engineは作り直しの受け皿になる。スクリプトを持つシーンとノード、GameMakerが扱う範囲をカバーする2Dのツール、そしてゲームが育ったときの3D。プロジェクトは自分のもので、ロイヤリティはなく、Steamやitch.io向けのデスクトップ書き出しは別売りではなくエンジンの一部だ。

## ルーム、オブジェクト、イベントはシーンツリーに対応する

ルームはシーンになる。オブジェクトはスクリプトを持つノードになり、オブジェクトのインスタンスはインスタンス化したシーンになる。Createイベントはreadyのコールバック。Stepイベントは毎フレームのprocessコールバック。Drawイベントは描画のコールバック。アラームはタイマーになる。オブジェクトの継承はシーンの継承かスクリプトの継承になる。原点を持つスプライトはオフセット付きのスプライトノードになり、GameMakerの衝突マスクは衝突シェイプになる。

## 書き直しが要るGMLの書き方

そのままは移らないGMLの習慣もある。グローバル変数とwith文は平たい構造を促すが、ノードツリーはそれを別の形、たいていはノード参照とシグナルで扱う。ds_map、ds_list、ds_gridは辞書、配列、入れ子配列になり、メモリは自動で扱われるので手動のdestroy呼び出しは消える。instance_createとinstance_destroyはシーンのインスタンス化とノードの遅延削除になる。ルームの永続化とインスタンスの順序は、ルーム設定に頼らず明示的に扱う。

## ピクセルアート、カメラ、解像度

GameMakerの2Dプロジェクトはたいてい固定のルームサイズとカメラのビューポートを定義している。基準解像度に設定したビューポートと、ピクセルアート向けの整数倍スケーリングとニアレストネイバーフィルタでそれを再現する。よくある劣化はサブピクセルの移動だ。GameMakerのプロジェクトはピクセルを揃えるために座標を丸めていることが多く、作り直しでその工程を飛ばすとカメラ移動中にスプライトがちらつく。オブジェクトごとに継ぎ当てるのではなく、最初にピクセル吸着の方針を決める。

## プラットフォームごとのライセンスなしで書き出す

GameMakerは歴史的に、書き出し先をライセンスの等級やモジュールで分けてきた。Summer Engineでは、WindowsとmacOS向けのデスクトップ書き出しはエンジンの一部であり、プロジェクトは完全に自分のもので、ロイヤリティも収益分配もない。GDScriptプロジェクトはSummer Games向けのWebビルドも書き出せる。コンソールにはプラットフォームホルダーの承認が必要だ。GameMakerのゲームが後から3Dや重いシェーダー作業を望んだ場合も、別のツールに移らず同じプロジェクトの中に余地がある。

## FAQ

### GameMakerのプロジェクトファイルを他のエンジンに取り込めるか

取り込めない。GameMakerの.yypプロジェクト、ルーム、オブジェクト定義を取り込むものは他のエンジンになく、GMLはGameMakerの外では動かない。移植は作り直しだが機械的だ。ルームはシーン、オブジェクトはスクリプトを持つノードに対応する。

### GameMakerのイベントはどう対応するか

Createはreadyのコールバック、Stepは毎フレームのprocessコールバック、Drawは描画のコールバック、アラームはタイマーになる。オブジェクトの継承はシーンまたはスクリプトの継承になり、衝突マスクは衝突シェイプになる。

### ds_map、ds_list、ds_gridは何になるか

辞書、配列、入れ子配列になり、いずれもメモリ管理は自動だ。GameMakerのデータ構造が必要とした手動のdestroy呼び出しは要らなくなり、作り直したコードから漏れの一種類がまるごと消える。

### 移植後にピクセルアートがちらつくのはなぜか

サブピクセルの移動だ。GameMakerのプロジェクトは、スプライトをピクセルグリッドに揃えるため座標を丸めるのが普通だ。作り直しでスプライトが小数座標で動くと、カメラ移動中にちらつく。最初にプロジェクト全体のピクセル吸着の方針を決める。

### 書き出しプラットフォームごとに別のライセンスが要るか

要らない。デスクトップ書き出しはエンジンの一部であり、プロジェクトは自分のもので、ロイヤリティも収益分配もない。ゲームはC++とGDScriptで書き、C#もデスクトップエディタで使える。

[GameMakerのゲームを作り直す](https://www.summerengine.com/ja/download)

---

## Machine-readable resources

- Site index for agents: https://www.summerengine.com/llms.txt
- Full inlined content: https://www.summerengine.com/llms-full.txt
- Porting catalog: https://www.summerengine.com/llms-porting.txt
- Structured catalog: https://www.summerengine.com/agent-catalog.json
- Sitemap: https://www.summerengine.com/sitemap.xml
- Developer resources: https://www.summerengine.com/docs
- Summer API (assets from any agent or code; public per-call model prices): https://docs.summerengine.com/api