Làm thế nào để xử lý đầu vào chuột trong XNA?


13

Tôi đang phát triển một trò chơi bài trong XNA.

OnClicksự kiện nào trong XNA cho các đối tượng không?

Tôi đang cố gắng làm cho thẻ di chuyển khi người chơi nhấp vào chúng. Trong dự án này, có một lớp Sprite rút thẻ, nhưng tôi hơi bế tắc vì tôi không biết cách sử dụng OnClickcác sự kiện hoặc bất cứ điều gì tương tự.

Câu trả lời:


12

Khi làm việc với XNA nói chung, bạn phải chuyển từ mô hình mã hướng sự kiện sang mô hình mã điều khiển vòng lặp. Mã cập nhật của bạn lặp 60 lần / giây. Vì vậy, mỗi lần, hãy nhìn vào trạng thái của chuột và nếu một nút bị tắt & con trỏ nằm trong phần chỉnh lưu của bạn, thì hãy phân nhánh để mã bạn thường đặt trong một sự kiện OnClick.


2
Có vẻ như điều đó có thể đúng về mặt ngữ nghĩa, nhưng theo tôi thì cũng sai. Không có sự kiện nào khi bạn nhìn vào một chủ đề và trạng thái hiện tại trong mỗi vòng lặp là gì. Đây là lý do tại sao chúng tôi tạo các sự kiện của riêng mình và viết các trình xử lý tương ứng của chúng. Tôi nói rằng việc sử dụng điều khiển luồng để phân nhánh cho mọi trường hợp chuột xuống sẽ trở nên điên rồ trong một dự án lớn. Thay vào đó, hãy đăng ký một sự kiện và viết trình xử lý bất cứ khi nào cần. Sự kiện đã được nghĩ ra ngay từ đầu vì lý do này.
brandon

5
Brandon: Bạn không "sử dụng điều khiển luồng để phân nhánh cho mọi trường hợp chuột xuống". Bạn ghi lại trạng thái chuột hiện tại và trước đó một lần vào đầu mỗi khung, và sau đó ở mọi nơi mà mã của bạn phản hồi với một lần nhấn chuột, bạn chỉ cần làmif(MouseLeftPress()){ DoSomething(); } , đó MouseLeftPress()là phương pháp bạn viết để so sánh trạng thái chuột trái hiện tại và trước đó. Tôi thấy điều này dễ dàng hơn việc thực hiện các sự kiện hầu hết thời gian.
Olhovsky

4
Bỏ phiếu đơn giản trở nên thực sự xấu xí ngoài các điều khiển arcade cơ bản của bạn. Tôi có một lớp trình quản lý đầu vào nắm bắt trạng thái gamepad dưới dạng FlagAttribution và cho phép bạn ánh xạ các đại biểu theo các tổ hợp nút khác nhau. Bước tiếp theo là thực hiện thời gian. Tất cả các cuộc tranh luận này chỉ củng cố quan điểm của Steve H, bạn đang đưa ra một hệ thống bỏ phiếu và bạn có thể tự do xây dựng nó để hỗ trợ bất kỳ mô hình nào bạn thích.
michael.bartnett


6

XNA chỉ cung cấp cho bạn vừa đủ để xây dựng các lớp đầu vào của riêng bạn - và bạn nên làm như vậy khi xem xét tiện ích họ cung cấp.

Tôi muốn giới thiệu lớp nhập chuột được mô tả trong bài đăng trên blog này ( mã nguồn ). Nó phát hiện một nút được nhấn, giữ hoặc phát hành và cho phép bạn có được thông tin đó thông qua bỏ phiếu hoặc sự kiện.

Trên một lưu ý liên quan, cùng một bài đăng blog cũng cung cấp các lớp thiết bị đầu vào bàn phím và gamepad.


3

Mã thực tế để kiểm tra một lần nhấp chuột trong XNA là một cái gì đó như thế này;

    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

Nếu trò chơi của bạn là 3D, bạn có thể triển khai chọn, được mô tả tại đây: http://create.msdn.com/en-US/education/catalog/sample/picking_trigin . Về cơ bản, điều này tạo ra một tia từ máy ảnh đến nơi chuột nhấp vào (với một ma trận nhỏ không dự đoán được ở đó), sau đó bạn kiểm tra xem liệu có bất kỳ đối tượng nào của bạn được giao nhau bởi tia đó không.

Nếu trò chơi của bạn là 2D, bạn sẽ có thể dịch tọa độ cửa sổ sang tọa độ trò chơi khá dễ dàng. Sau đó kiểm tra xem các tọa độ đã chọn có nằm trong giới hạn của bất kỳ đối tượng nào của bạn không.


1

Cách đơn giản nhất để xem chuột có được nhấp hay không là đây

//Create this variable
MouseState mouseState;

Bây giờ trong phương thức cập nhật thêm điều này

mouseState = Mouse.GetState();

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

hy vọng điều này đã giúp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.