【enchant.js】TCard.jsはv0.6対応の夢をみるか【Advent Calendar】

先日書いたAdvent Calendar記事では@さんのtrakpad.enchant.jsを取り上げましたが、思わぬ方向からブーメランが飛んできました。

そっかー。TCard.js、v0.6だと動かないのかー。
そっかー……。

で、ここで終わったら何とも悲しい。せっかくなのでTCard.jsをv0.6に対応させつつ、それをAdvent Calendarのネタにしてしまいましょー! というのが今回のお話。

まずはこちらからTCard.jsのソースをダウンロードしてきてください。次にzipを解凍したら、中のenchant.jsを最新版に置き換え、index.htmlを開いて見て下さい。

Error: superclass is undefined
    throw new Error("superclass is undefined");     enchant.js (202 行目)

ほむほむ。@さんの指摘通り、enchant.jsの201行目あたりでエラーが出ていますね。それではこのあたりを調べてみましょう。

まずこちら。v0.6のエラー該当箇所前後の抜粋です。

enchant.Class.create = function(superclass, definition) {
    if (superclass == null){
        throw new Error("superclass is undefined");
    }
    if (arguments.length === 0) {
        return enchant.Class.create(Object, definition);
    } else if (arguments.length === 1 && typeof arguments[0] !== 'function') {
        return enchant.Class.create(Object, arguments[0]);
    }

次いでこちら。TCard.js開発当時の最新版(v0.5)の同じところです。

enchant.Class.create = function(superclass, definition) {
    if (arguments.length === 0) {
        return enchant.Class.create(Object, definition);
    } else if (arguments.length === 1 && typeof arguments[0] !== 'function') {
        return enchant.Class.create(Object, arguments[0]);
    }

エラーも鑑みるに、v0.6から加えられた以下の部分が問題なのは一目瞭然ですね。

    if (superclass == null){
        throw new Error("superclass is undefined");
    }

「よっし。それじゃあ、ここをコメントアウトだ!」
ちょっと待ってください。
このようなエラーチェックが加えられたということは、何らかの意図があるはずです。それに、enchant.jsの新バージョンが出るたびに該当部分をコメントアウトするのは非効率です。ここはひとつ、TCard.jsの方を改造しましょう!(ぢゃないとここで話が終わっちゃうもんね)

はてさて。
対応するにはまずエラーの意味を理解しないといけません。ちょっと公式ドキュメントをのぞいて見ましょうか。

Parameters:
{Function} superclass Optional
    継承するクラス.
{*} definition Optional
    クラス定義. 

……Optional。ウソを吐け、ウソを! 必須じゃないか!
ぬわーん! 公式のバグじゃんかよ~ん。

……
………
………………

いや、本当にバグだろうか。
もしかしたらドキュメントの修正漏れかもしれない。
こんな時は便利なtwitter。とりあえずtweetしてみる。


すると……

開発者の@さんからご回答頂きました!
superclassはOptional扱い、必須なのはdefinitionの方なんですね*1

というわけで、TCard.jsの1行目を以下のように書き換えてみて下さい。

TCard = enchant.Class.create({});

そしてindex.htmlを再度ブラウザで読み込むと……はい! エラーが表示されず、ちゃんと画面が出てきましたね!
OK! これで終わりです。
あとは@さんも言及されている「enchant.Game」の「enchant.Core」への書き換えですね。これは必須の書き換えではないのですが、将来的にGameが廃止される可能性もあるので、今のうちに書き換えておいた方が無難でしょう。

……はい、何か?
これで終わりかって? 終わりなんですよ*2
TCard.jsがenchant.jsに依存している部分って、クラス定義と画像周りだけですからね。enchant.jsが如何に変わろうとも、ほとんど影響を受けないんですよ。また、多言語への移植も容易です。そもそも今のバージョンも、ActionScriptで書かれたものをほとんど変更なく流用しています(TCard.setImageとTCard.getCardだけがenchant.js verから加わったものです)*3

TCard.jsは見ての通りとても単純なライブラリです。これを元に、UNO用カードのライブラリ等、他のゲームのカードセットを作ってみるのも面白いんじゃないかと思います。
お次は誰だー!

*1:現時点では公式ドキュメントも修正されています。

*2:自分でもビックリしました。

*3:さらに言っておくと、TCard.js及びその前身のソースは、友人がC++用に書いたモノを私が他言語に移植したものです。@Buravo46さんが「読む人が読めばわかりやすい」とほめて下さっていますが、それは友人に向けられるべき称賛だったりします。