Bagaimana menangani input mouse di XNA?

13

Saya mengembangkan permainan kartu di XNA.

Apakah ada OnClickperistiwa dalam XNA untuk objek?

Saya mencoba membuat kartu bergerak ketika pemain mengkliknya. Dalam proyek ini, ada kelas Sprite yang menggambar kartunya, tapi saya agak macet karena saya tidak tahu cara menggunakan OnClickacara atau hal-hal seperti itu.

Luis
sumber

Jawaban:

12

Ketika bekerja dengan XNA secara umum, Anda harus beralih dari paradigma kode yang digerakkan peristiwa ke paradigma kode yang digerakkan. Kode pembaruan Anda berulang 60 kali / detik. Jadi setiap kali, lihat keadaan mouse dan jika tombol turun & pointer berada di dalam kotak Anda, maka cabang ke kode yang biasanya Anda tempatkan di acara OnClick.

Steve H.
sumber
2
Sepertinya itu semantik benar, tetapi juga salah menurut saya. Tidak ada peristiwa ketika Anda mulai melihat utas dan bagaimana keadaan saat ini selama setiap loop. Inilah sebabnya kami membuat acara kami sendiri dan menulis penangan yang sesuai. Saya akan mengatakan menggunakan kontrol aliran ke cabang ke setiap instance dari mouse ke bawah akan menjadi gila dalam proyek besar. Sebagai gantinya, daftarkan sebuah acara dan tuliskan penangan di mana pun dibutuhkan. Acara dipikirkan di tempat pertama karena alasan ini.
brandon
5
Brandon: Anda tidak "menggunakan kontrol aliran untuk bercabang ke setiap instance dari mouse ke bawah". Anda merekam keadaan mouse saat ini dan sebelumnya satu kali di awal setiap frame, dan kemudian di setiap tempat kode Anda merespons ke mousedown tekan yang Anda lakukan if(MouseLeftPress()){ DoSomething(); }, di mana MouseLeftPress()adalah metode yang Anda tulis untuk membandingkan keadaan mouse tombol saat ini dan sebelumnya. Saya menemukan ini lebih mudah daripada mengimplementasikan acara sebagian besar waktu.
Olhovsky
4
Polling sederhana menjadi sangat buruk di luar kendali arcade dasar Anda. Saya memiliki kelas manajer input yang menangkap status gamepad sebagai FlagAttributes dan memungkinkan Anda memetakan delegasi ke berbagai kombinasi tombol. Langkah selanjutnya adalah menerapkan pengaturan waktu. Semua perdebatan ini hanya memperkuat poin Steve H, Anda memberikan sistem pemungutan suara, dan Anda bebas untuk membangun di atasnya untuk mendukung paradigma apa pun yang Anda inginkan.
michael.bartnett
6

XNA hanya memberi Anda cukup untuk membangun kelas input Anda sendiri - dan Anda harus melakukannya dengan mempertimbangkan utilitas yang mereka tawarkan.

Saya akan merekomendasikan kelas input mouse yang dijelaskan dalam posting blog ini ( kode sumber ). Ini mendeteksi tombol ditekan, ditahan atau dilepaskan, dan memungkinkan Anda mendapatkan informasi itu baik melalui polling atau acara.

Pada catatan terkait, posting blog yang sama juga menyediakan kelas perangkat input keyboard dan gamepad.

doppelgreener
sumber
3

Kode aktual untuk memeriksa klik mouse di XNA adalah sesuatu seperti ini;

    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
sumber
2

Jika game Anda 3D, Anda dapat menerapkan memilih, yang dijelaskan di sini: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . Pada dasarnya ini menciptakan sinar dari kamera ke tempat klik mouse (dengan sedikit matriks tidak memproyeksikan di sana), maka Anda memeriksa untuk melihat apakah ada objek Anda yang berpotongan dengan sinar.

Jika gim Anda 2D, Anda harus bisa menerjemahkan koordinat jendela ke koordinat gim dengan cukup mudah. Kemudian periksa untuk melihat apakah koordinat yang dipilih berada dalam batas-batas objek Anda.

MichaelHouse
sumber
1

Cara paling sederhana untuk melihat apakah mouse diklik adalah ini

//Create this variable
MouseState mouseState;

sekarang dalam metode pembaruan tambahkan ini

mouseState = Mouse.GetState();

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

Semoga ini bisa membantu

Battle_Pasture
sumber