• このエントリーをはてなブックマークに追加

今なら、継続入会で月額会員費が1ヶ月分無料!

【shi3z】小学6年生のプログラマ、シュン君からの手紙
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【shi3z】小学6年生のプログラマ、シュン君からの手紙

2014-06-25 15:49
    shi3z

     先日、Microsoftの品川本社でマンツーマンでプログラミングを教えたシュン君から、手紙をいただいた。
    こんにちは。シュンです。
    先日は、どうもありがとうございました。
     
    分からないところがあるので、すみませんが、教えていただけますか。
    ゲームで、ステージのマップの配置まではできたのですが、
    スクロールのところで止まっています…
    ネットなどでも調べてみたのですが、解決方法がないようです。
     
    Map0とMap1というMapの変数があり、
    Map0はx:0, y:0、Map1はx:SCREEN_WIDTH(320), y:0という座標になっています。(index.js 75行目から)
    両方をスクロールさせ(enterframeイベントで3回に1回、x-=1をする)、(index.js 118行目)
    (まだコードには書いていませんが)Map0のxが-320になったら、xを320にする、Map1のxが-320になったら、xを320にすると、
    交互に行って、スクロールできるようにしたいと思っています。
     
    しかし、MapだけでmoveTo、map.x、map.yを使っても、画面上はスクロールされますが、
    跡形が残ってしまう?ので、hitTestで判定すると、何もないところでもゲームオーバーになってしまいます。
    なので、Map0、Map1をGroupの中にそれぞれ入れて、Groupごとに動かしています。(index.js 75行目、80行目のmap_stage)
    座標が(0, 0)のMap0は、跡形が残らず、きちんと動いてくれるのですが、
    座標が(360, 0)のMap1が、画面ではできているように見えますが、(0, 0)の位置に来てしまっているみたいで、
    ゲームオーバーになってしまいます。
     
    どうすればいいのでしょうか。
    Mapの跡形が残らない動かし方、原因などを教えてもらえますか。

     それでソースコードが添付されていたので一通り見てみると、なるほど、面白そうだ

     7455dbd1cac224a0db8b01dbb55efd6a292b5325
     しかしメールにもある通り、map0とmap1の辺り判定のところがうまくない。
     シュン君が書いたコードはこんな感じになってた。

    if (
      map0.hitTest(left + MAP_WITHIN, top + MAP_WITHIN) ||       //左上  
      map0.hitTest(left + MAP_WITHIN, bottom - MAP_WITHIN) ||    //左下
      map0.hitTest(right - MAP_WITHIN, top + MAP_WITHIN) ||      //右上
      map0.hitTest(right - MAP_WITHIN, bottom - MAP_WITHIN) ||   //右下
      map1.hitTest(left + MAP_WITHIN, top + MAP_WITHIN) ||       //左上
      map1.hitTest(left + MAP_WITHIN, bottom - MAP_WITHIN) ||    //左下
      map1.hitTest(right - MAP_WITHIN, top + MAP_WITHIN) ||      //右上
      map1.hitTest(right - MAP_WITHIN, bottom - MAP_WITHIN)      //右下
    ) {
      game.end();
    }

     ちなみにmap0とmap1はともにstageにaddChildされており、rootSceneのenterframeで毎フレームstage.x-=1を実行している。これだと辺り判定の時にmap1の相対的な位置が反映されない。

     奇麗な書き方はいくつもあったが、あまり原型をとどめないように書くとシュン君が理解できない。
     そこで、書き方としてはマヌケだが、わかりやすく書き直した。

    if(map1.x>-SCREEN_WIDTH){
      if (
        map0.hitTest(left + MAP_WITHIN-map0.x, top + MAP_WITHIN) || //左上
        map0.hitTest(left + MAP_WITHIN-map0.x, bottom - MAP_WITHIN) || //左下
        map0.hitTest(right - MAP_WITHIN-map0.x, top + MAP_WITHIN) || //右上
        map0.hitTest(right - MAP_WITHIN-map0.x, bottom - MAP_WITHIN)){
          game.end();
        }
    }else{
      if(
        map1.hitTest(left + MAP_WITHIN-map1.x, top + MAP_WITHIN) || //左上
        map1.hitTest(left + MAP_WITHIN-map1.x, bottom - MAP_WITHIN) || //左下
        map1.hitTest(right - MAP_WITHIN-map1.x, top + MAP_WITHIN) || //右上
        map1.hitTest(right - MAP_WITHIN-map1.x, bottom - MAP_WITHIN) //右下 )  
      {
        game.end();
      }
    }

     余計なif文を挟んでいるのは、enchant.jsのMapクラスのhitTestにマイナスの値を入れるとエラーが出るからだ。これはMapの内部構造は単なる二次元配列であり、マイナスの値を想定していないことから、こういう工夫をする必要がある。

     それにしても飲み込みが早い。
     Mapクラスについては僕は一言も教えていないので、彼が勝手に見つけて、勝手に使っているのだ。

     なにかを勉強しようとか、学ぼうとかいうときに、お仕着せのお勉強というのはあまり意味がない。
     自分が何をやりたいのか、それが明確なとき、初めて知識や叡智といったものは、魂のこもったものとして人に息吹を与えてくれる。


     テストに合格したいからとりあえず覚える、という「なにかのためにする勉強」と、「こうしたいから、その方法を知りたい」という切実な願いから湧き出て来る「自分のためにする勉強」はその態度から見ても、効力から見ても、大きく違うと思う。


     とどのつまり、人間の脳というのはハードディスクやSSDに似てる。

     どれだけ大容量のハードディスクを持っていても、そこに収まるデータが、単にゲームだとか、どこからかダウンロードしてきた音楽や映画だとか、要するにあまり実用として役に立たない情報で一杯にしてしまうか、それともコンパイラやソースコード、PhotoshopやKeynoteやPowerPointのデータなど、自らの湧き出るクリエイティビティの記録としての場所なのかによって、全く同じコンピュータを扱っていたとしても、そこから産み出される価値は天と地ほどの差になる。


     つまり知識や経験というのも、ただ溜め込むだけでは意味がなく、それを正しく運用してこそ初めて魂を吹き込まれ、意味が産まれる。


     子供が本当にその知識を必要としたとき、ネットを通じてほとんどの知識がすぐ手に入るこの時代、子供達は僕たちが想像もできない早さで様々なことを吸収し、成長していくのかもしれない。


     そうして育った子供達が、どこまで成長していくのか、楽しみでもあるが空恐ろしくもある。
     きっとあっという間に、僕たちの世代など追い越して、僕たちがまるで想像もできないような次元へ行ってしまうだろうなあ。
    チャンネル会員ならもっと楽しめる!
    • 会員限定の新着記事が読み放題!※1
    • 動画や生放送などの追加コンテンツが見放題!※2
      • ※1、入会月以降の記事が対象になります。
      • ※2、チャンネルによって、見放題になるコンテンツは異なります。
    ブログイメージ
    電脳ヒッチハイクガイド
    更新頻度: 毎週月曜日
    最終更新日:
    チャンネル月額: ¥1,080 (税込)

    チャンネルに入会して購読

    コメントを書く
    コメントをするには、
    ログインして下さい。