мышь, выбирающая вращающийся спрайт в игре Xna - PullRequest
2 голосов
/ 17 февраля 2012

Я работаю над простой игрой, в которой вы нажимаете на квадратных спрайтов, прежде чем они исчезнут. Я решил стать фантазером и заставить квадраты вращаться. Теперь, когда я нажимаю на квадраты, они не всегда реагируют на щелчок. Я думаю, что мне нужно повернуть позицию щелчка вокруг центра прямоугольника (квадрата), но я не уверен, как это сделать. Вот мой код для щелчка мышью:

    if ((mouse.LeftButton == ButtonState.Pressed) &&
    (currentSquare.Contains(mouse.X , mouse.Y )))

А вот и логика вращения:

    float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;

        RotationAngle += elapsed;
        float circle = MathHelper.Pi * 2;
        RotationAngle = RotationAngle % circle;

Я новичок в Xna и программировании в целом, поэтому любая помощь приветствуется.

Большое спасибо,

Bill

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

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

        var PieceSphere = new BoundingSphere()
                         {
                             Center =new Vector3(new Vector2(Position.X + Width/2, Position.Y + Height/2), 0f),
                             Radius = Width / 2
                         };

Затем создайте еще одну ограничивающую сферу вокруг указателя мыши. Для положения используйте координаты мыши и для радиуса 1f.Так как указатель мыши будет двигаться, он изменит свои координаты, поэтому вы должны также обновлять центр сферы при каждом обновлении.

Тогда проверка на щелчки была бы очень простой.

foreach( Piece p in AllPieces )
{
    if ((mouse.LeftButton == ButtonState.Pressed) && p.BoundingSphere.Intersects(MouseBoundingSphere))
    {
        //Do stuff 
    }
} 
1 голос
/ 17 февраля 2012

Итак, вы пытаетесь определить, находится ли точка в прямоугольнике, но когда вращается прямоугольник?

Метод Contains () будет работать, только если текущее вращение равно 0 (я думаю, что currentSquare isпрямоугольник, представляющий положение изображения без вращения?).

Что вам нужно сделать, это сделать противоположное вращение изображения по координатам мыши (координаты мыши должны вращаться вокруг начала координатвашего изображения), а затем рассчитать, если новая позиция находится в пределах currentSquare.Вы должны быть в состоянии сделать все это с помощью векторов.(Не проверено)

bool MouseWithinRotatedRectangle(Rectangle area, Vector2 tmp_mousePosition, float angleRotation)
{
    Vector2 mousePosition = tmp_mousePosition - currentSquare.Origin;
    float mouseOriginalAngle = (float)Math.Atan(mousePosition.Y / mousePosition.X);
    mousePosition = new Vector2((float)(Math.Cos(-angleRotation + mouseOriginalAngle) * mousePosition.Length()), 
                                (float)(Math.Sin(-angleRotation + mouseOriginalAngle) * , mousePosition.Length()));
    return area.Contains(mousePosition);
}
0 голосов
/ 18 февраля 2012

Если вы ленивый, как я, вы можете просто проверить круговое расстояние.

Предполагая, что мышь и box.center имеют вектор2

#gets us C^2 according to the pythagorean Theorem
var radius = (box.width / 2).squared() + (box.height / 2).square 

#distance check
(mouse - box.center).LengthSquared() < radius

Не совсем точно, но у пользователя будетТрудно заметить, и неточности, из-за которых хитбокс становится слишком большим, всегда прощаются.Не говоря уже о том, что проверка невероятно быстрая, просто вычислите радиус при создании квадрата.

...