ゲームフレームワーク作り直し
自分のゲームフレームワークを最近はじめから作り直しました。
名前も変えました。
できたらGitHubにあげます。
この作り直しで強く思ったのは、やはりenchant.jsのことです。
考えれば考えるほどよくできている。
っていうか美しくつくろうと思うと、似ちゃうw
だから頑張って似ないようにしました(笑
でもゲーム実装部分の見た目がかなり似ています。これ以上シンプルに出来ませんでした。
そして9leapの様々な人々のプログラムを読みながら学習しました。
enchant.jsはほぼ完全なクラスベースな故、どこまでも実装者の自由に設計が可能です。
そこは利点でありながら、ひっくり返すと、「読みにくい」ということでもあるのかなと思っています。
データの持ち方、参照の仕方、等々、ゲームループを取り巻く数々のオブジェクトを実際にどのように取り扱うのかという点について、enchant.jsは自由な気がします。あらゆるオブジェクトのリファレンスを自前管理し、それぞれforでまわしているシーンが多くあるように思いました。
大変に恐縮ながら、そういった部分をこの自作ライブラリではもっと簡単にしようと思います。
トレードオフとして、プログラミングの形の自由度はenchant.jsにかなり劣る気がしますが、
おそらく誰が書いても同じようにかけるのではないかと思っています。
ロジックの実装方法の経路が、一つなので。
ぶっちゃけenchant.jsを使えばいいのに、なんで車輪の再発明してんのかなーと我ながら思いますがw
もう20代も終わってしまいそうなので、この一週間、二週間で、このライブラリにひとつの決着をつけたいです。
enchant.js がすごすぎるから
enchant.jsの学習が、dot.installというサイトで簡単に出来る。
これで学習したり、リファンレスを見るとわかるが、本当に非常に美しい。
しかし、ふと違うことを考えて、違うやり方でライブラリを自作している。
マジで楽しいよ、ライブラリw
マジで楽しいよJavascript!
面白いライブラリを見つけたので、紹介。
ゲームライブラリ:Akihabara
http://www.kesiev.com/akihabara/
http://www.publickey1.jp/blog/10/html5javascriptakihabaraiphoneandroid.html
の紹介記事によると、色々実装されている。
すごいな。でもやっぱり覚えることいっぱいね。
しかし、ひとこと言いたい。
名前がいけてないよ。
名前が。
どうでもいい?いや、重要です。
プログラミングの半分は名前です(おおげさ
その点enchant.jsはかっこいい名前だよね。
コアのシンプルさや継承関係等もよくできている。
おおいにパク。。いや参考になる。
自分のライブラリにも、そこそこかっこいい名前をつけました。
さて、がんがんつくろう。
enchant.jsで10分でシューティングゲームを書く。
すごいですねー。
そして、改めて見ても、やはりenchant.js、美しい。
相変わらずゲーム自体は一発ゲームばかりですが、それでも一見してだいたい内容がわかるこのライブラリの美しさには目を見張るばかり。
そして、いろんな書き方があることも、すごい。
そして、作っては壊し、作っては壊してきた僕自身のライブラリも、この動画を見て
もう一回派手にぶっ壊す気になりましたw
え、enchant.js使えばいいって?
うーん。enchant.js使うと、セーブとかするところ拡張しないと、自分のとこでは使えなさそうなんですよね。
そして実はこういったクラスベースの書き方が美しいとは見とれつつも、
もうすこしjQueryみたいに簡単に書きたいんですよね。
素晴らしいのですが、やっぱり我流で作りたがるのは、めんどくさい性格のせいなんです。
というわけで、夜な夜な時間を削って作っています。
iphone のみに発生する TypeError:’undefined’ is not an object
iphoneのタッチイベントを実装する際、少々はまったので、備忘録。
jQueryを用いてiphoneのタッチイベントを実装する際、'touchend'や'touchstart'をにイベントを付加する。
しかし、その際、iphoneのデバックコンソールで見ているときのみ、なぜかずーっとエラーが出ている。
その内容は
TypeError:'undefined' is not an object
いや、そもそもundefinedなんかどこにも。。。
と思っていたが、よくよく調べたら、どうやら
'touchend'が発生したあとでは、まぁ当然かもしれないが、イベントオブジェクトからタッチされた場所を獲得することが出来ないらしい。
既にタッチが終わっているので、現在はタッチされていない、といえば、まぁ当然か。
■
Apple Developer Programに登録するにあたって、いくつか躓いたので、備忘録。
- 登録するApple Idは新規に作ったほうがよい
登録時に、自分の普段使っているAppleIDは使わないほうがよいらしい。
例えば、iTunesなどに登録しているIDを用いると、
実際にアプリをアップする際にエラーになる場合があるとのこと。
- 登録する名前は英語で
多少登録時に言語が統一されていないのは違和感があるが、
名前の部分は全て英語で、しかもクレジットカードと同等のものが良い。
ここが違ったりすると、認証が通らない。
支払い情報を入力するときなど、名前に日本語を入力してしまいそうになる
(だってカタカナ欄があるからね)
が、ここは名前の部分は、英語でいこう。
Appleの渋谷とかのストア店員はなんかAppleと言う名のブランドで着飾っているだけで、
専門知識がなく、一般の方にはいいけど、技術者的には、非常に不満があったけど、
Appleのテクニカルサポートはすごかった。さすが技術者用。
とにかく、問題が起きたら、速攻電話するのがいい。
Windows上のEmacsで一発でコンパイルする
前回書いたプログラムをもうちょっとまともに動くようにした。
以下のElispで、Emacsでファイルを開きながら、一発でコンパイル出来る。
makefileを作るほどでもない場合に利用出来る。
(defun is-directory(e) (car (directory-files "." 1 (format ".*%s" e)))) (defun mk-dir(e) (shell-command-to-string (format "mkdir %s" e))) (defvar bcc32-compile-files) (defvar bcc32-output-dir) (defvar bcc32-DxLib-dir) ;;初期値 (setq bcc32-DxLib-dir "C:\\borland\\directx\\DxLib_BCC\\bcc") (setq bcc32-compile-files "main") (setq bcc32-output-dir "debug") (setq bcc32-result-name "result") (defun bcc32() (interactive) (let* ( (file-names (read-string "function's files: " bcc32-compile-files)) (output-dir (read-string "output-dir: " bcc32-output-dir)) (result (read-string "result name: " bcc32-result-name)) (result-name (format "%s.exe" result)) (exe-name (format "%s\\%s.exe" output-dir (car (split-string file-names)))) (command-string (format "bcc32 -W -3 -O1 -w- -AT -pc -H- -k -b -v -y -n%s -I%s %s" output-dir bcc32-DxLib-dir file-names)) ) (if (not (is-directory output-dir)) (mk-dir output-dir)) (message "%s\n%s" command-string (shell-command-to-string command-string)) (shell-command-to-string (format "rename %s %s" exe-name result-name)) ; logs (setq bcc32-compile-files file-names) (setq bcc32-output-dir output-dir) (setq bcc32-result-name result) )) (defun bcc32-exe() (interactive) (shell-command-to-string (format "cd %s & %s.exe & cd .." bcc32-output-dir bcc32-result-name)) )
bcc32-DxLib-dir にDxLib.hのあるディレクトリを指定することを忘れないように。
M-x bcc32 で、コンパイル。
このコンパイルは、かなり手軽に出来るもので、設定ファイル等を用いない。
継続的なプロジェクトでは、makefileを作ればいい話だが、試し書きしているときに、役に立つ。
コンパイル前にまず、該当ファイルのひとつを開いておこう。そのディレクトリ内のファイルをまとめてコンパイルするイメージだ。
実行すると、funtions'fileを聞いてくる。
これに、関数定義のあるファイル名を、拡張子抜きで、空白区切りで渡す。
例:
main function
(main.cpp と function.cpp が存在する場合)
次にoutput-dirを聞いてくる。
これは出力先のフォルダ名の指定。
もし存在しなければ、作成される。
さらに完成ファイルのexe名を聞いてくる。
ここで設定した名前で、exeファイルが出来上がる。
これらの設定値は全て記憶され、Emacsを閉じない限り、保存される。
もしその結果としてエラーが出た場合には、mini-bufferに表示される。
もしエラーメッセージの全文が見たければ、*message*バッファーだ。
M-x bcc32-exe で実行。
bcc32を実行した直後に実行するのがおすすめ。