カメラ移動の方法(質問掲示板)
投稿: 闇さん
投稿:2013/02/03 17:50:03(最新:2013/02/08 23:52:08)
Wikiとか掲示板とか見ましたが
何もかも分かりません
スクリプトのエラーが分からないとかではなく
根本的に何もかも分かりません
教えてください<(_ _)>
ツイート
何もかも分かりません
スクリプトのエラーが分からないとかではなく
根本的に何もかも分かりません
教えてください<(_ _)>
コメントする
コメントするには、ログインする必要があります。
コメント一覧
def moveCamera_yr(x,y) Q=0 y=y*32*100 x=x*32*100 X=getPlayerPosX()*100 Y=getPlayerPosY()*100 while Q==0 if X>x X=X-5 elsif X<x X=X+5 else end if Y>y Y=Y-5 elsif Y<y Y=Y+5 else end if X==x && Y==y Q=1 end X=X/100 Y=Y/100 moveCamera(true,X,Y) end end
親のアドバイス通り小数の計算をやめたら悪化しました
一瞬で一番端に移動して動かないです
def moveCamera_yr(x,y) Q=0 X=getPlayerPosX() Y=getPlayerPosY() while Q==0 if X>x X=X-0.05 elsif X<x X=X+0.05 end if Y>y Y=Y-0.05 elsif Y<y Y=Y+0.05 end if X==x && Y==y Q=1 end moveCamera(true,X,Y) end end
移動スピード調整を捨てて見ました
今度はカメラが止まりません
凡ミスでした
移動が止まったあと画面プルップルするのが気になりますが
多分ーと+を無限ループしていると思われます
これだと次に進まないのですが
def moveCamera_yr(x,y) Q=0 y=y*32 x=x*32 X=getPlayerPosX() Y=getPlayerPosY() while Q==0 if X>x X=X-0.05 elsif X<x X=X+0.05 else end if Y>y Y=Y-0.05 elsif Y<y Y=Y+0.05 else end if X==x && Y==y Q=1 end moveCamera(true,X,Y) end end
移動が止まったあと画面プルップルするのが気になりますが
多分ーと+を無限ループしていると思われます
これだと次に進まないのですが
def moveCamera_yr(s,x,y) #s=移動速度x=移動先のX座標y=移動先のY座標 X=getPlayerPosX() Y=getPlayerPosY() while !X == x && !Y == y #指定した座標に付くまで移動 X=X+s Y=Y+s moveCamera(true,X,Y) end end
ファイターさんのコメントを参考に作ったのですがちゃんと作動しませんでした
「ちゃんと作動」しているのかどうかは、何をどう作りたいのかを伝えてない限り誰にもワカラナイよ
前回のサイコロスクリプトも、数人のエスパーっぷりに助けられてるだけで、そもそも何つくってるのか謎だしw
とりあえず !X == x && !Y == y
という書き方が変なのは確実なので
X<x && Y<y に変更して
位置にsを加えた時に、移動先より行き過ぎないようにしておくのが良いのでは?
前回のサイコロスクリプトも、数人のエスパーっぷりに助けられてるだけで、そもそも何つくってるのか謎だしw
とりあえず !X == x && !Y == y
という書き方が変なのは確実なので
X<x && Y<y に変更して
位置にsを加えた時に、移動先より行き過ぎないようにしておくのが良いのでは?
退会したユーザー(投稿日:2013/02/03 21:42,
履歴)
movecamera(a,b,c)
aにはtrueかfalse、
bにはX座標、
cにはY座標が入ります。
trueの場合はb,cの座標にカメラが移動するという事です。
a = getPlayerPosY() speak("カメラが下方向に移動します") while a < getPlayerPosY() + 32 * 15 moveCamera(true, getPlayerPosX(), a) #aの値を少しずつ増加させます a = a + 0.05 end
このスクリプトを使って説明します。
まず、aにキャラクタのY座標を代入します
そしてwhile文。
aが画面の端っこに行くまで繰り返すという意味です。
そしてmovecamera関数。
さっき説明した通りです。
最後にaを増やす。
ということになっています。
説明が下手ですいません。
浮動少数点の値、特に乗算や除算が行われた変数は
単純な判定式で完全にイコールになることは
ありえないと思った方がよいと思いますよ。
数学的に"1.0"になるはずなのにと思ってても
何故か"1.000000000125"なんてトンデモな値になったりはよくあるお話。
型宣言を不要とする言語の方が陥り易い罠かも?
「何故か」って所を説明できるようになれば
きっと一人前のプログラマーに一歩前進です。
もしかしたら発狂しそうになるくらい悩んでるかもしれないけど
Rmake内でも「浮動小数点」って単語はどこかで使われているね。
頑張って。
>移動が止まったあと画面プルップルするのが気になりますが
に対する返信でございます。
とりあえずやってみます
今度は揺れる速度が遅くなっただけで
次のスクリプトに進みません・・・・
計算上"1.05"にしたつもりでも浮動小数点では
"1.050000000012"や"1.049999999987"になったりします。(たぶん)
なので、後者の場合「切り捨て」を行うと"1.04"になって計算が合わなくなり、0.05を足したり引いたりを繰り返してカメラが揺れているんだと思いますよ。
酷い・・・・酷すぎる・・・・・
俺は何も間違ってないのに!
で本当にどうすればいいですか?
完全に自分の許容範囲を越えました(震え声)
"1.050000000012"を小数点第3位で四捨五入 → 1.5
"1.049999999987"を小数点第3位で四捨五入 → 1.5
を
にしてはどうだろう
モテモテやなw
小数点とか言い出したのは自分だけど
関数getPlayerPosX()らで取得するのもピクセル単位で
関数moveCamera(true,X,Y)に与えるのもピクセル単位なら
整数の位が一致したら移動完了って事でいーんでね?
ファイターさんの案はプルップルは治りませんが次のスクリプトに移動したので一歩全身って感じです
X>x-0.05
にしたらどうだろう?
一応次のスクリプトに進みます
ファイター案よりはプルプルが抑えられますが
そうしないと0.05単位で比べることが出来ません。
皆さんの意見を踏まえて作ったスクリプトです
プルップルは完全に止まりましたが
今度は次のスクリプトに進みません
あれは四捨五入を使わない場合の応急処置なんで
これで何とかスムーズに進むようになりました
皆さんありがとうございます
あとはゆっくりカメラ戻しですね・・・・
これでゆっくり戻ると思ったんですがね・・・・