1

モバイルプラットフォームでアナログスティックをシミュレートしようとしています。

指の位置とスティックの半径に基づいて-1から1までの値を返すスティックベクトルを計算します。

public void calcStickVector(float x, float y)
{
    float cx = getCenterX();
    float cy = getCenterY();

    float distX = x - cx;
    float distY = y - cy;
    distX /= getRadius();
    distY /= getRadius();

    distX = JMath.clamp(-1.0f, 1.0f, distX);
    distY = JMath.clamp(-1.0f, 1.0f, distY);
    stickVector.x = distX;
    stickVector.y = distY;
}

public RectF getInnerStickRect()
{
    float r = getInnerRadius();
    float cx = getCenterX() + (getRadius() * getStickVector().x);
    float cy = getCenterY() + (getRadius() * getStickVector().y);

    innerStickRect.left = cx - r;
    innerStickRect.top = cy - r;
    innerStickRect.right = cx + r;
    innerStickRect.bottom = cy + r;

    return innerStickRect;
}

それはほとんど機能しますが、視覚的には、内側のスティックを動かすと、円を描くのではなく、正方形を形成しているように見えます。私のロジックに何か問題がありますか?

ありがとう

4

1 に答える 1

1

そのまま、1を角にした箱を作っています。半径で除算してクランプするのではなく、ベクトルを正規化する(xとyを距離で除算する)必要があります。

double dist = Math.sqrt(distX*distX) + (distY*distY));
distX /= dist;
distY /= dist;
于 2012-10-12T00:52:33.503 に答える