CoffeeScriptでRPGツクールMV用プラグインを書こう

※この記事はNewData/js/pluginsのプラグインをある程度読めるくらいって人向けです。多分。

英語力皆無ですが、RPGツクールMV(Steam版)買いました。
今作からはRGSSがなくなり、JavaScriptのコードをプラグインとして扱う方式になりました。

では、早速ですが、コードを見てみましょう。


(function() {
  // セーブ時になんかする
  var _Scene_Save_onSaveSuccess = Scene_Save.prototype.onSaveSuccess;
  Scene_Save.prototype.onSaveSuccess = function() {
    _Scene_Save_onSaveSuccess.call(this);
    /* なんか処理 */
  }
})();

めんどくさ……
prototypeとかprototypeとか、打ちたくないです。面倒臭いです。
上記のものでも面倒臭いというのに、

// なんか選択するウィンドウを作成
function Window_Hoge() {
  this.initialize.apply(this, arguments);
}

// Window_Selectableを継承する
Window_Hoge.prototype = Object.create(Window_Selectable.prototype);
Window_Hoge.constructor = Window_Hoge;

Window_Hoge.prototype.initialize = function(x, y, width, height) {
  Window_Selectable.prototype.initalize.call(this, x, y, width, height);
}
/* 以後なんか処理 */

継承なんかが入ってくるともう見るのも嫌になります。(※個人の感想です)
ついでにfunctionも面倒臭い。

そんな怠惰な私は、勉強も兼ねてCoffeeScriptを使ってみることにしました。(CoffeeScriptは、コンパイルするとJavaScriptのコードを吐き出すプログラミング言語の一つです)
以下が上記2つとほぼ同等のコードとなります。

# セーブ時になんかする
_Scene_Save_onSaveSuccess = Scene_Save::onSaveSuccess
Scene_Save::onSaveSuccess = ->
  _Scene_Save_onSaveSuccess.call @
  ### なんか処理 ###
# なんか選択するウィンドウを作成
class Window_Hoge extends Window_Selectable
  constructor: -> @initialize.apply @, arguments
  initialize: (x, y, width, height) -> super x, y, width, height
  ### 以後なんか処理 ###

素敵。
CoffeeScriptRubyの影響を受けているので、RGSSでRubyに慣れた人には結構取っ付き易いんじゃないでしょうか。
「楽そうだなー」と思った人は、早速CoffeeScriptを導入しちゃいましょう!

導入

ここからは導入編。と言っても、やることは至極単純です。

  1. Node.jsより、Node.jsの最新安定版をダウンロード、インストールする。
  2. コマンドプロンプトを開き、

    npm install -g coffee-script

    と入力し、インストールが終わるのを待つ。


  3. インストールが終わったら、念のため

    coffee -v

    と入力し、

    CoffeeScript version 1.10.0

    などと表示されることを確認する。


詳しいことや、Windows以外での導入方法などは他のサイトを参照してください。

以上で導入編終わりです。お疲れ様でした。

後は、コードを書いて

coffee -c ファイル名.coffee

と入力すればJavaScriptファイルにコンパイルされるので、それを「プロジェクト名/js/plugins」ディレクトリにぶち込むだけです!

最後に

私もまだまだ勉強中の身ですし、ロクに解説もしていませんが、この記事が怠惰な皆様の手助けになれば幸いです。
最後まで読んでいただき、ありがとうございました!
CoffeeScriptで楽しいプラグイン開発ライフをエンジョイしてくださいね!

ついでに、拙作のプラグインを置いておきます。
セーブ時とロード時に、指定のコモンイベントを呼び出すだけのプラグインです。
http://ideone.com/OJkskv
楽をしたいが為に自分自身を継承したりしてますが、あまりやらない方がいい書き方だと思います。
使用する場合、stdoutの内容をコピーして「Save_Load_CallCommonEvent.js」というファイルを作成し、そこにペーストするだけでOKです。


おまけのちょっとした説明

文末のセミコロン
要りません。
変数宣言時のvar
要りません。
括弧の省略
引数が1つ以上ある関数を呼び出す時や、引数のない関数を定義する時など、様々な場面で括弧を省略できます。
#
1行コメントです。
コンパイル時に消滅します。
###
複数行コメントです。
/* コンパイルしてもこのような形で残ります。 */
@
基本的にthisを表します。

@initialize.apply @, arguments

this.initialize.apply(this, arguments);

::
prototypeを表します。

Window_Hoge:: = Object.create Window_Selectable::
# Window_Hoge.prototype = Object.create(Window_Selectable.prototype);

みたいにも書けます。
気持ち悪いですね。

プロック{...}がない
インデントがそのままブロックとなります。
オフサイドルールと呼ばれています。(個人的にはあまり好きではない)

if foo == 1
  if bar == 1
    # foo,barが1の時の処理
  else
    # fooが1、barが1じゃない時の処理
else
  # fooが1じゃない時の処理

関数呼び出し
引数が1つ以上ある場合、括弧を省略できます。
引数がない場合は括弧を省略できません。

foo 42
bar()

->
関数定義です。
関数呼び出しとは逆に、引数がない場合は括弧を省略できます。

foo = -> alert "foo"
bar = (hoge) -> alert hoge

var bar, foo;

foo = function() {
  return alert("foo");
};

bar = function(hoge) {
  return alert(hoge);
};

class
クラスです。
クラスが分からない場合、オブジェクト指向言語について調べてください。
extends
クラスの継承です。
継承が分からない場合、オブジェクト指向言語について調べてください。
constructor
コンストラクタです。
残念ながら、コンストラクタの定義はこの方法しかないようです。(もっと短く書きたかった……)

class Hoge
  constructor: -> @initialize.apply @, arguments

var Hoge;

Hoge = (function() {
  function Hoge() {
    this.initialize.apply(this, arguments);
  }

  return Hoge;

})();

super
親クラスのメソッドを呼び出せます。