「マップの取得」(2005/08/28 (日) 05:57:49) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<font size=
"2"> 「TDRCの講座やプログラムを見て、実際にマップ取得をどうやっているのかを謎に思う人は多いでしょう。<br>
かくいう私も、他人のプログラムは少しも見たくありません。<br>
<b>分かりづらいことこのうえない</b>!</font><font color=
"#000000" size="-1"><br>
いや、せっかく書いてもらったりして悪いんですが、<b>分からない</b>んですよ!!!!<br>
<br>
さて、そんな風に今日もグチを言うごま太郎ですが、とりあえずとっととマップの取得についてご説明しましょう。<br>
マップの取得とはどういうものか。のまえに、マップについて。<br>
マップのとは、<b>レイヤーの一つだと思え</b>ばいいでしょう。<br>
え、レイヤーが分からない? それでは、久しぶりに図説しましょう。<br>
<img src=
"http://www12.plala.or.jp/goma_goma_deth/tonyu/img/kouza_bangai5_rey.JPG"
border="0" height="300" width="300"><br>
書いてあるように、<b>レイヤーとはOHPシート</b>のようなものです。<br>
あの、下から光に当ててプレゼンテーションをするやつです。<br>
ちなみに、レイヤーと聞いてニヤリとしてしまった方。残念!!(ディープなので気にしないよう)<br>
<br>
あれ? 今日の趣旨ってマップの取得じゃ…^^;<br>
よし、話を戻そう。マップがなんたるかなんてのは今日の講座ではどうでもいいことなのだ。<br>
<br>
マップの取得には、<i>$map.get()</i>と<i>$map.getAt()</i>の二種類があります。<br>
この二つの違いは下にまとめました。<br>
$map.get()<br>
マップ座標(<a href=
"http://www12.plala.or.jp/goma_goma_deth/tonyu/kouza_bangai3.html">番外講座 MAPの概念</a>参照)でのみマップを取得できます<br>
<br>
$map.getAt()<br>
オブジェクト座標(<a href=
"http://www12.plala.or.jp/goma_goma_deth/tonyu/kouza_bangai1.html">番外講座 オブジェクトの座標</a>参照)でのみマップを取得できます<br>
<br>
さて、とどちらを使う方がいいのでしょうか? ここは一応RPGの製作を念頭に置いた講座をしています。<br>
そのため、RPGを作る側としては<b><i>$map.get()</i>のほうが気が楽</b>です。<br>
<i>$map.getAt()</i>でやると、一ドット単位の修正が案外面倒くさいんで、私のような輩にはよろしくないです。<br>
このやり方が効力を発揮するのは、RPGツクール製のゲームのように定まった単位(ツクールでは16ドット)でしか移動させない場合です。マップチップと
キャラチップのサイズによってはよろしくないですが、基本的にはこのやり方だけで解決できてしまいます。<br>
ただ、アクションゲーム系のような一ドット単位で動くものでは、場合によって<i>$map.getAt</i>を使ったほうが無難です。こちらは、<i>$map.get</i>の機能拡張版だと思いましょう。どこでもなんでも取得できる代わりに、めんどいです。<br>
とはいえ、非常に便利な命令なのでガンガン活用しましょう!<br>
ちなみに、オブジェクトの座標をマップ座標に変換するプログラムは以下。<br>
</font><font color="#990000" size=
"-1">マップ座標でのx座標=floor(x/$map.pwidth);<br>
マップ座標でのy座標=floor(y/$map.pheight);<br></font> <font color=
"#000000" size="-1"><br>
05/01/10追記:上の考え方で問題ないんですけど、内部処理的には<i>getat()</i>すると、このマップ座標に変換されてから<i>get()</i>が実行される…ってわけで、本体はどちらも<i>get()</i>なわけです。<br>
<br>
マップの取得による移動の可、不可の判定というのはアルゴリズムとしては簡単です。<br>
ただ、私はこのシステムを完成させるのにずいぶんかかりましたが…(涙)<br>
考え方としては、以下。<br>
1、十字キーで移動方向を指定<br>
2、もしも、その方向のマップが移動不可なら(注)動かない<br>
3、もしも、2でなければ(移動可能なマップならば)移動させる<br>
注)これは、TDRCでの仕様です<br>
<br>
この三ステップでマップの取得から移動への流れはつくられます。<br>
とはいえ、今回は比較的簡単な(無駄の多い)プログラムでいくことにしましょう。考え方は以下。<br>
1、上下左右のマップを取得<br>
2、十字キーで移動方向を指定<br>
3、移動できないマップならば移動させない<br>
4、3でなければ(移動できるなら)移動させる<br>
…あり、逆に手順が増えたぞ?^^;<br>
とはいえ、プログラムとしては簡単になるんです。本当ですってば!!<br>
</font> <font color="#990000" size="-1"><br>
function onUpdate() {<br>
//テストプログラム<br>
//現在のキャラクターのマップ座標を取得する</font><font color="#000000"
size="-1"><br>
<font color="#990000"> マップ座標でのx座標=trunc(x/$map.pwidth);<br>
マップ座標でのy座標=trunc(y/$map.pheight);<br>
<br>
//実際にマップを取得する(1だと移動できない。0だと移動できる)<br>
</font> </font><font color="#990000" size=
"-1">上に移動できない=$map.get(マップ座標でのx座標,マップ座標でのy座標-1)==移動できないマップ;<br>
右に移動できない=$map.get(マップ座標でのx座標+1,マップ座標でのy座標)==移動できないマップ;<br>
左に移動できない=$map.get(マップ座標でのx座標-1,マップ座標でのy座標)==移動できないマップ;<br>
下に移動できない=$map.get(マップ座標でのx座標,マップ座標でのy座標+1)==移動できないマップ;<br>
}<br>
<br>
while(1) {<br>
if (getkey(38) && !上に移動できない) y-=18;<br>
if (getkey(39) && !右に移動できない) y-=18;<br>
if (getkey(37) && !左に移動できない) y-=18;<br>
if (getkey(40) && !下に移動できない) y-=18;<br>
update();<br>
}<br>
<br>
<font color=
"#000000">サンプルはとりあえずページの一番下にリンクを張っておきました。少し古いです。。<br>
マップを取得して移動できそうなら移動するっていうのはたったこれだけのプログラムで可能なんです。<br>
では、プログラムを説明しましょう。<br>
<br>
<i>function
onUpdate()</i>というのは<i>update()</i>が呼ばれるたびに実行されるメソッドで</font></font><font color="#000000"
size="-1">確実に実行したい場合に利用します。<br>
ちなみに、乱用するとひどく実行速度が落ちますので気をつけましょう。<br>
本来なら、この程度のことに使うのはお勧めできませんが、今回はサンプルということでいいことにしちゃいました♪<br>
<br>
とりあえずキャラクターのマップ座標を取得します。その後、マップ座標を利用してマップを取得します。<br>
このとき、<i>$map.get()</i>は<b>指定したマップ(==移動できないマップ)があると1</b>になります。<br>
<img src=
"http://www12.plala.or.jp/goma_goma_deth/tonyu/img/kouza_bangai5_born_1.JPG"
border="0" height="300" width="300"><br>
ちなみに、何も特殊な1ではありません。<br>
ただの半角英数字、つまりは数字の1です。で、<b>指定したマップがないと0</b>になります。<br>
<br>
覚えておくといいことですが、0とnullは<b>偽の値</b>といいます。他の値は、マイナスだろうが文字列だろうが<b>真の値</b>です。で、偽の値というのは条件文において !変数名 で条件として正しいと通すことができるんです。<br>
正の値はそのまま 変数名 です。==とかを一切使わずにいけるんですね。<br>
時折、中級者以上のプログラムでwhile(ルール)とかif
(cursor)とかがありますけど、あれは、<b>値が真ならばという条件文</b>なんです。逆に、while(!ルール)やif
(!cursor)ならば<b>値が偽ならばという条件文</b>になります。<br>
<br>
プログラムの説明に戻りますが、これを利用して十字キーの入力とその方向に移動不可マップが<b>ないか</b>を条件にして移動させています。<br>
<br>
このように、マップ移動は単純・簡単・基本ではありますが、理解するのはちょっと面倒かもしれません。<br>
私は五年かけてモノにしたというアホですが、皆さんならばもっと速攻でこれを理解することができるでしょう。<br>
…一応、弁解しますよ。<br>
だって資料がないんですよ! 何も情報が無かった上に、がんばって一人でコツコツプログラムしたんやで!! こうやって自力で作り上げただけ大したもんだろ!!!(涙 掲示板で情報を下さった方々、ありがとうございましたm(_
_)m)<br>
<br>
なお、サンプルはとりあえず<a href=
"http://gomatarou.hp.infoseek.co.jp/out/32x32_map.zip">ごま太郎サンプルシリーズ</a>をどうぞ。少し古いサンプルなんで、この講座よりも不便かもしれませんが…。そこらへんは、TDRCの最新版と見比べながら、ネ^^;</font>
表示オプション
横に並べて表示:
変化行の前後のみ表示: