※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

 「TDRCの講座やプログラムを見て、実際にマップ取得をどうやっているのかを謎に思う人は多いでしょう。
かくいう私も、他人のプログラムは少しも見たくありません。
分かりづらいことこのうえない

いや、せっかく書いてもらったりして悪いんですが、分からないんですよ!!!!

さて、そんな風に今日もグチを言うごま太郎ですが、とりあえずとっととマップの取得についてご説明しましょう。
マップの取得とはどういうものか。のまえに、マップについて。
マップのとは、レイヤーの一つだと思えばいいでしょう。
え、レイヤーが分からない? それでは、久しぶりに図説しましょう。

書いてあるように、レイヤーとはOHPシートのようなものです。
あの、下から光に当ててプレゼンテーションをするやつです。
ちなみに、レイヤーと聞いてニヤリとしてしまった方。残念!!(ディープなので気にしないよう)

あれ? 今日の趣旨ってマップの取得じゃ…^^;
よし、話を戻そう。マップがなんたるかなんてのは今日の講座ではどうでもいいことなのだ。

マップの取得には、$map.get()$map.getAt()の二種類があります。
この二つの違いは下にまとめました。
$map.get()
 マップ座標(番外講座 MAPの概念参照)でのみマップを取得できます

$map.getAt()
 オブジェクト座標(番外講座 オブジェクトの座標参照)でのみマップを取得できます

さて、とどちらを使う方がいいのでしょうか? ここは一応RPGの製作を念頭に置いた講座をしています。
そのため、RPGを作る側としては$map.get()のほうが気が楽です。
$map.getAt()でやると、一ドット単位の修正が案外面倒くさいんで、私のような輩にはよろしくないです。
このやり方が効力を発揮するのは、RPGツクール製のゲームのように定まった単位(ツクールでは16ドット)でしか移動させない場合です。マップチップと キャラチップのサイズによってはよろしくないですが、基本的にはこのやり方だけで解決できてしまいます。
ただ、アクションゲーム系のような一ドット単位で動くものでは、場合によって$map.getAtを使ったほうが無難です。こちらは、$map.getの機能拡張版だと思いましょう。どこでもなんでも取得できる代わりに、めんどいです。
とはいえ、非常に便利な命令なのでガンガン活用しましょう!
ちなみに、オブジェクトの座標をマップ座標に変換するプログラムは以下。
 
マップ座標でのx座標=floor(x/$map.pwidth);
 マップ座標でのy座標=floor(y/$map.pheight);

05/01/10追記:上の考え方で問題ないんですけど、内部処理的にはgetat()すると、このマップ座標に変換されてからget()が実行される…ってわけで、本体はどちらもget()なわけです。

マップの取得による移動の可、不可の判定というのはアルゴリズムとしては簡単です。
ただ、私はこのシステムを完成させるのにずいぶんかかりましたが…(涙)
考え方としては、以下。
 1、十字キーで移動方向を指定
 2、もしも、その方向のマップが移動不可なら(注)動かない
 3、もしも、2でなければ(移動可能なマップならば)移動させる
注)これは、TDRCでの仕様です

この三ステップでマップの取得から移動への流れはつくられます。
とはいえ、今回は比較的簡単な(無駄の多い)プログラムでいくことにしましょう。考え方は以下。
 1、上下左右のマップを取得
 2、十字キーで移動方向を指定
 3、移動できないマップならば移動させない
 4、3でなければ(移動できるなら)移動させる
…あり、逆に手順が増えたぞ?^^;
とはいえ、プログラムとしては簡単になるんです。本当ですってば!!

function onUpdate() {
 //テストプログラム
 //現在のキャラクターのマップ座標を取得する

 マップ座標でのx座標=trunc(x/$map.pwidth);
 マップ座標でのy座標=trunc(y/$map.pheight);

 //実際にマップを取得する(1だと移動できない。0だと移動できる)
 
上に移動できない=$map.get(マップ座標でのx座標,マップ座標でのy座標-1)==移動できないマップ;
 右に移動できない=$map.get(マップ座標でのx座標+1,マップ座標でのy座標)==移動できないマップ;
 左に移動できない=$map.get(マップ座標でのx座標-1,マップ座標でのy座標)==移動できないマップ;
 下に移動できない=$map.get(マップ座標でのx座標,マップ座標でのy座標+1)==移動できないマップ;
}

while(1) {
 if (getkey(38) && !上に移動できない) y-=18;
 if (getkey(39) && !右に移動できない) y-=18;
 if (getkey(37) && !左に移動できない) y-=18;
 if (getkey(40) && !下に移動できない) y-=18;
 update();
}

サンプルはとりあえずページの一番下にリンクを張っておきました。少し古いです。。
マップを取得して移動できそうなら移動するっていうのはたったこれだけのプログラムで可能なんです。
では、プログラムを説明しましょう。

function onUpdate()というのはupdate()が呼ばれるたびに実行されるメソッドで
確実に実行したい場合に利用します。
ちなみに、乱用するとひどく実行速度が落ちますので気をつけましょう。
本来なら、この程度のことに使うのはお勧めできませんが、今回はサンプルということでいいことにしちゃいました♪

とりあえずキャラクターのマップ座標を取得します。その後、マップ座標を利用してマップを取得します。
このとき、$map.get()指定したマップ(==移動できないマップ)があると1になります。

ちなみに、何も特殊な1ではありません。
ただの半角英数字、つまりは数字の1です。で、指定したマップがないと0になります。

覚えておくといいことですが、0とnullは偽の値といいます。他の値は、マイナスだろうが文字列だろうが真の値です。で、偽の値というのは条件文において !変数名 で条件として正しいと通すことができるんです。
正の値はそのまま 変数名 です。==とかを一切使わずにいけるんですね。
時折、中級者以上のプログラムでwhile(ルール)とかif (cursor)とかがありますけど、あれは、値が真ならばという条件文なんです。逆に、while(!ルール)やif (!cursor)ならば値が偽ならばという条件文になります。

プログラムの説明に戻りますが、これを利用して十字キーの入力とその方向に移動不可マップがないかを条件にして移動させています。

このように、マップ移動は単純・簡単・基本ではありますが、理解するのはちょっと面倒かもしれません。
私は五年かけてモノにしたというアホですが、皆さんならばもっと速攻でこれを理解することができるでしょう。
…一応、弁解しますよ。
だって資料がないんですよ! 何も情報が無かった上に、がんばって一人でコツコツプログラムしたんやで!! こうやって自力で作り上げただけ大したもんだろ!!!(涙 掲示板で情報を下さった方々、ありがとうございましたm(_ _)m)

なお、サンプルはとりあえずごま太郎サンプルシリーズをどうぞ。少し古いサンプルなんで、この講座よりも不便かもしれませんが…。そこらへんは、TDRCの最新版と見比べながら、ネ^^;