トップへ
自機を動かす
自機を動かすプログラムを書きます
カーソルキーで動かす
自機をダブルクリックし、次のように入力します。
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 でもとの絵を表示します。
次へ