カメラ移動の方法(質問掲示板

投稿:   1 mini 闇さん 投稿:2013/02/03 17:50:03(最新:2013/02/08 23:52:08)
Wikiとか掲示板とか見ましたが
何もかも分かりません

スクリプトのエラーが分からないとかではなく
根本的に何もかも分かりません

教えてください<(_ _)>

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Logo1 mini fmy(投稿日:2013/02/07 19:43, 履歴)
問題解決そのものになるかはわからないけれど一言。

浮動少数点の値、特に乗算や除算が行われた変数は
単純な判定式で完全にイコールになることは
ありえないと思った方がよいと思いますよ。

数学的に"1.0"になるはずなのにと思ってても
何故か"1.000000000125"なんてトンデモな値になったりはよくあるお話。

型宣言を不要とする言語の方が陥り易い罠かも?

「何故か」って所を説明できるようになれば
きっと一人前のプログラマーに一歩前進です。

もしかしたら発狂しそうになるくらい悩んでるかもしれないけど
Rmake内でも「浮動小数点」って単語はどこかで使われているね。
頑張って。
Logo1 mini fmy(投稿日:2013/02/07 19:47, 履歴)
matigaeta...

>移動が止まったあと画面プルップルするのが気になりますが

に対する返信でございます。
  1 mini 闇さん(投稿日:2013/02/07 21:17, 履歴)
何処かに少数点何位以下を切り捨てるようにすればいいって事ですか? 
とりあえずやってみます
  1 mini 闇さん(投稿日:2013/02/08 18:05, 履歴)
途中に切捨てを入れてみました
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
  X=floor(X*100)/100
  Y=floor(Y*100)/100
  moveCamera(true,X,Y)
 end
end

今度は揺れる速度が遅くなっただけで
次のスクリプトに進みません・・・・
Orichara01 2 700x700  mini ラジアン(投稿日:2013/02/08 19:12, 履歴)
上の例をまねますが、
計算上"1.05"にしたつもりでも浮動小数点では
"1.050000000012"や"1.049999999987"になったりします。(たぶん)

なので、後者の場合「切り捨て」を行うと"1.04"になって計算が合わなくなり、0.05を足したり引いたりを繰り返してカメラが揺れているんだと思いますよ。
  1 mini 闇さん(投稿日:2013/02/08 22:17, 履歴)
そんな・・・・
酷い・・・・酷すぎる・・・・・
俺は何も間違ってないのに!


で本当にどうすればいいですか?
完全に自分の許容範囲を越えました(震え声)
User icon mini 退会したユーザー(投稿日:2013/02/08 22:38, 履歴)
この範囲の誤差だと四捨五入すればなんとかなりそうな気はする
#適当にやってるので合ってる保障ありません
  X=floor(X*100+0.5)/100
  Y=floor(Y*100+0.5)/100


"1.050000000012"を小数点第3位で四捨五入 → 1.5
"1.049999999987"を小数点第3位で四捨五入 → 1.5
User icon mini 退会したユーザー(投稿日:2013/02/08 23:05, 履歴)
いっそ
if X==x && Y==y


if X>=x-0.5 && X<=x+0.5 && Y>=y-0.5 && Y<=y+0.5

にしてはどうだろう
User icon mini 退会したユーザー(投稿日:2013/02/08 23:06, 履歴)
0.5じゃなくて0.05でしたね
Logo1 mini fmy(投稿日:2013/02/08 23:27, 履歴)
なんか一気に伸びてるw
モテモテやなw

小数点とか言い出したのは自分だけど
関数getPlayerPosX()らで取得するのもピクセル単位で
関数moveCamera(true,X,Y)に与えるのもピクセル単位なら
整数の位が一致したら移動完了って事でいーんでね?

if floor(X)==floor(x) && floor(Y)==floor(y)

  1 mini 闇さん(投稿日:2013/02/08 23:30, 履歴)
takumi2310さんの案は駄目でした・・・
ファイターさんの案はプルップルは治りませんが次のスクリプトに移動したので一歩全身って感じです
User icon mini 退会したユーザー(投稿日:2013/02/08 23:34, 履歴)
いぇーいww前進したーww
User icon mini 退会したユーザー(投稿日:2013/02/08 23:36, 履歴)
あとはX>xを
X>x-0.05
にしたらどうだろう?
Logo1 mini fmy(投稿日:2013/02/08 23:37, 履歴)
遅かったーなんか負けた気がするーw
  1 mini 闇さん(投稿日:2013/02/08 23:38, 履歴)
fmyさんの案でも プルップルは治りませんね・・・
一応次のスクリプトに進みます

ファイター案よりはプルプルが抑えられますが
User icon mini 退会したユーザー(投稿日:2013/02/08 23:38, 履歴)
しかし、目標地点から0.05ぐらい離れたところになると思います
User icon mini 退会したユーザー(投稿日:2013/02/08 23:38, 履歴)
負けたーw
Orichara01 2 700x700  mini ラジアン(投稿日:2013/02/08 23:40, 履歴)
四捨五入の件ですが、終了条件の式の前に書きます。
そうしないと0.05単位で比べることが出来ません。
User icon mini 退会したユーザー(投稿日:2013/02/08 23:40, 履歴)
忘れてたけどYもXと同じように変更してください
  1 mini 闇さん(投稿日:2013/02/08 23:43, 履歴)
def moveCamera_yr(x,y)
 Q=0
 y=y*32
 x=x*32
 X=getPlayerPosX()
 Y=getPlayerPosY()
 while Q==0
  if X>x-0.05 
   X=X-0.05
  elsif X<x-0.05 
   X=X+0.05
  end
  if Y>y-0.05 
   Y=Y-0.05
  elsif Y<y-0.05 
   Y=Y+0.05
  end
  X=floor(X*100+0.5)/100
  Y=floor(Y*100+0.5)/100
  if floor(X)==floor(x) && floor(Y)==floor(y)
   Q=1
  end
  moveCamera(true,X,Y)
 end
end

皆さんの意見を踏まえて作ったスクリプトです
プルップルは完全に止まりましたが 
今度は次のスクリプトに進みません
User icon mini 退会したユーザー(投稿日:2013/02/08 23:46, 履歴)
四捨五入を使うなら僕のやつはいりませんよー。
あれは四捨五入を使わない場合の応急処置なんで
  1 mini 闇さん(投稿日:2013/02/08 23:49, 履歴)
def moveCamera_yr(x,y)
 Q=0
 y=y*32
 x=x*32
 X=getPlayerPosX()
 Y=getPlayerPosY()
 while Q==0
  if floor(X)>floor(x)
   X=X-0.05
  elsif floor(X)<floor(x) 
   X=X+0.05
  end
  if floor(Y)>floor(y)
   Y=Y-0.05
  elsif floor(Y)<floor(y)
   Y=Y+0.05
  end
  X=floor(X*100+0.5)/100
  Y=floor(Y*100+0.5)/100
  if floor(X)==floor(x) && floor(Y)==floor(y)
   Q=1
  end
  moveCamera(true,X,Y)
 end
end


これで何とかスムーズに進むようになりました
皆さんありがとうございます

あとはゆっくりカメラ戻しですね・・・・
  1 mini 闇さん(投稿日:2013/02/08 23:52, 履歴)
moveCamera_yr(getPlayerPosX()/32,getPlayerPosY()/32)

これでゆっくり戻ると思ったんですがね・・・・
  1 mini 闇さん(投稿日:2013/02/08 23:20, 履歴)
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

親のアドバイス通り小数の計算をやめたら悪化しました
一瞬で一番端に移動して動かないです
  1 mini 闇さん(投稿日:2013/02/06 17:49, 履歴)
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

移動スピード調整を捨てて見ました
今度はカメラが止まりません
  1 mini 闇さん(投稿日:2013/02/07 16:49, 履歴)
凡ミスでした
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

移動が止まったあと画面プルップルするのが気になりますが
多分ーと+を無限ループしていると思われます
これだと次に進まないのですが
  1 mini 闇さん(投稿日:2013/02/04 16:52, 履歴)
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

ファイターさんのコメントを参考に作ったのですがちゃんと作動しませんでした
Nyan mini rurun9(投稿日:2013/02/04 18:19, 履歴)
「ちゃんと作動」しているのかどうかは、何をどう作りたいのかを伝えてない限り誰にもワカラナイよ
前回のサイコロスクリプトも、数人のエスパーっぷりに助けられてるだけで、そもそも何つくってるのか謎だしw


とりあえず !X == x && !Y == y
という書き方が変なのは確実なので
X<x && Y<y に変更して
位置にsを加えた時に、移動先より行き過ぎないようにしておくのが良いのでは?
Cdv30200 aoi icon mini aoihikawa(投稿日:2013/02/04 18:19, 履歴)
while文の条件式が間違っています
  1 mini 闇さん(投稿日:2013/02/04 23:24, 履歴)
しまった 左に動かすとーになってしまう・・・・
という訳で もう少し修正が必要なようです
User icon mini 退会したユーザー(投稿日: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を増やす。
ということになっています。
説明が下手ですいません。