指定した座標にあるオブジェクトが何か判断するには?
投稿者 : no_name(p7083-ipbf612marunouchi.tokyo.ocn.ne.jp)
- 2006/08/22(Tue) 21:48
No.10244
|
|
|
|
|
現在、不思議なダンジョンっぽいゲームを作成中なのですが、 プレイヤーとなるオブジェクトの直ぐ隣のマスに 敵オブジェクトがいるかどうか、等を調べたいと思ったとき、 指定した座標にあるオブジェクトが何なのかを調べる命令はありますでしょうか? ($map.getAtのような感じのものがありますでしょうか?)
なかったとしたら、(for xx in $chars)でまわして、オブジェクトの座標を調べていき、指定した座標と一致するか判断する、 といった方法くらいしかないでしょうか?
|
Re: 指定した座標にあるオブジェクトが何か判断するには?
投稿者 : 大月(240.229.192.61.east.flets.alpha-net.ne.jp)
- 2006/08/22(Tue) 23:45
No.10246
|
|
|
|
(とりあえずご自分の名前くらいは考えた方が良いのでは?)
指定座標上(もしくは付近)に存在するオブジェクトを判別。つまりやりたいことはアクションゲーム等でのオブジェクト同士の接触判定と同じですから、for in ループで一つ一つ調べていく方法しかないと思います。 for in のループの中で、crashTo()をする前の段階で、目当てと違う種類(敵、アイテム、エフェクト等)のオブジェクトをふるい落とすような書き方をすると、ある程度オブジェクトが増えてもゲーム速度を落とさずに処理できるような気がしてます。
|
Re: 指定した座標にあるオブジェクトが何か判断するには?
投稿者 : ごま太郎(i60-47-196-9.s02.a002.ap.plala.or.jp)
- 2006/08/23(Wed) 00:03
No.10247
|
|
|
|
私の使っている方法の場合です。 まず、ローグライクの場合、一定のマス単位で動くのが一般的です。たとえば、32×32のマスなど。トルネコの大冒険を見ても、歩行は一ドット単位(?)でスムーズでも、結局、動く距離はマップチップ分のサイズなことが分かります。
で、それを利用してキャラクター同士の当たり判定をするとかなり楽です。以下、キャラクターの動く距離はマップチップサイズと同じと仮定します。 まず、キャラクターの座標をマップ座標(マップ座標についてはttp://www4.atwiki.jp/gomatarou/pages/20.htmlを参照)に変換します。この座標は、$map.getで取得できるものと同じタイプのものです。小数はなく、x、y座標共に0からスタートします。 変換式は、 posX=floor(x/$map.pwidth); posY=floor(y/$map.pheight); です。posXとposYがマップ座標に変換されたキャラクターの座標です。 んで、これを二次元座標に挿入。具体的には、キャラクターの座標を管理する二次元配列AChar(サイズは$map.width*$map.height)を用意します。 そして、AChar.set(posX,posY,1);とします。これで、二次元配列に自分のいる座標が登録されました。 ちなみに、設定していない二次元配列の値はnullです。
同じように、敵だのなんだのも二次元配列ACharに登録します。
さて、この二次元配列ACharを調べる時、座標はマップ座標が使われています。なわけで、$map.get()と同じように、AChar.get(調べたいX座標,調べたいY座標)で簡単にその座標にキャラクターがいるかどうかを調べられます。
あとは、調べたい時に上のやり方で調べればいいです。たとえば、左に移動したいとき、 if (!AChar.get(posX-1,posY)) {移動処理} とすればいいわけです。nullが返ってくれば隣にキャラクターがいないので移動できます。 自分のキャラクターが移動するときには、この配列の情報を更新しなくてはいけませんが…そこらへんはまず試行錯誤しながらどうぞ。
なお、ドット単位の移動をする場合にはこの方法はまったく通用しません。アクションゲームと同じように、現在の座標に移動量を加えた値で当たり判定をしてキャラクターがいるかどうかを処理する必要があります。 どうしても必要な場合以外、tonyuでは頻繁に行う処理で反復回数の多いfor文は決して利用しないほうがいいです。激重くなります^^;
ではでは、長文失礼しましたm(_ _)m 参考になりませんでしたら、てきとーにスルーしてください。
参考として、以下のページをどうぞ。 ttp://www4.atwiki.jp/gomatarou/pages/11.html ttp://www12.plala.or.jp/goma_goma_deth/tonyu/dl.html 全てのURLは先頭にhをつけてください(CGIエラーが出るのでURLは張れません)。
|
Re: 指定した座標にあるオブジェクトが何か判断するには?
投稿者 : tomo(p7083-ipbf612marunouchi.tokyo.ocn.ne.jp)
- 2006/08/23(Wed) 01:47
No.10251
|
|
|
|
返信どうもありがとうございます。 そして、名前を書かないという失礼な行為をしてしまい申し訳ありませんでした。
大月様、ごま太郎様、どちらのアドバイスも大変参考になりました。 今後、敵の数やマップの広さなどを考慮し、for文の重さを実感してみながら、実装方法を試行錯誤していきたいと思います。
|
Re: 指定した座標にあるオブジェクトが何か判断するには?
投稿者 : 大月(240.229.192.61.east.flets.alpha-net.ne.jp)
- 2006/08/23(Wed) 15:12
No.10252
|
|
|
|
おー。ごま太郎さんのやり方なかなか面白そうですね。 あらかじめ各キャラクターが自分のいるマップ座標の位置を申告しておくのはドット単位で移動するアクション系のゲームでも何かと役に立ちそうですよ。 地形との接触判定なんかはもともとマップチップ単位でやってますしね。
ちょうどいま、ドアを開けるための踏みスイッチを作ろうとしてるところなんで、判定精度をマップチップサイズに限定してこの方式で作ればかなり軽く分かりやすいものが作れそうです。
私からもありがとうございます〜。
|
|