トップページ > 記事閲覧
浮動小数点値での座標移動
名前:ぽんず 日時: 2017/12/23 01:04

はじめまして、よろしくお願いします。 アクションゲームで整数でない移動量(1フレームに1.5px等)で座標移動を行いたく、 以下の方法を行ってみました。 座標の詳細値としてdouble型を持ち、それに移動量を加減算させ、描画時はそのdouble型の変数に 計算機イプシロンを加算し、小数部を切り捨てて整数にする。 上記以外思いつかないでいるのですが、この方法では右移動は良くても、 左移動(座標をマイナス方向へ移動)のとき、小数部を切り捨てる関係で、右移動時よりも多く座標移動 してしまいます。 例)移動量:1.5   座標10にいるとき、右移動では、10 + 1.5 = 11.5 描画時:11(+1の変化)            左移動では、10 - 1.5 = 8.5 描画時: 8(-2の変化) 移動方向によって、切り上げ・切り捨てを判断しようとも考えましたが、 移動しなかったときは切り上げ・切り捨てどちらをすべきか分からないことや、 詳細な座標が10.2だったとき、毎フレーム0.5の移動量で2フレーム左に移動したときに 10.2 - 0.5 - 0.5 = 9.2 となり、切り上げたとすると描画位置は変わらず10のままに なったりして、どうにも上手くいきません。 整数でない移動量のときの定石がありましたらお教えください。 よろしくお願いします。
メンテ

Page: 1 |

Re: 浮動小数点値での座標移動 ( No.1 )
名前:管理人 日時:2017/12/23 19:37

> 整数でない移動量のときの定石がありましたらお教えください。 定石はあるのかもしれませんが、私は知りません、すみません 切り上げ、切り捨てについてですが、四捨五入ではだめでしょうか? 9.0, 9.1, 9.2, 9.3, 9.4 → 四捨五入 →  9 9.5, 9.6, 9.7, 9.8, 9.9 → 四捨五入 → 10 あと、ドット表現が重要なソフト( ドットがくっきりはっきり表示されることが重要なソフト )ではないのでしたら、 DrawGraphF や DrawExtendGraphF など、引数が float になっている描画関数を使用するという方法もあります ( ドットが滲む形で小数点以下の座標が表現されます ) // バイリニア補間描画にしないと効果がありません SetDrawMode( DX_DRAWMODE_BILINEAR ) ; // 小数点以下の座標も考慮される描画 DrawGraphF( 9.5f, 9.5f, GraphHandle, TRUE ) ; あと、DrawGraphF などで小数点以下の値も含まれる座標を指定した場合は『乗算済みアルファ』の 画像ではない場合透過色の部分と非透過色の部分との境目が綺麗に表示されませんので、 もし DrawGraphF などで小数点以下の値も含まれる座標での描画を行う場合はこちらのページを ご覧になって『乗算済みアルファ』を使用した描画を行うようにしてください m(_ _)m <乗算済みアルファのすすめ> https://dxlib.xsrv.jp/lecture/PremulAlpha/PremulAlpha.html
メンテ
Re: 浮動小数点値での座標移動 ( No.2 )
名前:ぽんず(解決) 日時:2017/12/24 01:49

返信ありがとうございます。 四捨五入でも左右の移動で違いが出てしまいます。 例)移動量:1.5   座標10にいるとき、右移動では、10 + 1.5 = 11.5 描画時:12(+2の変化)            左移動では、10 - 1.5 = 8.5 描画時: 9(-1の変化) 解決方法が見つからないのでいったん保留にしようと思います。 一定間隔で左右の移動量が同一になるので、そこまで気にしなくてもよいのかもしれません。 ※移動量1.5なら2フレーム単位で左右で同じ累積移動量になる。 小数点以下の描画や、乗算済みアルファについてもありがとうございます。 今回はニアレストネイバーで描画する方針ですが、他の機会に活用できそうです。 ありがとうございました。
メンテ
Re: 浮動小数点値での座標移動 ( No.3 )
名前:Show(解決) 日時:2018/05/05 08:12

解決とされている様なので不要かとも思いましたが、ちょっと気になったので横槍を失礼します。 そういう場合移動量を四捨五入するものなのでは? 例)移動量:1.4 → 1   座標10にいるとき、右移動では、10 + 1 = 11 描画時:11(+1の変化)            左移動では、10 - 1 = 9 描画時: 9(-1の変化) 例)移動量:1.5 → 2   座標10にいるとき、右移動では、10 + 2 = 12 描画時:12(+2の変化)            左移動では、10 - 2 = 8 描画時: 8(-2の変化)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存