トップへチュートリアルWikiトップ

自機を動かす

自機を動かすプログラムを書きます

  • カーソルキーで動かす

    自機をダブルクリックし、次のように入力します。

    extends SpriteChar;

    $map.setBGColor(color(0,200,255)); // 背景色を設定
    while (1) {
      if (getkey(39)) x+=3; // カーソルキー右が押されたら右へ移動
      if (getkey(37)) x-=3; // カーソルキー左が押されたら左へ移動
      update();
    }

    F9を押して実行します。カーソルキーの左右を使って自機が動きます。
    F2で停止できます。

  • 落下する

    でも動きが何か変です。まず、横から見た画面ですから落下する必要があります。
    そこで次の文を追加してみましょう。

    extends SpriteChar;

    $map.setBGColor(color(0,200,255)); // 背景色を設定
    while (1) {
      if (getkey(39)) x+=3; // カーソルキー右が押されたら右へ移動
      if (getkey(37)) x-=3; // カーソルキー左が押されたら左へ移動
    y+=vy; // vy: y 方向の速度。 yにvy を加える
      vy+=0.5; // 落下速度を上げる
    update();
    }

    F9を押して実行します。すると自機はあっという間に落下していきました。

  • 床に着地する

    今度は落下しっぱなしで、ブロックに当たってもすりぬけてしまいました。
    そこで、ブロックに当たったら落下が止まる判定を行います。
    extends SpriteChar;

    $map.setBGColor(color(0,200,255)); // 背景色を設定
    while (1) {
      if (getkey(39)) x+=3; // カーソルキー右が押されたら右へ移動
      if (getkey(37)) x-=3; // カーソルキー左が押されたら左へ移動
      y+=vy; // vy: y 方向の速度。 yにvy を加える
    if ($map.getAt(x,y+24)==$pat_Block+0 ) { // ブロックに当たっていたら
         vy=0; // 落下速度を0にする
      } else { // ブロックに当たっていなかったら
    vy+=0.5; // 落下速度を上げる
    }
      update();
    }

    F9を押して実行します。自機は落下してブロックのところで止まりました。

    [ $map.getAt メソッド ]

    指定した場所にあるマップのキャラクタパターンを得ます。
    $map.getAt(x,y+24) は、自機の中心から24ドット下方向に行った点(自機の足元あたりに)におけるマップパターンを調べます。なにもないところでは-1になります。
     このメソッドが返してくる値は、その場にあるマップのキャラクタパターンですが、どのパターンがどの値を返すかは、つぎの手順で調べます。

    1. マップを作るで使ったキャラクタパターンウィンドウを開きます
    2. キャラクタパターンを選びます。次の図緑枠の部分にキャラクタパターンが表示されます。



    この場合、自分の足元がブロックのパターンだったら、vy=0; とし、落下を止めます。
    そうでなければ、先程と同様落下します。

  • 左右の壁に入れなくする

    無事床に着地したので、ちょっと歩いてみましょう。カーソルキーの右で右へ移動します。



    また変なことになったようです。そのまま右側の壁にめりこんでどんどん進めてしまいます。
    これを防止するには、先程の$map.getAtメソッドを使います。

    extends SpriteChar;

    $map.setBGColor(color(0,200,255)); // 背景色を設定
    while (1) {
      if (getkey(39)
    && $map.getAt(x+16,y)!=$pat_Block+0 ) x+=3;
      // ↑ カーソルキー右が押され、さらに
    右側が壁でなければ右へ移動
      if (getkey(37)
    && $map.getAt(x-16,y)!=$pat_Block+0 ) x-=3;
      // ↑ カーソルキー左が押され、さらに
    左側が壁でなければ左へ移動
      y+=vy; // vy: y 方向の速度。 yにvy を加える
    if ($map.getAt(x,y+24)==$pat_Block+0 ) { // ブロックに当たっていたら
         vy=0; // 落下速度を0にする
      } else { // ブロックに当たっていなかったら
         vy+=0.5; // 落下速度を上げる
      }
      update();
    }


    $map.getAt(x+16,y) は自分より16ドットだけ右側の場所におけるマップパターンを調べます。
    この値がブロック(壁)のパターン=$pat_Block+0 でない場合だけ右に進めるようにします。左方向についても同様な処理を書きます。

    * 左に動かしたら ...?

    プログラム開始後、自機を左に動かすと画面外に消えてしまいます。この場合、F2でプログラムを止めてください。この問題は後で解決しますので、とりあえず画面をでないように動かしてください。

  • ジャンプする

    スペースキーを押すとジャンプできるようにします。

    extends SpriteChar;

    $map.setBGColor(color(0,200,255)); // 背景色を設定
    while (1) {
      if (getkey(39) && $map.getAt(x+16,y)!=$pat_Block+0) x+=3;
      // ↑ カーソルキー右が押され、さらに右側が壁でなければ右へ移動
      if (getkey(37) && $map.getAt(x-16,y)!=$pat_Block+0) x-=3;
      // ↑ カーソルキー左が押され、さらに左側が壁でなければ左へ移動
      y+=vy; // vy: y 方向の速度。 yにvy を加える
      if ($map.getAt(x,y+24)==$pat_Block+0 ) { // ブロックに当たっていたら
         vy=0; // 落下速度を0にする
         
    if (getkey(32)) vy=-10; // スペースキーを押したらジャンプ
    } else { // ブロックに当たっていなかったら
         vy+=0.5; // 落下速度を上げる
      }
      update();
    }

    vy を負の値(-10)にすることにより、上方向の力を加えることができます。

  • 向きを変える

    現在の状態では、自機がずっと右を向いています。左に移動しているときは左右反転して表示するようにします。

    extends SpriteChar;

    $map.setBGColor(color(0,200,255)); // 背景色を設定
    while (1) {
      if (getkey(39) && $map.getAt(x+16,y)!=$pat_Block+0)
    {
    x+=3;
        
    f=0;
      }

      // ↑ カーソルキー右が押され、さらに右側が壁でなければ右へ移動
      if (getkey(37) && $map.getAt(x-16,y)!=$pat_Block+0)
    {
    x-=3;
    f=1;
      }
    // ↑ カーソルキー左が押され、さらに左側が壁でなければ左へ移動
      y+=vy; // vy: y 方向の速度。 yにvy を加える
      if ($map.getAt(x,y+24)==$pat_Block+0 ) { // ブロックに当たっていたら
         vy=0; // 落下速度を0にする
         if (getkey(32)) vy=-10; // スペースキーを押したらジャンプ
      } else { // ブロックに当たっていなかったら
         vy+=0.5; // 落下速度を上げる
      }
      update();
    }


    変数fに1を代入すると、左右を反転した絵を表示します。 0 でもとの絵を表示します。

    次へ