วิธีจัดการกับอินพุตของเมาส์ใน XNA


13

ฉันกำลังพัฒนาการ์ดเกมใน XNA

มีOnClickเหตุการณ์ใดใน XNA สำหรับวัตถุหรือไม่

ฉันพยายามที่จะทำให้ไพ่เคลื่อนที่เมื่อผู้เล่นคลิกที่ไพ่ ในโครงการนี้มีคลาส Sprite ที่วาดการ์ด แต่ฉันติดอยู่เล็กน้อยเพราะฉันไม่รู้วิธีใช้OnClickเหตุการณ์หรืออะไรทำนองนั้น

คำตอบ:


12

เมื่อทำงานกับ XNA โดยทั่วไปคุณต้องย้ายจากกระบวนทัศน์รหัสที่ขับเคลื่อนด้วยเหตุการณ์เป็นกระบวนทัศน์รหัสที่ขับเคลื่อนด้วยลูป รหัสอัพเดทของคุณวนซ้ำ 60 ครั้ง / วินาที ดังนั้นในแต่ละครั้งให้ดูที่สถานะของเมาส์และหากปุ่มไม่ทำงาน & ตัวชี้อยู่ในรูปสี่เหลี่ยมผืนผ้าของคุณจากนั้นให้ทำการแยกรหัสตามปกติที่คุณวางไว้ในเหตุการณ์ OnClick


2
ดูเหมือนว่าอาจถูกต้องทางความหมาย แต่ก็ผิดในความคิดของฉัน ไม่มีเหตุการณ์เมื่อคุณลงไปดูเธรดและสถานะปัจจุบันระหว่างแต่ละลูป นี่คือเหตุผลที่เราสร้างกิจกรรมของเราเองและเขียนตัวจัดการที่เกี่ยวข้อง ฉันว่าการใช้การควบคุมการไหลไปยังสาขาเพื่อวางเมาส์ทุกครั้งจะกลายเป็นบ้าในโครงการขนาดใหญ่ ให้ลงทะเบียนเหตุการณ์และเขียนตัวจัดการแทนตามที่ต้องการ เหตุการณ์ต่าง ๆ ที่เกิดขึ้นในตอนแรกเพราะเหตุนี้
แบรนดอน

5
แบรนดอน: คุณไม่ได้ "ใช้การควบคุมการไหลเพื่อแยกสาขาให้กับทุก ๆ การใช้เมาส์" คุณสามารถบันทึกรัฐเมาส์ปัจจุบันและก่อนหน้านี้ครั้งหนึ่งเคยเป็นจุดเริ่มต้นของแต่ละเฟรมและจากนั้นในสถานที่ที่ตอบสนองรหัสของคุณกด mousedown คุณก็ทำทุกif(MouseLeftPress()){ DoSomething(); }ที่MouseLeftPress()เป็นวิธีการที่คุณเขียนเพื่อเปรียบเทียบรัฐเมาส์ปุ่มซ้ายในปัจจุบันและก่อนหน้านี้ ฉันพบว่าสิ่งนี้ง่ายกว่าการใช้เหตุการณ์เป็นส่วนใหญ่
Olhovsky

4
การสำรวจอย่างง่าย ๆ น่าเกลียดเกินกว่าการควบคุมอาร์เคดพื้นฐานของคุณ ฉันมีคลาสตัวจัดการอินพุตที่จับสถานะ gamepad เป็น FlagAttributes และให้คุณแมปผู้ร่วมประชุมกับปุ่มต่างๆ ขั้นต่อไปคือการใช้เวลา การอภิปรายทั้งหมดนี้เป็นการตอกย้ำประเด็นของสตีฟเอช แต่คุณให้ระบบการลงคะแนนและคุณมีอิสระที่จะสร้างมันเพื่อสนับสนุนกระบวนทัศน์ที่คุณต้องการ
michael.bartnett


6

XNA ให้คุณพอเพียงในการสร้างคลาสอินพุตของคุณเอง - และคุณควรพิจารณาถึงยูทิลิตี้ที่มีให้

ฉันจะแนะนำคลาสอินพุตเมาส์ที่อธิบายไว้ในโพสต์บล็อกนี้ ( ซอร์สโค้ด ) มันจะตรวจจับปุ่มที่ถูกกดค้างไว้หรือปล่อยและช่วยให้คุณได้รับข้อมูลนั้นไม่ว่าจะผ่านการสำรวจหรือกิจกรรม

ในบันทึกที่เกี่ยวข้องโพสต์บล็อกเดียวกันยังมีคลาสอุปกรณ์อินพุตและแป้นพิมพ์ gamepad


3

รหัสจริงสำหรับการตรวจสอบการคลิกเมาส์ใน XNA นั้นเป็นอย่างนี้

    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

ถ้าเกมของคุณเป็นแบบ 3 มิติคุณสามารถใช้การเลือกซึ่งจะอธิบายที่นี่: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle โดยพื้นฐานแล้วสิ่งนี้จะสร้างรังสีจากกล้องไปยังที่ที่เมาส์คลิก (โดยมีเมทริกซ์เล็ก ๆ น้อย ๆ ที่ไม่ได้ใส่เข้าไป) จากนั้นคุณตรวจสอบเพื่อดูว่าวัตถุใด ๆ ของคุณถูกตัดโดยรังสี

หากเกมของคุณเป็นแบบ 2D คุณควรจะสามารถแปลพิกัดหน้าต่างเป็นพิกัดของเกมได้อย่างง่ายดาย จากนั้นตรวจสอบว่าพิกัดที่เลือกนั้นอยู่ในขอบเขตของวัตถุใด ๆ ของคุณหรือไม่


1

วิธีที่ง่ายที่สุดในการดูว่ามีการคลิกเมาส์หรือไม่

//Create this variable
MouseState mouseState;

ตอนนี้ในวิธีการอัปเดตเพิ่มสิ่งนี้

mouseState = Mouse.GetState();

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

หวังว่าสิ่งนี้จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.