Перемещение изображения при щелчке мышью в игре C # XNA - PullRequest
2 голосов
/ 02 сентября 2011

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

У меня есть это для движения:

if (Mouse.GetState().LeftButton == ButtonState.Pressed &&
    previousMouseState.LeftButton != ButtonState.Pressed)
{
    xpos = rnd.Next(windowWidth - texture.Width);
    ypos = rnd.Next(windowHeight - texture.Height);
}

previousMouseState = Mouse.GetState();

Но мне нужно какое-то соединение if логика, чтобы сделать так, чтобы он двигался только при нажатии на текстуру.

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Я предполагаю, что ваш texture объект не просто Texture2D.

При рисовании спрайта у вас есть и позиция, и размер. Примерно так должно работать:

var currentMouseState = Mouse.GetState();

if (currentMouseState.LeftButton == ButtonState.Pressed &&
previousMouseState.LeftButton != ButtonState.Pressed)
{
    Vector2 mousePosition = new Vector2(currentMouseState.X,currentMouseState.Y);

    mousePosition-=sprite.Position;

    /// .Bounds is a property of Texture2D, and returns a Rectangle() struct
    var spriteWasClicked = sprite.Bounds.Contains(mousePosition.X,mousePosition.Y);

    if(spriteWasClicked)
    {
        xpos = rnd.Next(windowWidth - texture.Width);
        ypos = rnd.Next(windowHeight - texture.Height);

        // update sprite position with to xpos,ypos here.
    }

}

previousMouseState = currentMouseState;
0 голосов
/ 02 сентября 2011

Я думаю, что Реактивные расширения идеально подходят для этого.

Приведенный выше код, вероятно, вызывается на основе таймера / планировщика, который запускает событие. Вы можете изменить это на реализацию IObservable<T>, вызвав метод Observable.FromEvent .

После этого вы можете использовать операторы LINQ на IObservable<T>, чтобы получить «окна» между нажатиями мыши. Скорее всего, вы бы использовали TakeUntil метод примерно так:

// Your initial observable.
var timerObservable = Observable.FromEvent(timer, "TimerFired");

// The button pressed.
var pressed = timerObservable.
    Where(t => Mouse.GetState().LeftButton == ButtonState.Pressed);

// The button not pressed.
var notPressed = timer.Observable.
    Where(t => Mouse.GetState().LeftButton != ButtonState.Pressed);

// Observe the not pressed until it is pressed.
// Make sure to repeat.
var pressed = notPressed.SkipUntil(pressed).Repeat();

Затем можно вызвать метод Subscribe и передать делегату свой код, который будет вызываться при нажатии кнопки.

Вы даже можете заменить таймер вызовом Observable. Timer метода , чтобы сгенерировать таймер, который вы ждете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...