←前 次→ トップ |
自機を動かす
自機を作る
自機を作ってみましょう。オブジェクトを作るを参考にオブジェクトを作成します
オブジェクトのキャラクタパターンを指定するを参考に、自機のパターンを指定します。先ほど用いたSamplesの下のMaze.bmpを使います
extends SpriteChar; while(1) { if (getkey(39)>0) x+=3; if (getkey(37)>0) x-=3; update(); } |
実行してみましょう。カーソルキーの右と左で自機を動かせます。
下に落ちる
しかし、これだと自機が空中に浮いています。下に落ちる処理を付け加えて見ましょう。
extends SpriteChar; while(1) { if (getkey(39)>0) x+=3; if (getkey(37)>0) x-=3; y+=3; update(); } |
これで実行すると、自機はどんどん下におちていきます。
床やはしごの判定を加える
今度は、ずっと落ちっぱなしですね。床やはしごにあたったら止まるようにしないといけません。
extends SpriteChar; while(1) { if (getkey(39)>0) x+=3; if (getkey(37)>0) x-=3; if ($map.getAt(x,y)==$pat_Maze+1) y+=3; update(); } |
ここで新しく$map.getAt(x,y)という命令がでてきますが、これは
「(x,y)地点にあるマップのキャラクタパターンを返す」
という働きがあります
(x,y)とは自分のいる地点ですから、自分が床でもはしごでもない場所(紺色の空間)にいる場合だけ落ちるようにすればよいのです。
extends SpriteChar; while(1) { if (getkey(39)>0) x+=3; if (getkey(37)>0) x-=3; if ($map.getAt(x,y+16 )==$pat_Maze+1) y+=3; update(); } |
さて、これでうごかしてみましょう。 まだ足りないものがあります。はしごを使っての上下移動ができません。
そこで、自分がはしごの上にいたら上下キーで移動できるようにしましょう
extends SpriteChar; while(1) { if (getkey(39)>0) x+=3; if (getkey(37)>0) x-=3; if ($map.getAt(x,y+16)==$pat_Maze+1) y+=3; if ($map.getAt(x,y)==$pat_maze+2) { if (getkey(40)>0) y+=3; if (getkey(38)>0) y-=3; } update(); } |
追加した部分の解説をします。
if ($map.getAt(x,y)==$pat_maze+2) { |
↑ここは、自分のいる場所にはしご(キャラクタパターン番号:$pat_maze+2)があるかどうかの判定です
はしごがある場合はif文の中の処理を行います
if (getkey(40)>0) y+=3; if (getkey(38)>0) y-=3; |
↑それぞれ、上や下がおされたら上または下に移動します。
実行させてみましょう。 とりあえずはしごを使って上下移動ができるようですが...? ずっと下を押していたら、壁にめりこんでしまいました。
プログラムをもう一度みてみましょう
extends SpriteChar; while(1) { if (getkey(39)>0) x+=3; if (getkey(37)>0) x-=3; if ($map.getAt(x,y+16)==$pat_Maze+1) y+=3; if ($map.getAt(x,y)==$pat_maze+2) { if (getkey(40)>0) y+=3; if (getkey(38)>0) y-=3; } update(); } |
下を押したら、下に移動するという処理は
if (getkey(40)>0) y+=3; |
でやっていますが、ここに「下のほうに壁があったらとまる」という 判定を加えたほうがよさそうです。 逆にいえば「下が押されていて、かつ下に壁がなかったら、下に移動できる」と書けばよいのです。 先ほどの
if ($map.getAt(x,y+16)==$pat_Maze+1) y+=3; |
という処理は 「下になにもない空間があった場合、下に移動する(落ちる)」 という処理でした。これにならって、次のようにかきなおします
extends SpriteChar; while(1) { if (getkey(39)>0) x+=3; if (getkey(37)>0) x-=3; if ($map.getAt(x,y+16)==$pat_Maze+1) y+=3; if ($map.getAt(x,y)==$pat_maze+2) { if (getkey(40)>0 && $map.getAt(x,y+16)!=$pat_Maze+0 ) y+=3; if (getkey(38)>0) y-=3; } update(); } |
実行させてみましょう。自機の動きはひとまず完成です。
←前 次→ トップ |