ぼえぼえ~ by Javascript2006年07月07日 10時09分52秒

作ってみた。こんなもんに 5 営業日もかかっちまったよ。。。とりあえず、現段階では開発途上バージョンということで。

動作環境

Firefox、Opera、IE にて動作確認済み。但し IE では動作がやたらと重い。。。これは IE の処理能力が劣るだとか、おいらのプログラム側の問題だとか言うことではなくて、単に IE の window.setInterval() がそれほど短い delay に対応していないだけだと思う。

遊び方

カーソルキーの「←」と「→」でキャラを左右に動かして、どんどん下のほうへ飛び降りてください。画面はどんどん上へ上へとせりあがっていきます。キャラが画面の上まで行って隠れてしまうか、もしくは落っこちすぎて画面の下へ隠れてしまうとゲームオーバー。また、飛んでくる火の玉 (には見えないだろうけどw) にぶつかってもゲームオーバー。

キャラがどれだけ飛び降りることができたかによってスコアが増えるようになっています。

ちなみに、画面の右端と左端は繋がっています。初期のファミコンルールですなw

プログラムの解説とヒント

ソースはここから参照してください。自由に使っていただいて構いません。

やっていることは、window.setInterval() によるタイマー呼び出しから、主に HTML の <img> 要素をひたすら書き換えているだけです。オブジェクト指向を駆使しているように見えますが、可能な限りメンバーをプライベート化させるべきところで、敢えてプライベート化させていなかったりします (だって面倒くさいし)。それでも、オブジェクト指向的な設計が成立しうる程度には、オブジェクト指向的な機能を使ってはいるつもりですが。

強いてポイントとして取り上げるとすれば、こいつぐらいかなぁ。

    var that = this;
    this.timer = setInterval(function() { that.interval(); },
        1000 / boeboe_frame_par_second);

window.setInterval() とか window.setTimeout() とかって、処理内容はリテラル (" とかで括った文字列) で渡すように説明している参考書やサイトがほとんどで、上記みたいに、関数オブジェクトそのものを渡すこともできる、って辺りに触れられている参考書やサイトってほとんど無いんじゃないかと思う。

関数オブジェクトを渡す方法が優れているのは、JavaScript ならではの仕様であるスコープチェーンが使えるということ。つまり、上記の 1 行目で宣言したローカル変数 that が、 window.setInterval() に渡す関数内でも生きていて、そのおかげで this の受け渡しに成功している、ってわけだわね。

その他

なんかおかしな点とかあったらコメントに書き込んでちょ。

コメント

_ なす ― 2006/07/07 13:54:16

なぜにさくらー(;´Д`)

それはさておき。
NEC製VY17F/RF-W、IE6でのこと。
①キャラがいない
②キャラらしきもの(ねずみみたいなの)がいたもののコントロールできない
③マスも何も出ないで黒いまんま
④ほんで、①②③の場合すべて、しばらくしたらゲームオーバーって言われる。

とりあえずこんなもんかね。

_ @DRK ― 2006/07/07 14:53:00

さくら貼ってねーでななついろ貼ってくれよ(ノд`)

Java入ってる?>なす
普通はデフォでも出来るとは思うんだけど・・・もしかしたら。

_ T.MURACHI ― 2006/07/07 16:13:07

>なす
画像の読み込みに若干時間がかかります(爆)。
何回か実行してみるうちにだんだんいろいろと表示されるようになると思われ。

>@DRK
Java と Javascript はまったくの別物。Java 入れなくても動かせるわよ。つか、「ゲームオーバー」とか出てるなら確実に動いてるはず。

ちなみにさくらは「ぼえぼえ~」と「ほえ~」をかけてみた。

_ なす ― 2006/07/07 16:47:36

んーと、表示しても①②になって④になるんですが(^^;
家帰って炎狐でやってみるわ。

_ くじらん ― 2006/07/07 18:48:14

左右だけだとなかなか下に下りなくてぐるぐる回ってゲームオーバーになってしまうんだけど。。。
おいらが下手なせい?

_ @DRK ― 2006/07/07 19:45:42

>ちなみにさくらは「ぼえぼえ~」と「ほえ~」をかけてみた

今までで一番難解だぞwww

_ なす ― 2006/07/07 23:44:25

うちのPCならちゃんと動いた。

_ T.MURACHI ― 2006/07/08 02:06:28

>なす
職場のネットワークって重いん? あるいはブラウザが「開いているページとは別の鯖にある画像を読み込まない」設定にしてあるとかかな。

>くじらん
どう見てもただのヘタクソです。本当にありがとうございました。


ちなみに、動作環境について補足。
* 一番のオススメは Opera 。若干タイマーが遅いが、動作はまま安定していると思う。
* IE は動作は重いけど、安定はしていると思う。もうちょっとタイマーが早ければゲームになるんだがなぁ。
* Firefox は致命的なくらい動作が不安定。特に、開いているページの内容 (データ量) が多ければ多いほど重くなる傾向にあると思う。例えば http://www.harapeko.jp/boeboe/boeboe.html を開いて実行するのと、ここに貼り付けたのを実行するのとでは、動作の快適さに雲泥の差が出る (もちろん前者の方が「まだ」快適である)。これは Gecko (Mozilla 系描画エンジン) の弱点だと思う (なんとなーく、どういう風に処理を行っているのか想像できてしまうんだけど、そこから一歩先に行く工夫ができないのが現状の OSS 界の怠慢なんだろーなぁなどと勝手に愚考)。

_ @DRK ― 2006/07/08 10:52:31

ブラウザによって動作が変わるのは面倒な。
javascriptもブラウザによって違うって事?

_ T.MURACHI ― 2006/07/09 01:24:01

>@DRK

たとえば Java なら Sun Micro Systems 、Flash なら最近 Adobe に買収されちゃった Macromedia といった、それらのインタプリタだけを (プラグインなどの形で) 配布するベンダーが存在するのに対して、Javascript のインタプリタはブラウザベンダーが各自での実装を任されている部分なので、ブラウザの種類によっては当然細かい動作は変わってくる。実体としては、大まかな仕様 (ECMA-262 による文法的な仕様、DOM level 1 など) については標準が存在していて、各ベンダーともそれらに準拠しようとしているけれども、そこから外れる部分については独自仕様的な部分も存在していて、一方のブラウザでは動作する書き方が、別のブラウザでは動作しなかったり、と言うこともあったりする。

今回の場合、タイマーがカウントされる間隔の粒度の違いがブラウザごとにあって、それについては Javascript インタプリタの実装の違いと言えると思う。ただ、Firefox の動作が不安定な点については、Javascript 部分よりも、むしろ描画エンジンの部分に問題があるんじゃないかと思う。あるいは単純にタイマーの間隔が短すぎて描画が追いつかないだけかもしれないけどね。

_ T.MURACHI ― 2006/07/14 23:18:45

Konqueror(KHTML) 3.5.2 / knoppix 5.0.1 にて動作確認。
つか、knoppix 便利だ。。。これからはこいつを Linux 動作確認用に使うことにして、デスクトップ用にインスコしてた Gentoo は捨てちまおうかなぁ。
SCIM (knoppix に付属の IME) もなかなかいい感じだし。。。(つか、canna とかが糞なだけなんだが)

_ T.MURACHI ― 2008/05/02 23:37:26

harapeko.jp 鯖のドメイン移転に伴い、
http://www.harapeko.jp/boeboe/boeboe.html
の URL を、
http://daiyokujo.harapeko.jp/boeboe/boeboe.html
に変更しました。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
おいらがやっている会社の名前をひらがな4文字で。

コメント:

トラックバック

このエントリのトラックバックURL: http://harapeko.asablo.jp/blog/2006/07/07/435864/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。