このWikiは古くなりました:新しいWikiへ移動


//@pnavi
[[←前>マップを描く]]  [[次→>敵を動かす(2)]]  [[トップ>迷路ゲームの作成]]

**自機を動かす [#c9f8d6c1]

***自機を作る [#q6a50227]

自機を作ってみましょう。[[オブジェクトを作る>オブジェクトを作る]]を参考にオブジェクトを作成します

&ref(mkmychar.png);

[[オブジェクトのキャラクタパターンを指定する>オブジェクトのキャラクタパターンを指定する]]を参考に、自機のパターンを指定します。先ほど用いたSamplesの下のMaze.bmpを使います

&ref(selPatmy_m.png);

***自機の動きを定義する [#f129b425]

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

//prog


 extends SpriteChar;
 while(1) {
   if (getkey(39)>0) x+=3;
   if (getkey(37)>0) x-=3;
   update();
 }


実行してみましょう。カーソルキーの右と左で自機を動かせます。

***下に落ちる [#o06a58c2]

しかし、これだと自機が空中に浮いています。下に落ちる処理を付け加えて見ましょう。

//prog


 extends SpriteChar;
 while(1) {
   if (getkey(39)>0) x+=3;
   if (getkey(37)>0) x-=3;
   y+=3;
   update();
 }


これで実行すると、自機はどんどん下におちていきます。

***床やはしごの判定を加える [#k37565a8]

今度は、ずっと落ちっぱなしですね。床やはしごにあたったら止まるようにしないといけません。

//prog


 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)とは自分のいる地点ですから、自分が床でもはしごでもない場所(紺色の空間)にいる場合だけ落ちるようにすればよいのです。

***めり込みを修正する [#b1fa5e57]

さて、実行させてみると、確かに床で止まるのですが、ちょっとめりこんだ格好になっています。

この仕組みを説明しましょう。次の図をみてください。

&ref(merikomi.png);

これで、すこしめりこんだ理由はわかったでしょうか
めりこまないようにするには、もう少し下の点で判定をすればよいのです。

&ref(merikomi2.png);

//prog


 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();
 }


さて、これでうごかしてみましょう。
まだ足りないものがあります。はしごを使っての上下移動ができません。

そこで、自分がはしごの上にいたら上下キーで移動できるようにしましょう

//prog


 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();
 }


追加した部分の解説をします。

//progfrac 
  if ($map.getAt(x,y)==$pat_maze+2) {


↑ここは、自分のいる場所にはしご(キャラクタパターン番号:$pat_maze+2)があるかどうかの判定です

はしごがある場合はif文の中の処理を行います

//progfrac 
   
 if (getkey(40)>0) y+=3;   
 if (getkey(38)>0) y-=3;


↑それぞれ、上や下がおされたら上または下に移動します。

実行させてみましょう。
とりあえずはしごを使って上下移動ができるようですが...?
ずっと下を押していたら、壁にめりこんでしまいました。

&ref(merikomi3.png);

プログラムをもう一度みてみましょう

//prog


 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();
 }


下を押したら、下に移動するという処理は

//progfrac 
  if (getkey(40)>0) y+=3;


でやっていますが、ここに「下のほうに壁があったらとまる」という
判定を加えたほうがよさそうです。
逆にいえば「下が押されていて、かつ下に壁がなかったら、下に移動できる」と書けばよいのです。
先ほどの

//progfrac 
  if ($map.getAt(x,y+16)==$pat_Maze+1) y+=3;


という処理は
「下になにもない空間があった場合、下に移動する(落ちる)」
という処理でした。これにならって、次のようにかきなおします

//prog


 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();
 }


実行させてみましょう。自機の動きはひとまず完成です。

//@pnavi
[[←前>マップを描く]]  [[次→>敵を動かす(2)]]  [[トップ>迷路ゲームの作成]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS