XNA'da fare girişi nasıl kullanılır?


13

XNA'da bir kart oyunu geliştiriyorum.

OnClickXNA'da nesneler için herhangi bir olay var mı ?

Oyuncu üzerlerine tıkladığında kartları hareket ettirmeye çalışıyorum. Bu projede, kartı çeken bir Sprite sınıfı var, ama biraz sıkıştım çünkü OnClickolayları veya bunun gibi bir şeyi nasıl kullanacağımı bilmiyorum .

Yanıtlar:


12

Genel olarak XNA ile çalışırken, olay güdümlü bir kod paradigmasından döngü güdümlü bir kod paradigmasına geçmek zorundasınız. Güncelleme kodunuz 60 kez / sn. Her seferinde, farenin durumuna bakın ve bir düğme aşağıdaysa ve işaretçi rect'inizdeyse, kodlamak için dallayın, normalde bir OnClick olayına yerleştirirsiniz.


2
Bence bu anlamsal olarak doğru, ama aynı zamanda yanlış da olabilir. Bir iş parçacığına ve her döngü sırasında geçerli durumun ne olduğuna baktığınızda hiçbir etkinlik yoktur. Bu yüzden kendi etkinliklerimizi yaratıyor ve ilgili işleyicilerini yazıyoruz. I'de fare kontrolünün her örneğine dalmak için akış kontrolünün kullanılması büyük bir projede çılgın hale geleceğini söylüyor. Bunun yerine, bir olayı kaydedin ve gerektiğinde işleyiciler yazın. Olaylar bu nedenle ilk etapta düşünüldü.
brandon

5
Brandon: "Farenin her örneğine dalmak için akış kontrolünü kullanmıyorsunuz". Geçerli ve önceki fare durumunu her karenin başlangıcında bir kez ve sonra kodunuzun basitçe yaptığınız bir fareye yanıt verdiği her yerde kaydedersiniz if(MouseLeftPress()){ DoSomething(); }, burada MouseLeftPress()geçerli ve önceki sol düğme fare durumlarını karşılaştırmak için yazdığınız bir yöntemdir. Bunu çoğu zaman olayları uygulamaktan daha kolay buluyorum.
Olhovsky

4
Basit yoklama, temel arcade kontrollerinizin ötesinde gerçekten çirkinleşir. Gamepad durumunu FlagAttributes olarak yakalayan ve delegeleri farklı düğme birleşimlerine eşlemenizi sağlayan bir giriş yöneticisi sınıfım var. Bir sonraki adım, zamanlamayı uygulamaktır. Bütün bu tartışmalar Steve H'nin amacını pekiştiriyor, ancak bir oylama sistemi veriyorsunuz ve tercih ettiğiniz paradigmayı desteklemek için bunun üzerine inşa etmekte özgürsünüz.
michael.bartnett


6

XNA size sadece kendi girdi sınıflarınızı oluşturacak kadar verir - ve bunu sundukları yardımcı programı göz önünde bulundurmanız gerekir.

Bu blog yazısında ( kaynak kodu ) açıklanan fare giriş sınıfını tavsiye ederim . Basılan, tutulan veya bırakılan bir düğmeyi algılar ve bu bilgileri yoklama veya olaylar aracılığıyla almanızı sağlar.

İlgili bir notta, aynı blog yazısı ayrıca klavye ve gamepad giriş cihazı sınıfları sağlar.


3

XNA'da bir fare tıklatmasını kontrol etmek için gerçek kod böyle bir şeydir;

    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);
    }

2

Oyununuz 3D ise, burada açıklanan toplama işlemini uygulayabilirsiniz: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . Temel olarak bu, kameradan farenin tıkladığı yere bir ışın yaratır (orada küçük bir matris çıkmaz), o zaman nesnelerinizden herhangi birinin ışın tarafından kesişip kesişmediğini kontrol edersiniz.

Oyununuz 2D ise, pencere koordinatlarını oyun koordinatlarına kolayca çevirebilmelisiniz. Ardından, seçilen koordinatların nesnelerinizin sınırları dahilinde olup olmadığını kontrol edin.


1

Farenin tıklanıp tıklanmadığını görmenin en basit yolu şudur

//Create this variable
MouseState mouseState;

şimdi güncelleme yönteminde bunu ekleyin

mouseState = Mouse.GetState();

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

umarım bu yardımcı olmuştur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.