Hatena::ブログ(Diary)

グレーゲーム

2012-04-01

学校を辞めた

3,4年くらい前だったか、スティーブジョブズの演説とかを見て中退がロックンロールだと思っていた当時は、辞めるときにどんな恨みつらみを言ってやろうかとよく腹づもりを立てていた。学校が持つ矛盾や構造の破綻を書き連ね、火炎瓶の一つでも投げ入れてニートになったときの侍感を上げることなんかを企てていたように思う。

いざ辞めるとなると、恨みというのはなかなか思い出せないものなのか、とても楽しい毎日を過ごしていたように思う。最近だと辞めるのもわりと一般的なことらしいし、全く行く宛が無いわけでもなく、えらく中途半端になってしまった。数年前の自分は「数年後あなたはこうなります」って見せられたらどう思うだろうか。



父親には相当怒られた。

どちらかというと昔ながらの保守的で硬っい頑固親父タイプの人なので、中退なんて以ての外だろうし、出方も10:0で僕が悪いので当然と言えば当然だった。なんで、具体的に何をどう言われたかはよく覚えていない。ただ、学費がどうだとか、必要な金がどうだとかは一切触れず、ただただ世話になった人への不義理や僕自身の将来の不安についてのみを咎めた。

おそらく世の中は金を持っている人、他人と上手く喋れる人、良い物を作れる人、という順で偉さの序列のようなものがあると思う。これは良い悪いの問題ではなく、例えば小学校では速く走れるやつが偉く、ゴリラの社会では体が大きくて力が強いやつが偉いように、構造としてそうなっている。

僕は恐らく極めて豊かな家庭で育っており、勝手な理想論や振る舞いは全て豊かさの上に成り立っている。受けた恩は将来、子供なのか部下なのか、誰にどう返せるか分からない。それでも義理人情や理想を語り、またそれを成り立たせるだけの豊かさがあるということが、平たく言うと金持ちが、カッコイイと思えた。



研究室の皆には否定されるのが怖かったので、なるべく黙っておこうと、できれば音もなく消えたかったが、いざ言ってみると肯定してくれる人が多く、本当に嬉しかった。

僕のいた研究室ではこれといった指導がなく、むしろ先生になんかゴチャゴチャ言われるのが面倒だから内緒で作って受賞してからバラす、というわりとワイルドな指導方針だった。それもあってか教授にはよく怒られた。よその先生の授業すっぽかして教授間の問題にして怒鳴られ、出すって言ってた論文を勝手にすっぽかして怒鳴られ、何にせよ10:0で僕が悪いので具体的に(略)。

ひとしきり怒られたあと、飛び出すのも一つの選択肢だと提案してくれた。まだ自分が飛び出してなんとかなる程の実力ではないことくらい把握しているという僕の言葉を遮り「実力ではなく度胸だ」と。

考えれば当然のことで、これとこれとこれさえやっとけば大丈夫なんてものは無く、変わっていく時代の中で実力に限度なんて無い。だったら後はもう腹を決めて、右か左か分からない場所を前だと決めつけて進むしかないだろうと、僕はそう解釈した。

直接指導してもらった数少ない言葉だったと思う。



思うに、関係性とは宣言によってではなく行為の積み重ねで徐々に浮き彫りになるべきものなのではないか。例えば友達になって下さいと言ったやつのことではなく、ましてや友達申請ボタンを押したやつのことでもなく、たまたま座った席が近くで話も合ってなんとなくよくつるんでるやつの事を友達というのではないか。そういう点では、寝食を共にし、同じ釜の飯を食い、徹夜で遊び寝て起きてまた遊んで寝て起きて銭湯行って未来について話したやつのことを家族と呼ぶのが妥当ではなかろうか。兄貴がカッコイイと思わないわけないし、妹が可愛いと思わないわけもない。

愛する家族の未来がどうか幸せなものであることを祈る。

今年から大学生になる方へ

あんまり説教じみた感じになるとアレだけど。とにかく、世の中は広いというその一点に尽きる。

僕が生きてきたのはたかだか数年で、会ってきた人は数百人にも満たないだろう。あっちで当然とされてたことがこっちで非常識だったり、こっちではみ出し者があっちでヒーローだったり、色んな経験を持った人が色んな場所で色んなことをしている。そんな中で、ただ一人自分だけはつきまとう。どこ行ったってつきまとう。嫌でもつきまとう。文字通り一生自分からは離れられない。ましてや、どれだけ偉い人がどれだけ偉業を成し得ていようが、他人が過ごした数十年など、自分で見て聞いて考えて手足を動かした1秒の前では、全くの無意味に等しい。自分で積み重ねてきた試行錯誤と失敗のみが意味のあることだと、そう思う。

だからどうか自分を大切にして下さい。自分を大切にする人はきっと、周りの人も大切にできると思います。

2012-03-14

GDC & シリコンバレーツアー

9leapの優勝賞品として、GDC & シリコンバレーツアーに行って来ました。

9leapは年間を通して行われるゲームのコンテストで、去年の春頃から行われていました。僕は@さんとチームで参加していて、投稿していたうちの1本が最優秀賞として選ばれたので、代表ということでツアー参加の権利を譲ってもらいました。

まず最初は成田からサンフランシスコへ向かう飛行機の中でハッカソンがありました。UEIでは恒例行事になっているらしく、今年は「日本」というテーマで到着までに5本ゲームを作ることになりました。結構準備していったつもりだったんですが、実際にはあたふたしてしまい、3本で時間切れになってしまいました。社員の方々はきっちり5本作った上にひとつひとつの出来も良くて流石でした。


AM9:00空港到着

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash4/431266_407796049237795_100000222117979_1800426_27556195_n.jpg


初日はまずComputer History Museumという施設に連れて行ってもらいました。Computer History Museumはコンピュータ史の博物館で、手回しの計算機からスパコンまで歴史に残る様々なコンピュータが展示されていました。


ENIAC

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash4/418360_407796065904460_100000222117979_1800428_1986164198_n.jpg


プログラミング言語樹形図

http://a3.sphotos.ak.fbcdn.net/hphotos-ak-snc7/419413_407796089237791_100000222117979_1800429_925491734_n.jpg


スパコン

http://a2.sphotos.ak.fbcdn.net/hphotos-ak-ash4/426960_407796125904454_100000222117979_1800431_599377047_n.jpg


DynabookプロトタイプiPadによく似ている。

http://a6.sphotos.ak.fbcdn.net/hphotos-ak-snc7/425707_407796152571118_100000222117979_1800433_2008061818_n.jpg


OpenGLのティーポット

http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/430218_407796169237783_100000222117979_1800434_1773750487_n.jpg


Apple1

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash4/431112_407796262571107_100000222117979_1800439_1352792798_n.jpg


Apple2

http://a1.sphotos.ak.fbcdn.net/hphotos-ak-snc7/419603_407796279237772_100000222117979_1800440_196478445_n.jpg


Macintosh

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-snc7/424916_407796215904445_100000222117979_1800437_1942433997_n.jpg


Google1号機

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash4/422869_407796299237770_100000222117979_1800442_539527317_n.jpg


昼食のIN-N-OUT burger。ケチャップが雑。

http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash4/420437_407796352571098_100000222117979_1800445_1134727378_n.jpg


Google通り。アメリカでは道を作ったら勝手に名前をつけていいそうです。

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-snc7/425940_407796442571089_100000222117979_1800449_68966129_n.jpg


ドロイド君人形

http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash4/417153_407796472571086_100000222117979_1800451_1423107924_n.jpg


会社の周りでゾロゾロしてたら怒られそうな雰囲気だったので外から眺めるだけにしておきました。


次はフィッシャーマンズワーフにあるMusee Mecaniqueに行きました。Musee Mecaniqueは機械を使ったエンタメの歴史が展示してあり、大昔のからくりが展示してあります。


オルゴールマシン

http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/422505_407796555904411_100000222117979_1800455_1680650517_n.jpg


古代のエロゲー。覗くとスライドショーが見れる。

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash4/431338_407796579237742_100000222117979_1800456_55665867_n.jpg


続いて船に乗って橋を見に行きました。

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-snc7/417115_407796609237739_100000222117979_1800458_768141175_n.jpg


ゴールデンゲートブリッジ

http://a1.sphotos.ak.fbcdn.net/hphotos-ak-ash4/420774_407796675904399_100000222117979_1800463_405016687_n.jpg


アルカトラズ島

http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash4/422542_407796779237722_100000222117979_1800471_427465244_n.jpg


機内ハッカソンの疲れもあり、その後の記憶が虚ろなまま初日が終わりました。

http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/425219_407796842571049_100000222117979_1800476_208439329_n.jpg


二日目もハッカソンから始まりました。今回は二時間で一本制作して9leapで一番評価が高かった人が優勝というルールです。午後からは街を散策しました。


路面電車

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash4/423766_407796935904373_100000222117979_1800480_429329322_n.jpg


広場

http://a1.sphotos.ak.fbcdn.net/hphotos-ak-snc7/426054_407796972571036_100000222117979_1800482_512086939_n.jpg


iPadの自販機。しかも売り切れ。

http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/427976_407796992571034_100000222117979_1800483_1970592439_n.jpg


iPadミュージシャン

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash4/426951_407797019237698_100000222117979_1800485_284486117_n.jpg


オレオブレンダーブラスター。破滅的に甘い。

http://a2.sphotos.ak.fbcdn.net/hphotos-ak-ash4/420033_407797039237696_100000222117979_1800486_1967260319_n.jpg


サンフランシスコ寿司。左からDragon, Kamikaze, Spider

http://a7.sphotos.ak.fbcdn.net/hphotos-ak-snc7/418480_407797069237693_100000222117979_1800488_1201336219_n.jpg


Omakaze

http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash4/419422_407797092571024_100000222117979_1800490_119778027_n.jpg


三日目はシリコンバレーを回りました。


Apple

http://a8.sphotos.ak.fbcdn.net/hphotos-ak-snc7/430395_407797139237686_100000222117979_1800493_1036465472_n.jpg


吉野家

http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash4/427721_407797159237684_100000222117979_1800495_637330557_n.jpg


マクドナルド

http://a1.sphotos.ak.fbcdn.net/hphotos-ak-ash4/427084_407797172571016_100000222117979_1800496_1525033115_n.jpg


チーズバーガーを頼んだら二個入りでした。

http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash4/431492_407797202571013_100000222117979_1800498_2050856000_n.jpg


Intel

http://a2.sphotos.ak.fbcdn.net/hphotos-ak-snc7/429981_407797225904344_100000222117979_1800499_1469696420_n.jpg


入ってる

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-snc7/427112_407797245904342_100000222117979_1800500_896880722_n.jpg


Yahoo!

http://a2.sphotos.ak.fbcdn.net/hphotos-ak-ash4/417174_407797305904336_100000222117979_1800503_36368107_n.jpg


夜はジャパンタウンに行きました。

http://a1.sphotos.ak.fbcdn.net/hphotos-ak-snc7/429676_407797442570989_100000222117979_1800507_90035830_n.jpg


MANGA

http://a8.sphotos.ak.fbcdn.net/hphotos-ak-snc7/422893_407797582570975_100000222117979_1800509_1346396080_n.jpg


人狼村からの脱出

http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/425803_407797409237659_100000222117979_1800506_1488527241_n.jpg


Redbull。あんまり激しくなかった。

http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash4/430602_407797332571000_100000222117979_1800504_1885572012_n.jpg


鉄板焼き。海外では鉄板の前でシェフがパフォーマンスしてくれることが一般的なようです。

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash4/424046_407797659237634_100000222117979_1800511_947340155_n.jpg


リアルアングリーバード

http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/423332_407797669237633_100000222117979_1800512_107223976_n.jpg


レーザーチェスKhent2.0

http://a1.sphotos.ak.fbcdn.net/hphotos-ak-ash4/423188_407797692570964_100000222117979_1800513_801348779_n.jpg


三日目からいよいよGDCに参加します。隣では新iPadの発表会が行われていました。

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-snc7/420557_407797732570960_100000222117979_1800514_1490122674_n.jpg


GDCではゲームデザインセッションを中心に聞いていましたが、英語だとスライドを追いかけるのがやっとで、哲学的な話になるとお手上げ状態でした。聞いたセッションは大体こんな感じです。

4Gamer.net ― [GDC 2012]「SimCity」のリードデザイナーが教える,ゲームデザインの基礎

4Gamer.net ― [GDC 2012]歴史に埋もれたゲームから新たなアイデアが生まれる。「TRS-80」のタイトルを紹介するセッションに参加してみた

『GRAVITY DAZE』のビジュアルの秘密に迫る!【GDC 2012】 - ファミ通.com

4Gamer.net ― [GDC 2012]“一生忘れられない1本”を作り上げるコツとは。「スペースインベーダー インフィニティジーン」の石田氏が語る5つの方法

【GDC 2012】和田康宏氏が語る「牧場物語」誕生秘話 - GAME Watch

4Gamer.net ― [GDC 2012]48時間で制作された驚愕のゲーム「Glitchhiker」は,誕生から6時間後に消滅していた


セッション間の時間は9minute coding battleをやってました。これがとてもエキサイティングで、その場で乱入してくる人が現れるなど、今回一番楽しかったと言ってもいいくらいでした。


他にも多くの企業がブースを出していました。

ネコミミ

http://a2.sphotos.ak.fbcdn.net/hphotos-ak-ash4/431255_407797802570953_100000222117979_1800517_2139155897_n.jpg


全身タイツ

http://a1.sphotos.ak.fbcdn.net/hphotos-ak-ash4/430420_407797835904283_100000222117979_1800518_465988620_n.jpg


最終日はcouchbase社を見学させてもらいました。

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-snc7/419573_407798079237592_100000222117979_1800528_251859906_n.jpg


オフィス

http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash4/422396_407797885904278_100000222117979_1800521_2053976200_n.jpg


couch

http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash4/427098_407797935904273_100000222117979_1800522_263555747_n.jpg


couch

http://a4.sphotos.ak.fbcdn.net/hphotos-ak-snc7/427603_407797965904270_100000222117979_1800523_1956256217_n.jpg


キッチン

http://a1.sphotos.ak.fbcdn.net/hphotos-ak-ash4/422470_407797982570935_100000222117979_1800524_568495409_n.jpg


卓球もできます。

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash4/427606_407798012570932_100000222117979_1800526_136406464_n.jpg


栄養ドリンクをもらいました。

http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash4/420640_407798045904262_100000222117979_1800527_2092046575_n.jpg


ヘリで遊ぶshi3zさん

D


空港

http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/428201_407798129237587_100000222117979_1800531_1475268634_n.jpg


こんな感じでした。実際にはもっともっとあれやこれやと楽しいイベントがあったんですが、いざ振り返ってみるとほとんど写真を撮っていませんでした。もっと詳しいレポートはそのうちwise9などにアップされるのではないかと思います。9leapは今年も続行らしいので、GDCツアーに参加してみたい方は是非挑戦して下さい。

2011-05-23

合コンクエスト

f:id:blankblank:20110522222512p:image:w320

http://gocomq.appspot.com/



誰か連れてってください

2011-05-22

enchant.js入門

大学の授業で話すことになったのでenchant.jsの使い方を説明します.「授業でプログラミングを触ったことがある」くらいの人を想定しているつもりです.enchant.jsjavascriptでゲームを開発するためのライブラリで,PCだけでなくiPhoneAndroidなどのスマートフォンブラウザでも動作するゲームを作ることができます.またコンテストが開催されており,作ったゲームを投稿することもできます.


本稿では

  • 開発環境の構築
  • 画像の表示
  • 画像の移動
  • キー入力による移動
  • マップの表示
  • ステージのスクロール
  • キャラクタの動き
  • マップとの当たり判定

という順序で最終的に付属のアクションゲームと同じようなものを作るところまでいきます.

ブラウザを用意する

制作したゲームを実行するためのブラウザを用意します.FirefoxChromeなどモダンブラウザならだいたいいけるみたいです.今回はFirefox4を使用します.

公式サイトよりダウンロードインストールします.

次世代ブラウザ Firefox ? 高速・安全・カスタマイズ自在な無料ブラウザ

f:id:blankblank:20110510234542p:image:w480


また,Firefoxで開発する場合Firebugというアドオンがあると便利なのでこれも導入します(Chromeだと同等の機能が標準で備わっています).

Firebug

f:id:blankblank:20110510234543p:image:w480

ライブラリを導入する

リポジトリからパッケージをダウンロードします.

wise9/enchant.js ? GitHub

パッケージを解凍し,examples/action下のindex.htmlブラウザで開くとサンプルのゲームで遊べます.

f:id:blankblank:20110510234544p:image:w480

テンプレートの作成

javascriptでゲームを開発する場合,まずブラウザに表示させるためのhtmlファイルが必要です.先ほど開いたindex.htmlを適当な場所にコピーして次のように書き換えてください.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>enchant</title>
    <script type="text/javascript">
      console.log("hoge");
    </script>
    <style type="text/css">
      body { margin: 0; }
    </style>
  </head>
  <body>
  </body>
</html>

ファイルを開く前に,ブラウザのコンソール画面を有効にします.Firefox + Firebugの場合[ツール] -> [Firebug] -> [Firebugを開く]でコンソールを表示できます.

f:id:blankblank:20110510234545p:image

f:id:blankblank:20110510234546p:image

この状態でファイルを開くと,コンソールにメッセージが表示されます.htmlではscriptタグで囲んだ部分をjavascriptとして評価します.この場合7行目がそれにあたり,console.logはコンソールにメッセージを表示させる関数です.

また,scriptタグ内に書いたコードはすぐに実行されますが,ページ内のまだ読み込まれていない要素にアクセスしたい場合すぐに実行されると困ります.全ての要素の読み込みが終わってからコードを実行したい場合次のようにします.

window.onload = function() {
  console.log("hoge");
}

javascrpitではfunctionで囲った部分が関数として評価され,window.onloadに代入した関数はページの読み込み後に実行されます.

スプライトの表示

実際にゲームのコードを書いていきます.まずダウンロードしたパッケージ内に入っていたenchant.jsとサンプルフォルダに入っていたchar1.gifhtmlファイルと同じフォルダにコピーします.

f:id:blankblank:20110510234547p:image

enchant.jsを読み込むには,scriptタグのsrcにファイルパスを指定します.コードを次のように書き換えて実行するとクマが表示されます.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>enchant</title>
    <script type="text/javascript" src="enchant.js"></script>
    <script type="text/javascript">
      enchant();
      window.onload = function() {
        var game = new Game(320, 320);
        game.fps = 24;
        game.preload('chara1.gif');
        game.onload = function() {
          var bear = new Sprite(32, 32);
          bear.image = game.assets['chara1.gif'];
          game.rootScene.addChild(bear);
        }
        game.start();
      }
    </script>
    <style type="text/css">
      body { margin: 0; }
    </style>
  </head>
  <body>
  </body>
</html>

f:id:blankblank:20110510234548p:image

enchant()はライブラリを使用するための初期化処理で,enchant.jsを使用する際は必ず最初に呼び出します.

var game = new Game(320, 320);
game.fps = 24;
game.preload('chara1.gif');

ゲーム画面を320x320で作り,フレームレートを設定し,使用する画像を読み込んでいます.

game.onload = function() {
  ...
}

window.onloadと同様に,game.onloadに関数を登録しておくと画像の読み込みや描画領域の確保などが終わったあとに登録した関数が実行されます.

  var bear = new Sprite(32, 32);
  bear.image = game.assets['chara1.gif'];
  game.rootScene.addChild(bear);

画像を表示するにはSpriteを用意し,シーンに追加します.初期化時にスプライトのサイズを,imageプロパティにgame.assetsを通して読み込んだ画像を指定します.ここで,画像のサイズとスプライトのサイズが違う場合画像の左上が切り取られるような形で表示されます.

game.start();

最後にゲームを起動します.

画像の移動

表示した画像を移動させます.

bear.addEventListener(Event.ENTER_FRAME, function(e) {
  bear.x += 1;
});

addEventListenerを使うとSpriteやSceneなどにイベントと処理のペアを登録することができます.ここでは,ENTER_FRAMEイベントにクマを移動させる処理を登録し,フレーム毎に徐々にクマの位置を移動させることでアニメーションを実現しています.他にも画面をタップ(PC/Macではクリック)したときのイベントなどがあります.イベント一覧はドキュメントのenchant.Eventで確認できます.

キー入力による移動

キー入力によってクマが移動するようにします.コードを次のように書き換えます.

bear.addEventListener(Event.ENTER_FRAME, function(e) {
  if(game.input.right)
    bear.x += 5;
  else if(game.input.left)
    bear.x -= 5;
});

game.inputにはフレーム毎の入力の状態が保持されており,上記のコードではユーザのキー入力に応じてクマの位置を移動させています.

マップの表示

キャラクタのように激しく動きまわるものでなく,ステージや背景など比較的動かないものはMapを使うと楽に書けます.サンプルフォルダのmap2.gifhtmlファイルと同じフォルダにコピーし,ソースコードを書き足します.

// preloadにも追加
game.preload("chara1.gif", "map2.gif");
var blocks = [
  [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, ...(略.適宜サンプルからコピーしてください.
];

var map = new Map(16, 16);
map.image = game.assets["map2.gif"];
map.loadData(blocks);

f:id:blankblank:20110517182948p:image

マップを生成するにはマップチップというものを使います.これは,マップを構成する画像を並べてひとつの画像にしたものです.Mapは初期化時にチップ1つのの大きさを,imageにマップチップの画像を指定します.チップの並びはloadDataに二次元配列を渡すことで設定します.配列内の数値はマップチップの座標に対応(下図)しており,何も無い部分は-1にします.

f:id:blankblank:20110517182950p:image

ステージのスクロール

クマの移動によってマップの表示されてない部分を見えるようにします.

var stage = new Group();
stage.addChild(map);
stage.addChild(bear);
stage.addEventListener(Event.ENTER_FRAME, function(e) {
  if(stage.x > 64 - bear.x)
    stage.x = 64 - bear.x;
});

// rootSceneへのaddChildは書き換え
game.rootScene.addChild(stage);

マップのスクロールはマップとクマをステージとしてひとつにまとめ,ステージ自体を動かすことで実現します.Groupは複数のマップやキャラクタをまとめるために使います.stageにもEventListenerを追加し,フレーム毎にクマの位置に応じてステージも動かします.

f:id:blankblank:20110517182949p:image

キャラクタの動き

キャラクタの動きを実装します.今までキー入力によって一定の速度で移動していたものを加速しながら動くようにします.bearのaddEventListenerを次のように書き換えます.

bear.vx = 0;
bear.addEventListener(Event.ENTER_FRAME, function(e) {
  var ax = 0;
  if(game.input.right) ax += 0.5;
  if(game.input.left) ax -= 0.5;
  bear.vx += ax;
  bear.x += bear.vx;
});

加速運動を表現するには速度と加速度が必要なので,それぞれvx,axとします.毎フレームごとにキー入力によって加速度を変更し,加速度を速度に,速度を位置に加算します.実行して右キーを押し続けるともの凄い速さでクマが飛んでいきます.これではゲームにならないので,速度に制限をもたせます.

bear.vx = Math.min(Math.max(bear.vx, -10), 10);
bear.x += bear.vx;

Math.maxは引数の中で一番大きい値を返し,minは小さい値を返します.速度を位置に加算する直前にmaxとminを使って速度に上限と下限をもたせます.実行すると徐々に速くなっていきますが,一定の速度以上にはなりません.次に,キーを離すと減速するようにします.

if(game.input.right) ax += 0.5;
if(game.input.left) ax -= 0.5;
if (bear.vx > 0.3)
  ax -= 0.3;
else if (bear.vx > 0)
  ax -= bear.vx;
if (bear.vx < -0.3)
  ax += 0.3;
else if (bear.vx < 0)
  ax -= bear.vx;

速度が一定以上の場合加速度を減らし,ほぼ止まりかけのときは決め打ちで止めます.逆向きも同じです.次に,クマのアニメーションを設定します.

// bear初期化時
bear.pose = 0;
var ax = 0;
if(game.input.right) ax += 0.5;
if(game.input.left) ax -= 0.5;
if (ax > 0) bear.scaleX = 1;
if (ax < 0) bear.scaleX = -1;
if (ax != 0) {
  if (game.frame % 3 == 0) {
    bear.pose++;
    bear.pose %= 2;
  }
  bear.frame = bear.pose + 1;
} else
  bear.frame = 0;

scaleXはキャラクタのX軸方向の拡大率を表し,これに-1を代入することで左右の表示を反転することができます.bear.frameはMapと同じように値によって表示する画像を変えることができます.ここでは,bearにposeプロパティを設定し,一定フレーム毎にその値を変え,frameに代入しています.game.frameはゲームが開始してからのフレーム数を返し,それを定数で割った余りを見ることで一定フレーム毎の処理を行っています.

ジャンプと重力

上下の運動を実装します.bearの初期化と位置の更新の前後を次のように書き換えます.

bear.vy = 0;
bear.jumping = false;
if(game.input.up && !bear.jumping) {
  bear.vy = -9;
  bear.jumping = true;
}
bear.vy += 0.5;

bear.x += bear.vx;
bear.y += bear.vy;

if(bear.y >= 100) {
  bear.y = 100;
  bear.jumping = false;
}

実行すると,上キーでジャンプします.まずジャンプ中かどうかを判定するフラグを用意し,フラグが立っていないかつ上キーが押されていた場合上方向へ速度を設定します.さらに,毎フレームごとに下方向へ速度を加算することで重力を表現します.位置の更新が終わった後,着地を判定します.

当たり判定

最後に,キャラとマップの当たり判定を書きます.速度を決定した後のコードを次のように書き換えます.

var dx = bear.x + bear.vx + 5;
var dy = bear.y + bear.vy;
if(map.hitTest(dx, dy + bear.height)
|| map.hitTest(dx + bear.width - 10, dy + bear.height)) {
  dy = Math.floor((dy + bear.height) / 16) * 16 - bear.height;
  bear.vy = 0;
  bear.jumping = false;
}
bear.x = dx - 5;
bear.y = dy;

実行すると,一定の高さを基準にジャンプしていたのがマップに着地するようになりました.map.hitTestは引数にとったx,y座標にマップがあるかどうかを判定します.ここでは,bearの左下(dx, dy + bear.height)か右下(dx + bear.width, dy + bear.height)がマップに当たっていた場合,y座標に地面の高さを代入します(ちなみにxに5を足しているのは微調整です.width - 10も同様).Math.floorは引数にとった値の小数点を切り捨てた値を返すので,dyにはマップの境界(- bearの高さ)が代入されます.後は同様に上と左右の当たり判定も加えていきます.上と左右を加えていく際にはもう少し細かい処理が必要なのでここでは割愛しますが,基本的には同じです.詳しくはサンプルのソースを見てください.

おわりに

これで一通り完成しました.他にも http://9leap.net/ でenchant.jsを使ったゲームのソースが見れます.僕もenchant.jsを使って9leapにゲームを投稿したので,ぜひ遊んでみてください.

9leap : 合コンクエスト by blankblank - どこでも遊べる、投稿型ゲームサイト

f:id:blankblank:20110522004914p:image:w320


参考

今回使ったソース

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>enchant</title>
    <script type="text/javascript" src="enchant.js"></script>
    <script type="text/javascript">
      enchant();
      window.onload = function() {
        var game = new Game(320, 320);
        game.fps = 24;
        game.preload("chara1.gif", "map2.gif");
        game.onload = function() {
          var blocks = [
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 4, 4, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 3, 3,-1,-1,-1,-1, 4, 4, 4, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 3, 3,-1,-1,-1,-1, 3, 3, 3, 3, 4, 4, 4, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 3, 3,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 3, 3,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,-1,-1,-1,-1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 4, 4, 4, 4, 4, 4, 3, 3, 3,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,-1,-1,-1,-1, 4, 4, 4, 4, 4, 4, 4,-1,-1, 2, 2,-1,-1, 2, 2,-1,-1, 2, 2,-1,-1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
            [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 3,10,10,10,10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,10,10,10,10, 3, 3, 3, 3, 3, 3, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
            [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
          ];
          
          var map = new Map(16, 16);
          map.image = game.assets["map2.gif"];
          map.loadData(blocks);
          
          var bear = new Sprite(32, 32);
          bear.image = game.assets["chara1.gif"];
          bear.vx = 0;
          bear.vy = 0;
          bear.pose = 0;
          bear.jumping = false;
          bear.addEventListener(Event.ENTER_FRAME, function(e) {
            var ax = 0;
            if(game.input.right) ax += 0.5;
            if(game.input.left) ax -= 0.5;
            if (ax > 0) bear.scaleX = 1;
            if (ax < 0) bear.scaleX = -1;
            if (ax != 0) {
              if (game.frame % 3 == 0) {
                  bear.pose++;
                  bear.pose %= 2;
              }
              bear.frame = bear.pose + 1;
            } else
              bear.frame = 0;
            if (bear.vx > 0.3)
              ax -= 0.3;
            else if (bear.vx > 0)
              ax -= bear.vx;
            if (bear.vx < -0.3)
              ax += 0.3;
            else if (bear.vx < 0)
              ax -= bear.vx;
            bear.vx += ax;
            
            bear.vx = Math.min(Math.max(bear.vx, -10), 10);
            if(game.input.up && !bear.jumping) {
              bear.vy = -9;
              bear.jumping = true;
            }
            bear.vy += 0.5;
            
            var dx = bear.x + bear.vx + 5;
            var dy = bear.y + bear.vy;
            if(map.hitTest(dx, dy + bear.height)
            || map.hitTest(dx + bear.width - 10, dy + bear.height)) {
              dy = Math.floor(dy / 16) * 16;
              bear.vy = 0;
              bear.jumping = false;
            }
            bear.x = dx - 5;
            bear.y = dy;
          });
          
          var stage = new Group();
          stage.addChild(map);
          stage.addChild(bear);
          stage.addEventListener(Event.ENTER_FRAME, function(e) {
            if(stage.x > 64 - bear.x)
              stage.x = 64 - bear.x;
          });
          
          game.rootScene.addChild(stage);
        }
        game.start();
      }
    </script>
    <style type="text/css">
      body { margin: 0; }
    </style>
  </head>
  <body>
  </body>
</html>

2011-03-31

大学で何を学んだか

知らせを受けたのが懇親会の席ということもあり,昔お世話になった方や他大学の先生方から「ヒヨった」「なぜ飲み会の席でネタを提供しようとしないのか」など様々なお祝いの言葉をいただけて,何か釈然としない感が残るもとりあえず4年で卒業できた.

ぶっちぎり一番でゴールするわけでもなく,レールを外して我が道を貫いたわけでもなく,そして何よりそうなってしまったことに何も感じない.入学当時の自分に「これが4年後のあなたです」と見せたらどう思うだろう.殴られるかもしれないけど,殴り返さないし,むしろ心からお礼を言いたい.

成績の良い人は凄い

成績が良いイコール敷かれたレールに疑問を持たない帝国の犬なんて,わりと偏ったことを考えていた.そういう面もあると思うけど,評価基準それ自体を比較することはできないと考えるとこれはおかしい.

例えば野球の全国大会で優勝した人とテレビゲームの全国大会で優勝した人を連れてきてどっちが凄いですかって比べることはできない.野球が面白いと思う人は前者かもしれないし,ゲームが面白いと思う人は後者かもしれない.野球が好きな人が世の中に100人いて,ゲームが好きな人が世の中に10人いたとしても「より多くの人に支持されている価値観の方が価値観として妥当」というのも一つの価値観でしかない.

全ての行いは立場によっては正当性があり,また立場それ自体は比較できない.一生懸命勉強して良い成績取ったやつは凄ければ,漫画とかアニメとか見まくってオタク知識が山の様にあるやつだって同じくらい凄い.

みんなみんな凄い.でもそれは同時に凄い凄くない,正しい正しくないなんていうこと自体が大して重要ではないということでもある.

俺すげえええ

複数人で何かを成し得ようとして見えてきたこともある.それまでは俺すげえええっていうのは純粋な自信過剰で,何のひねりもなく自分は凄いんだと思っていた.当然それは思い上がりで,世の中の広さを知っていく度にその気持ちも薄れていったけど,チームワークとなると話は変わってくる.自分の能力はチームの能力でそれに自信を持つことはチームの能力に自信を持つことに等しい.逆に自信を持たないと,それはチームの能力を信用してないということに繋がる.頼ってくれてる人はどうなるのか,また頼ってる他の人にそれされたらどうなるのか.

自分の力量を自覚した上で俺すげえええって心の底から思うことが必要なんだと.

ですから、桜木花道が、かつて一度もパスを送ったことのない、ライバル流川楓に最高のパスを送った瞬間、物語はそのドラマの絶頂を迎えます。その頁は、長く自分ひとりのためにバスケットボールに打ち込んでいた幼い花道が、「通過儀礼」を達成して「共同体の一員」になったその瞬間を図像化した、マンガ史上に残る感動的なシーンでした。

ONE PIECE STRONG WORDS

いっぱい時間使って色々考えたわりには,ごくごく普通で(そして大人しい)結論に至ったけどまあこれはこれで良いかなって.明日はまた気分が変わってるかもしれない.