2

コード:

次のような機能があります。

bool Action::approach (img_comp &mover, sf::Vector2f start, sf::Vector2f end, int speed)
{
    //Get the change in x and y
    float delta_x = (end.x - start.x) / speed;
    float delta_y = (end.y - start.y) / speed;

    //Move the sprite
    mover.sprite.move(delta_x, delta_y);

    //Check if the sprite has met the end
    if (mover.sprite.getPosition() == end)
        return true;

    return false;
}

(基本的には、float パラメーターsf::Vector2fを持つ構造体です。たとえば、xy グリッド上のポイント)xy

質問:

当然のことながら、この関数は、 の丸めにより、終点を通過した後に true を返さない可能性がありfloatます。end丸めに関係なく、スプライトを正確にポイントに着陸させるために、このシナリオでどのアルゴリズムを使用しますか?

注: 許容範囲は私の質問に対する回答ではありません。それは単なる妥協です。丸めに関係なく、最初から完全にポイントを選択するアルゴリズムが必要です。これが不可能な場合は、お知らせください。

4

3 に答える 3

2

丸めはfloatすべきではありませんが、ある数値よりも小さいmover.sprite.getPosition() == endかどうかを確認するために、あなたはすでに答えを持っていると思います。mover.sprite.getPosition() - end

 float diff = mover.sprite.getPosition() - end;

 if (diff < 0)
    diff *= -1;

 //Check if the sprite has met the end
 if (diff > 0.01)
        return true;

そうすれば、その場にいるかどうかではなく、その場に十分近いかどうかを確認できます。あなたもできることを改善するために:

 float diff = mover.sprite.getPosition() - end;

 if (diff < 0)
    diff *= -1;

 //Check if the sprite has met the end
 if (diff > 0.01){
        mover.sprite.getPosition() = end; //this might not be the exact syntax but the idea is clear i hope
        return true;
 }
于 2013-07-28T08:49:51.490 に答える
2

直接比較する代わりに、「ポイントが終了に近い場合、ポイント = 終了」のようなことができます。

/* Set TOLERANCE to whatever makes sense.
 * Could have different X and Y values too...
 */
#define TOLERANCE 0.01
sf::Vector2f &newPos = mover.sprite.getPoition();
if (abs(newPos[0] - end[0]) < TOLERANCE &&
    abs(newPos[1] - end[1]) < TOLERANCE) {
{
    mover.sprite.setPosition(end);
    result = true;
}
于 2013-07-28T08:51:07.340 に答える
2

スプライトは左または右に移動できるため、現在の位置と終点の絶対差を使用することを検討する必要があります。

Epsilon = 1e-9

deltaX = (end.x - start.x) / speed
deltaY = (end.y - start.y) / speed

dirX = Math.sgn(deltaX)
dirY = Math.sgn(deltaY)

mover.sprite.move(deltaX, deltaY);

crossedEndX = dirX * (mover.sprite.getPosition().x - end.x) > Epsilon
crossedEndY = dirY * (mover.sprite.getPosition().y - end.y) > Epsilon

if(crossedEndX && crossedEndY)
  return true
于 2013-07-28T09:02:36.663 に答える