まず、グリッドにスナップすることはかなり簡単ですが、この状況では奇妙な問題に遭遇してしまい、数学が弱すぎて具体的に何が間違っているのか分かりません。グリッドコードにスナップすると何が問題になりますか?
ここでYは離れて正確にY_STEPステップと、私は、グリッドの抽象的な概念を持っている状況
(Xステップが正常に動作しているので、今のためにそれらを無視する)
グリッド座標抽象的でありますスペース、およびのは、私は、次のコード(パイソン)
def snapToGrid(originalPos, offset, step):
index = int((originalPos - offset)/step) #truncates the remainder away
return index * gap + offset
を持ってグリッドにスナップY_OFFSET
それを呼びましょう、物事は私がそこにオフセット魔法を持って並ぶように取得します
なので、カーソル位置Y_OFFSETとY_STEPをその関数に渡して、グリッド上の最も近いflooring y位置を返します。
これは、元のシナリオでうまくいくように見えますが、ビューはスクロール可能なものは少し奇妙になる。
私はそれを得ることができる基本的なスクロールは、私はY軸に沿ってスクロールされた距離のカウントを保持し、それを通過するすべてのビューポートを持っている。
ここでは、カーソルのmouseMotionコードの抜粋です:だから、そこを見て二つのものがあります
def mouseMotion(self, event):
pixelPos = event.pos[Y]
odePos = Scroll.pixelPosToOdePos(pixelPos)
self.tool.positionChanged(odePos)
ピクセル位置から抽象への最初のスクロールモジュールの変換座標空間、とり、ツールのPositionChangedの機能抽象座標空間値を返し、最も近いYステップにスナップします。
はここでは関係スクロールコード
def pixelPosToOdePos(pixelPos):
offsetPixelPos = pixelPos - self.viewPortOffset
return pixelsToOde(offsetPixelPos)
def pixelsToOde(pixels):
return float(pixels)/float(pixels_in_an_ode_unit)
およびツールの更新コード
def positionChanged(self, newPos):
self.snappedPos = snapToGrid(originalPos, Y_OFFSET, Y_STEP)
ツールは、自分自身をレンダリングするために行くとき、最後の関連チャンクがあるのです。それはのは、画面上のピクセル位置に空間位置座標スナップツールを変換スクロールオブジェクトを通過し、ここでのコードは次のとおりです。長い説明した
#in Tool
def render(self, screen):
Scroll.render(screen, self.image, self.snappedPos)
#in Scroll
def render(self, screen, image, odePos):
pixelPos = self.odePosToPixelPos(odePos)
screen.blit(image, pixelPos) # screen is a surface from pygame for the curious
def odePosToPixelPos(self.odePos):
offsetPos = odePos + self.viewPortOffset
return odeToPixels(offsetPos)
def odeToPixels(odeUnits):
return int(odeUnits * pixels_in_an_ode_unit)
やれやれ、。あなたはまだ私と一緒にいたいと思っています...
私が今得ている問題は、上にスクロールすると、描かれた画像がカーソルとの位置合わせを失うことです。
カーソルの1ステップ下のYステップへのスナップを開始します。 また、アライメントのフェーズイン・フェースのように見えます。
いくつかのスクロールでは、1が出てスクロールします。
これは決して1以上のものではなく、常に有効なグリッド位置にスナップしています。
私はどこかで間違った場所でデータを切り捨てていますが、どこでどのように動作するのかはわかりません。
座標空間、スクロール、スナップに詳しい方はいらっしゃいますか?
あなたの質問にお答えいただきありがとうございました – mmcdole
喜んでそれを修正しました。ちょうど、ちょうどあなたが更新するたびに新しい投稿を作成する必要はありません、あなたは元の質問を編集することができます。 –