Webゲーム開発IDE「enforceIDE」

**このエントリーは、「ゲームエンジン・ライブラリ・ツールの開発 Advent Calendar 2016」の12/9の記事です**

![enforceide_logo2.png](https://qiita-image-store.s3.amazonaws.com/0/53543/7e59f1e5-c03c-19d7-e124-f6c8b882263c.png)

# enforceIDEとは
[enforceIDE](https://www.prominence.tv/enforceide/)は、Webゲーム開発プラットフォームです。Webブラウザだけで完結しています。使い始めるにはメールでの登録、もしくはTwitter認証が必要になります。Twitterアカウントを持っていれば、トップ画面のTwitterボタンをクリックし、Twitter認証で[enforceIDE](https://www.prominence.tv/enforceide/)へのログインを許可すれば、すぐに使い始めることが出来るのでオススメです。

## 開発言語
[enforceIDE](https://www.prominence.tv/enforceide/)では、ゲームを*CoffeeScript*で記述します。*CoffeeScript*のクラスを修正／追記することでゲームを作っていきます。

## 概要
ゲーム自体は、私が作っているWebゲーム作成フレームワーク「[enforce](https://github.com/digitarhythm/enforce)」を使用しています。
（[enforce](https://github.com/digitarhythm/enforce)自体のチュートリアルはQiitaにまとめています → [enforceチュートリアル](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)）
この[enforce](https://github.com/digitarhythm/enforce)のゲームをWebブラウザから管理／編集出来るようにしたものが[enforceIDE](https://www.prominence.tv/enforceide/)になります。Webサービス自体は私の作っているCMS作成フレームワーク「[code:JS](https://github.com/digitarhythm/codeJS)」で作成しています。
[enforce](https://github.com/digitarhythm/enforce)は独自のスプライト管理方法を使い、スプライトの動作を定義していく形でゲームを作っていきます。内部的なスプライトは[enchant.js](http://enchantjs.com/ja/)と、[tmlib.js](http://phi-jp.github.io/tmlib.js/)を使うことが出来ます。ゲーム自体は各スプライトライブラリの独自クラス／メソッドに直接アクセスしたりせず、完全にラップされた状態になっているので、まったく同じゲームスクリプトが、スプライトライブラリを切り替えてもそのまま動作します。（一部、片方のライブラリにしかない機能もあります（ExtendMap、box2dなど））。

# ゲーム開発
[enforce](https://github.com/digitarhythm/enforce)でのゲーム開発は、上でも書きましたがフレームワークが生成するクラスのメソッド内に、キャラクタの動きを定義する形でゲームを作っていきます。ゲームシステムに関するコードは一切書きません。
ゲームを作るというより、キャラクタの動きを時系列で定義していくというプログラミングになります。

## ゲーム一覧画面
ログインすると、下記のような画面になります。まだゲームがひとつも無い状態です。
一番上の左端にある「[enforceIDE](https://www.prominence.tv/enforceide/)」をクリックすると、またこの画面に戻ってきます。
隣にあるアカウント名の歯車アイコン周辺をクリックすると、環境設定画面になります。
<img width="640" alt="enforce01.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/e625c0d4-417c-4ca2-6f60-5ead7bb2aba8.png">


## 環境設定画面
「エディターとゲーム画面を分割」を「する」にすると、右ペインが左右に分割され、右にゲーム画面、左にエディター画面が表示されるようになり、ゲームの動作を見ながらゲームを作れるようになります。
ブラウザを横長に出来ない状態だと、ゲーム画面が小さくなってエディットしづらいので、そういう時は「しない」で作業してください。

「デフォルトスプライトライブラリ」は新規ゲーム作成時に選択されているスプライトライブラリを指定します。
現在は「enchant.js」と「tmlib.js」から選択出来ます。

「エディターモード」はソースコードのエディット時のキーバインドの選択になります。
デフォルトは「Normal」になります。「vim」に慣れている人は「vim」を選択してください。
<img width="640" alt="enforce07.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/022f342e-d6ef-5244-6d25-37ef0add5011.png">

## 新規ゲーム作成
画面最上部のアカウント名の右にあるアイコンをクリックすると、「新規ゲーム作成」ダイアログが表示されます。プロジェクト名を入力し「OK」を押すとゲームの雛形が作成され、図のようにゲームのアイコンがひとつ表示されます（ゲームの作成にはちょっと時間がかかります）。
<img width="640" alt="enforce02.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/a8626e6e-3d1e-6013-95f7-51bdbaaf0b60.png">

## ゲーム編集画面
ゲームのアイコンをクリックするとゲームの編集画面に変わります。左ペインにソースコード一覧が表示されます。ソースファイル一覧の上にある3つのアイコンの真ん中、ファイル画像のアイコンをクリックするとソースファイルを追加することが出来ます。
ここで追加するソースファイルは真っさらなファイルではなく、[enforce](https://github.com/digitarhythm/enforce)で用意した雛形ファイルになります。このファイルは[enforce](https://github.com/digitarhythm/enforce)で使用出来るようにするためのクラスを継承したクラスファイルになります。このクラスファイルをどう修正してゲームを作っていくかは、[enforceチュートリアル](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)に一部機能ですがまとめてあります。
<img width="640" alt="enforce03.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/67a53063-6d55-3b15-4bcf-8e99673a0778.png">

## ゲームページのQRコード
画面最上部のログインID名のすぐ右にあるゲームアイコンをクリックすると、このゲームを遊ぶためのURIがQRコードで表示されます。スマートフォンなどで確認したり、人に遊んで貰う場合はこのQRコードで表示されたページのURIを教えてください。
<img width="640" alt="enforce08.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/c5c6b98f-bc37-f741-0805-eb7bc3fa0c41.png">

## ソース編集画面
ソース部分をクリックすると編集モードになります。ノーマル編集モードであればカーソルキーを使って、vimモードであればvimキーオペレーションで編集します。「保存」という動作は特にありません。他のファイルを選択するか、ゲームを実行すると編集していたファイルはすべて保存されます。編集中にページを閉じたりブラウザを終了すると、一部のファイルが保存されない場合があるのでご注意ください。
<img width="640" alt="enforce04.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/44b5a18b-646d-cd4a-1b6f-7727b1f989cc.png">

# ゲーム一覧画面を表示する
QRコードを表示するアイコンの右にあるフォルダアイコンをクリックすると、最初のゲーム一覧画面に戻ります。

## メディア管理画面
ゲーム一覧に戻るアイコンの右にあるアイコンをクリックすると、ゲームで使うための画像と音声ファイルを管理する状態になります。左ペインの画像ファイル名や音声ファイル名をクリックするとプレビューすることが出来ます。画像は右ペインに表示され、音声は再生されます（音声は再生中に同じファイルをクリックすると停止します）。
ファイルをアップロードするとIDEが生成したユニークなファイル名が付けられます。ゲームで使う時はこの名前をコピー／ペーストして使います。
<img width="640" alt="enforce05.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/bb593451-c258-e805-8d9a-dda41ce171d8.png">

## ゲーム実行
上に並んでいるアイコンの右向き三角形（再生ボタンみたいなアイコン）をクリックするとブラウザ内でゲームが実行されます。画面分割設定をしていない場合は、右ペイン全体にゲームが表示されます。このままだとゲームにキーイベントなどが渡らないので、ゲーム画面の中の**ゲームで使っていない部分**（画像例では黒ではなくグレーの部分）をクリックすることでゲームにイベントが渡るようになります。
<img width="640" alt="enforce06.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/78b2dadb-42e5-2dd7-05bc-6b07932428b4.png">


画面を分割する設定にしている場合は、右ペインの右半分にゲームが表示されます。この状態だとゲームの動きを見ながらデバッグすることが出来ます。ブラウザを横長に出来る場合は重宝すると思います。
<img width="640" alt="enforce09.png" src="https://qiita-image-store.s3.amazonaws.com/0/53543/d048b7d4-016f-0ce4-6870-80cede376e1d.png">

## ジョイパッド対応
[enforceIDE](https://www.prominence.tv/enforceide/)では、私が別で公開しているGamePadAPIをJavaScriptで扱うようにするライブラリ[GamepadProcedure](https://github.com/digitarhythm/gamepadprocedure/)を使っています。このライブラリとキーボード入力を合成して、ワンソースでキーボードとゲームパッドでの操作を対応できるようにしています。

----

スプライトライブラリとして、enchant.jsと、tmlib.jsを使っていますが、これらのライブラリを直接叩くわけではないので、[enforceIDE](https://www.prominence.tv/enforceide/)はenchant.jsなどの学習には使えません。

システムプログラミングなどをせずに、ゲームを作ることだけに集中するために作成しました。