HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1009
猫素敵目的の角度に進む方法5未解決


猫素敵

リンク

2006/10/9(Mon) 01:07:17|NO.2895

お願いします。
初期のドラクエみたいなマップで、
キャラAとBが異なった場所にいて
AをBのキャラの方向に移動させ、Bを通り過ぎても同じ一定の角度(移動量)で
進ませ続けるにはどうしたらいいんですか?
ドラクエみたいに四方向しか動けません。
AとBが真横か真縦にいるなら簡単なんですが、斜め横にいると
XとYの移動量の計算がわかりません。



この記事に返信する


男性A

リンク

2006/10/9(Mon) 14:16:34|NO.2901

勘違いしてたらごめんなさい

■■■■■■
■■■☆■■
■■■■■■
■■■■■■
■○■■■■
■■■■■■

○を自機、☆を目的地としたときにこの場合、☆までは右に
2、上に3移動します。その後は上に3移動する間に何処か
で2回右に進むようにする。というのはだめですか?



猫素敵

リンク

2006/10/9(Mon) 14:53:54|NO.2903

ありがとうございます。
やりたいことはその通りです。
右に2上に3の移動の仕方を、例えば 右上上 右上上 右上上
みたいに、ずっと規則的に斜めに移動しているように見せたいです。
そのX,Yの移動量を求める式がわかりません。



男性A

リンク

2006/10/9(Mon) 15:13:23|NO.2904

自機の座標を(X1,Y1)、目的地の座標を(X2,Y2)とおくと
X2ーX1=左右の移動量(右を正とする)
Y2ーY1=上下の移動量(上を正とする)
で求められますよ



ぷほ

リンク

2006/10/9(Mon) 15:20:23|NO.2905

理屈を考えてみました。

まず、線分の方程式を考えて見ます。
起点、終点の座標を、それぞれSX,SY、EX,EYとすると、

y-SY=( (EY-SY)/(EX-SX) )*(x-SX)
この時、SX=EXの場合、垂直な線とする

です。

これをいわゆる「y=Ax+B」の式に直には、

Aは (EY-SY)/(EX-SX)
Bは (SY-A*SX)

です。

ここまで計算式が出来れば、x座標を決めてやればy座標がわかります。

上のA,Bを計算して、xを指定すれば、

Y=X*A+B

の式で、Y座標がでます。

ここまで計算できたら、X座標を移動させる度に、目的のY座標が分かりますから、
そのY座標を目標に移動させればよいのではないかと思います。



Drip

リンク

2006/10/9(Mon) 17:15:31|NO.2907

Dripです。

 猫素敵さん、こんにちは。
「目的地点まで上下左右のみの移動で、もっとも合理的に移動しているように見える」移動は、
目的地までのX,Y位置が半端だったりすると、フレーム毎の移動量が変化してしまい、計算式が複雑そうに思えますね。
しかし難しく考えることはありません。
 三角関数を応用し、スタート地点から目的地まで“直線移動”するまでに行われた移動を
整数で取得し、その結果から1フレーム毎の移動方向のログを収集することで実現可能です。

 このプログラムを理解するためには三角関数とpeek,pokeによるメモリ操作の知識が必要になります。
以下に目的地点まで上下左右のみの移動で、もっとも合理的に移動しているように見えるサンプルを示します。

#define size 16 px=30 //プレイヤーの位置 py=18 ex=3 //移動先の座標 ey=8 sdim log,6400 //この変数に移動方向のログを1byte単位で取る。 mtan=atan(ex-px,ey-py) //向かうべき直線角度を求める ax=double(px) //ロボットの位置X ay=double(py) //ロボットの位置Y repeat 3200 //ロボットを一直線に目的地へ向かわせ、その移動履歴を収集する。 tmpx=int(ax+0.5) tmpy=int(ay+0.5) if tmpx=ex & tmpy=ey:break //目的地に到着したのでログ収集を終了する。 ax+=sin(mtan) ay+=cos(mtan) if tmpx-(ax+0.5)=-1:poke log,strlen(log),3 //履歴を書き込む if tmpx-(ax+0.5)=1:poke log,strlen(log),1 if tmpy-(ay+0.5)=-1:poke log,strlen(log),4 if tmpy-(ay+0.5)=1:poke log,strlen(log),2 loop repeat //移動履歴を参考にプレイヤーを目的地まで移動させる。 redraw 0 color 255,255,255:boxf color 200,200,200 repeat ginfo_winx/size:tmpx=cnt line cnt*size,0,cnt*size,ginfo_winy loop repeat ginfo_winy/size:tmpy=cnt line 0,cnt*size,ginfo_winx,cnt*size loop pos px*size,py*size:color 255:mes "●" pos ex*size,ey*size:color ,255:mes "●" if cnt<strlen(log):{ switch peek(log,cnt) //ここで履歴情報を参考に移動させている。 case 1:px--:swbreak case 2:py--:swbreak case 3:px++:swbreak case 4:py++:swbreak swend } redraw 1 await 100 loop
 多少複雑ですが、わからない部分も焦らずじっくり考えて理解していってください。
googleやHSP掲示板過去ログもかなり役に立つと思います。



ONION software Copyright 1997-2023(c) All rights reserved.