Como lidar com a entrada do mouse no XNA?

13

Estou desenvolvendo um jogo de cartas no XNA.

Existe algum OnClickevento no XNA para objetos?

Estou tentando fazer com que as cartas se movam quando o jogador clica nelas. Neste projeto, há uma classe Sprite que compra o cartão, mas estou um pouco paralisada porque não sei como usar OnClickeventos ou algo assim.

Luis
fonte

Respostas:

12

Ao trabalhar com o XNA em geral, você deve passar de um paradigma de código controlado por eventos para um paradigma de código controlado por loop. Seu código de atualização faz loop 60 vezes / s. Portanto, a cada vez, observe o estado do mouse e se um botão estiver pressionado e o ponteiro estiver dentro do seu retângulo, ramifique para o código que você normalmente colocaria em um evento OnClick.

Steve H
fonte
2
Parece que isso pode ser semanticamente correto, mas também errado na minha opinião. Não há eventos quando você começa a olhar para um encadeamento e qual é o estado atual durante cada loop. É por isso que criamos nossos próprios eventos e escrevemos seus manipuladores correspondentes. Eu diria que usar o controle de fluxo para ramificar todas as instâncias do mouse para baixo ficaria louco em um grande projeto. Em vez disso, registre um evento e escreva manipuladores sempre que necessário. Os eventos foram pensados ​​em primeiro lugar por esse motivo.
Brandon
5
Brandon: Você "não usa controle de fluxo para ramificar todas as instâncias do mouse". Você grava o estado atual e anterior do mouse uma vez no início de cada quadro e, em seguida, em todos os lugares em que seu código responde a uma pressão de mouse, basta fazer isso if(MouseLeftPress()){ DoSomething(); }, onde MouseLeftPress()é um método que você escreve para comparar os estados atuais e anteriores do botão esquerdo do mouse. Acho isso mais fácil do que implementar eventos na maioria das vezes.
Olhovsky
4
A pesquisa simples fica realmente feia além dos controles básicos de arcade. Eu tenho uma classe de gerenciador de entrada que captura o estado do gamepad como FlagAttributes e permite mapear delegados para diferentes combinações de botões. O próximo passo é implementar o timing. No entanto, todo esse debate apenas reforça o argumento de Steve H, você está dando um sistema de votação e você pode desenvolvê-lo para apoiar o paradigma que preferir.
Michael.bartnett #
6

O XNA fornece apenas o suficiente para criar suas próprias classes de entrada - e você deve fazê-lo considerando o utilitário que elas oferecem.

Eu recomendaria a classe de entrada do mouse descrita nesta postagem do blog ( código fonte ). Ele detecta um botão sendo pressionado, pressionado ou liberado e permite que você obtenha essas informações por meio de pesquisas ou eventos.

Em uma nota relacionada, a mesma postagem no blog também fornece classes de dispositivo de entrada para teclado e gamepad.

doppelgreener
fonte
3

O código real para verificar um clique do mouse no XNA é algo assim;

    MouseState previousMouseState;
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        //store the current state of the mouse
        previousMouseState = Mouse.GetState();
    }


    protected override void Update(GameTime gameTime)
    {
        // .. other update code


        //is there a mouse click?
        //A mouse click occurs if the goes from a released state
        //in the previous frame  to a pressed state 
        //in the current frame
        if (previousMouseState.LeftButton == ButtonState.Released 
            && Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            //do your mouse click response...

        }

        //save the current mouse state for the next frame
        // the current 
        previousMouseState = Mouse.GetState();

        base.Update(gameTime);
    }
Ken
fonte
2

Se o seu jogo for 3D, você pode implementar o picking, descrito aqui: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . Basicamente, isso cria um raio da câmera para o local em que o mouse clica (com uma pequena matriz desprotegida), então você verifica se algum dos seus objetos foi cruzado pelo raio.

Se o seu jogo for 2D, você poderá converter as coordenadas da janela em coordenadas do jogo com bastante facilidade. Em seguida, verifique se as coordenadas selecionadas estão dentro dos limites de qualquer um dos seus objetos.

MichaelHouse
fonte
1

A maneira mais simples de ver se o mouse é clicado é esta

//Create this variable
MouseState mouseState;

agora no método de atualização, adicione este

mouseState = Mouse.GetState();

if (mouse.RightButton == ButtonState.Pressed)
{
     //Do Stuff
}

espero que isso tenha ajudado

Battle_Pasture
fonte