1

マウスの位置に対する画像自体の位置で画像を回転させるのに問題があります。画像を回転させるのではなく、画像をそれ自体のポイントを中心に回転させることしかできません。

下の画像は、私がやりたいことを示しています。

ここに画像の説明を入力してください

これは私のコードです:

Image sprite = Image.FromFile("1.png");
private Point spritePos;

public Enemy(Point Position)
{
    spritePos = Position;
}

public void Render(Graphics dc)
{
    dc.TranslateTransform(spritePos.X, spritePos.Y); //Sets rotation point

    float angle = CalcAngle(Cursor.Position);

    dc.RotateTransform(angle); //Rotates the graphics transform

    dc.DrawImage(sprite, spritePos);

    dc.TranslateTransform(-(spritePos.X), -(spritePos.Y));
}

private float CalcAngle(Point TargetPos)
{
    Point ZeroPoint = spritePos;
    if (TargetPos == ZeroPoint)
    {
        return 0;
    }

    double angle;
    double hypotenuse;

    //Calculates the hypotenuse using Phytagoras(a^2 + b^2 = c^2)
    hypotenuse = Math.Sqrt(                                      //hypotenuse = squared(c^2)
                           Math.Pow((TargetPos.Y), 2) + //a^2  +
                           Math.Pow((TargetPos.X), 2)); //        b^2

    angle = Math.Acos((TargetPos.X) / hypotenuse); //Calculates the angle in radians
    angle = angle * 180 / Math.PI;                          //Converts the radians to degree's

    //If the cursor's y position is negative('above' the player), the returned angle is also negative
    if (TargetPos.Y < 0)
    {
        return -(float)angle;
    }
    else
    {
        return (float)angle;
    }
}

正しい方向へのいくつかのポインタは感謝します:)

4

2 に答える 2

2

あなたは正しい基本的な考えを持っていますが、順序が間違っています。

まず、dcを0,0に変換する必要があります。次に回転してから、元の位置に戻します。

dc.TranslateTransform(-spritePos.X, -spritePos.Y); //Sets rotation point

float angle = CalcAngle(Cursor.Position);

dc.RotateTransform(angle); //Rotates the graphics transform

dc.DrawImage(sprite, spritePos);

dc.TranslateTransform((spritePos.X), (spritePos.Y));

現在、スプライトを原点から2倍離して配置し、回転させてから元の位置に戻しています。

于 2013-01-10T21:31:53.930 に答える
1

画像の中央に翻訳する必要があります:

dc.TranslateTransform(-spritePos.X / 2, -spritePos.Y / 2);
float angle = CalcAngle(Cursor.Position);

dc.RotateTransform(angle); //Rotates the graphics transform

dc.DrawImage(sprite, spritePos);

dc.TranslateTransform((spritePos.X / 2), (spritePos.Y / 2));
于 2014-03-29T18:42:43.227 に答える