XNA Rotate Vector2 вокруг начала координат - PullRequest
0 голосов
/ 05 мая 2020

Я потратил около 5 часов, пытаясь заставить эту вращающуюся штуку работать. Совершенно уверен, что я изучил все связанные темы о stackoverflow, но я не могу понять этого, ну, я могу, мой код просто не работает.

Я делаю это приложение MonoGame и хочу чтобы повернуть этот спрайт вместе с прямоугольником, который он использует для столкновения, вокруг центра указанного спрайта. Я следил за учебником по T, и его прямоугольник, кажется, вращается правильно, а мой - нет, у кого-нибудь есть идеи, как исправить? Я пойду спать после того, как опубликую это, потому что сейчас 10 утра, спасибо.

public Item(Texture2D inTex) {
    texture = inTex;
    position = new Vector2(400, 400);
    int scaledWidth = (int)(texture.Width * SCALEFACTOR);
    int scaledHeight = (int)(texture.Height * SCALEFACTOR);
    rectangle = new Rectangle((int) position.X, (int) position.Y, scaledWidth, scaledHeight);
    Origin = new Vector2(scaledWidth / 2, scaledHeight / 2);
    UpdateTransformMatrix();
}

Мой конструктор предметов, я делаю что-то вроде системы инвентаря, и мне нужно перетаскивать предметы. *

public virtual void Draw(SpriteBatch spriteBatch) {
    spriteBatch.Draw(texture, position, null, Color.White, rot, Origin, SCALEFACTOR, SpriteEffects.None, 0f);
}
public virtual void Update(GameTime gameTime, MouseState _currState, MouseState _prevState, ref Item controlItem) {
    ClickCheck(_currState, _prevState, ref controlItem);
    if (controlItem == this) {
        int diffX = _currState.X - _prevState.X;
        int diffY = _currState.Y - _prevState.Y;
        position.X += diffX;
        position.Y += diffY;
        rectangle.X = (int) position.X;
        rectangle.Y = (int) position.Y;
        UpdateTransformMatrix();
    }
}
private void RotateItem(float rotation) {
    rot += rotation;
    Vector2 tl = Vector2.Transform(Vector2.Zero, transform);
    Vector2 tr = Vector2.Transform(new Vector2(scaledWidth, 0), transform);
    Vector2 bl = Vector2.Transform(new Vector2(0, scaledHeight), transform);
    Vector2 br = Vector2.Transform(new Vector2(scaledWidth, scaledHeight), transform);

    Vector2 min = new Vector2(FindSmallest(tl.X, tr.X, bl.X, br.X), FindSmallest(tl.Y, tr.Y, bl.Y, br.Y));
    Vector2 max = new Vector2(FindBiggest(tl.X, tr.X, bl.X, br.X), FindBiggest(tl.Y, tr.Y, bl.Y, br.Y));

    rectangle = new Rectangle((int) min.X, (int) min.Y, (int)(max.X - min.X), (int)(max.Y - min.Y));

}

private void UpdateTransformMatrix() {
    transform = Matrix.CreateTranslation(new Vector3( - Origin, 0)) * Matrix.CreateRotationZ(rot) * Matrix.CreateTranslation(new Vector3(position, 0));
}

Любая помощь приветствуется, я выдергиваю волосы, гадая, что я сделал не так. Вот короткая гифка, показывающая, как мой прямоугольник ломается. https://gyazo.com/10bf61d4c8e18babf6e4be8a2ebc0c95

...