C # DirectX происхождение спрайта - PullRequest
2 голосов
/ 02 августа 2010

У меня есть эта проблема, когда мой источник вращения Sprite зафиксирован в верхнем левом углу окна (то же самое с sprite.Draw и sprite.Draw2D ) В любом случае, если я изменю центр вращения, он все еще вверху слева. Мне нужно, чтобы спрайт вращался вокруг своей оси Z.

Edit: Я пробовал это:

    hereMatrix pm = Matrix.Translation(_playerPos.X + 8, _playerPos.Y + 8, 0);
    sprite.Transform = Matrix.RotationZ(_angle) * pm;
    sprite.Draw(playerTexture, textureSize, new Vector3(8, 8, 0), new Vector3(_playerPos.X, _playerPos.Y, 0), Color.White);

Но, похоже, он не работает хорошо ...

Ответы [ 2 ]

1 голос
/ 21 апреля 2013

У меня есть решение для вас, это простой метод, который вы можете использовать каждый раз, когда хотите нарисовать спрайт.С помощью этого метода вы сможете вращать спрайт с нужным вам центром вращения.

public void drawSprite(Sprite sprite, Texture texture, Point dimension, Point rotationCenter, float rotationAngle, Point position)
    {
        sprite.Begin(SpriteFlags.AlphaBlend);

        //First draw the sprite in position 0,0 and set your desired rotationCenter (dimension.X and dimension.Y represent the pixel dimension of the texture)
        sprite.Draw(texture, new Rectangle(0, 0, dimension.X, dimension.Y), new Vector3(rotationCenter.X, rotationCenter.Y, 0), new Vector3(0, 0, 0), Color.White);

        //Then rotate the sprite and then translate it in your desired position
        sprite.Transform = Matrix.RotationZ(rotationAngle) * Matrix.Translation(position.X, position.Y, 0);

        sprite.End();   
    }
1 голос
/ 09 августа 2010

Когда вы рисуете, это в правильном месте?

Я считаю, что порядок умножения обратный, и что вы не должны трансформироваться в соответствии с позицией игроков в трансформации.

// shift centre to (0,0)
sprite.Transform = Matrix.Translation(-textureSize.Width / 2, -textureSize.Height / 2, 0);

// rotate about (0,0)
sprite.Transform *= Matrix.RotationZ(_angle); 


sprite.Draw(playerTexture, textureSize, Vector3.Zero,
            new Vector3(_playerPos.X, _playerPos.Y, 0), Color.White);

Редактировать

Вы также можете использовать метод Matrix.Transformation, чтобы получить матрицу за один шаг.

...