【enchant.js】TCard.jsはv0.6対応の夢をみるか【Advent Calendar】
先日書いたAdvent Calendarの記事では@phi_jpさんの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 行目)
ほむほむ。@Buravo46さんの指摘通り、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してみる。
enchant.js v0.6以降でClass.createにsuperclassのチェックが入ったのは何故? ドキュメントだとOptional扱いなのに… #enchantjs
すると……
@v416 enchant.Class.create() は引数1つなら: 引数を定義として使う引数2つなら: それぞれ親クラス・定義として使います。現在は1つ目の引数が null, undefined ならエラーを出しています。Optional なのは2つ目の引数です。
2012-12-11 00:54:33 via YoruFukurou to @v416
開発者の@sidestepismさんからご回答頂きました!
superclassはOptional扱い、必須なのはdefinitionの方なんですね*1。
というわけで、TCard.jsの1行目を以下のように書き換えてみて下さい。
TCard = enchant.Class.create({});
そしてindex.htmlを再度ブラウザで読み込むと……はい! エラーが表示されず、ちゃんと画面が出てきましたね!
OK! これで終わりです。
あとは@Buravo46さんも言及されている「enchant.Game」の「enchant.Core」への書き換えですね。これは必須の書き換えではないのですが、将来的にGameが廃止される可能性もあるので、今のうちに書き換えておいた方が無難でしょう。
……はい、何か?
これで終わりかって? 終わりなんですよ*2。
TCard.jsがenchant.jsに依存している部分って、クラス定義と画像周りだけですからね。enchant.jsが如何に変わろうとも、ほとんど影響を受けないんですよ。また、多言語への移植も容易です。そもそも今のバージョンも、ActionScriptで書かれたものをほとんど変更なく流用しています(TCard.setImageとTCard.getCardだけがenchant.js verから加わったものです)*3。
TCard.jsは見ての通りとても単純なライブラリです。これを元に、UNO用カードのライブラリ等、他のゲームのカードセットを作ってみるのも面白いんじゃないかと思います。
お次は誰だー!