Làm cách nào để xác định nhấp chuột so với chuột xuống trong trò chơi?


8

Cách phổ biến nhất để xử lý các nhấp chuột trong trò chơi là gì?

Cho rằng tất cả những gì bạn có trong cách phát hiện đầu vào từ chuột là liệu nút lên hay xuống.

Tôi hiện chỉ dựa vào chuột xuống là một cú nhấp chuột, nhưng cách tiếp cận đơn giản này giới hạn tôi rất nhiều trong những gì tôi muốn đạt được. Ví dụ: tôi có một số mã chỉ nên chạy một lần khi nhấp chuột, nhưng sử dụng chuột xuống khi nhấp chuột có thể khiến mã chạy nhiều hơn sau đó một lần tùy thuộc vào thời gian nhấn nút. Vì vậy, tôi cần phải làm điều đó trên một cú nhấp chuột!

Nhưng cách tốt nhất để xử lý một nhấp chuột là gì? Là một lần nhấp khi chuột di chuyển từ chuột lên xuống hoặc từ trên xuống hoặc là nhấp chuột nếu nút giảm xuống ít hơn x khung hình / mili giây và sau đó, nếu nó được coi là chuột xuống và nhấp chuột nếu nó xuống cho x khung hình / mili giây hoặc nhấp chuột rồi thả chuột xuống?

Tôi có thể thấy rằng mỗi cách tiếp cận có thể có công dụng của chúng nhưng cách nào phổ biến nhất trong các trò chơi? Và có lẽ tôi sẽ hỏi cụ thể hơn cái nào phổ biến nhất trong các trò chơi RTS?


1
Bạn đang đi đúng hướng. Thêm một cái gì đó về việc chuột xuống và chuột lên cả hai phải gần nhau (hoặc bên trong giới hạn của đối tượng được nhấp) và bạn đã có nó. Nhấp vào nút, sau đó kéo ra, sau đó thả nút không phải là nhấp chuột. Nhưng nhấp vào nút và buông bất cứ nơi nào trong nút là nhấp chuột.
Tim Holt

Câu trả lời:


12

Bạn đang đi đúng hướng với việc tìm ra khi con chuột đang chuyển từ dưới lên và viết một trình xử lý cho việc đó. Đối với nhiều trò chơi, đủ tốt để coi sự kiện mouseUp là một cú nhấp chuột.

Tùy thuộc vào trò chơi của bạn, có lẽ bạn muốn xử lý cả hai sự kiện - ví dụ: trong RTS, có thể bạn sẽ muốn kết hợp chọn hộp kéo cũng như chọn một lần bấm. Sự khác biệt là trong việc xác định thời gian chuột ở trạng thái Xuống trước khi nó được phát hành.

(Vâng, về cơ bản bạn đã trả lời câu hỏi của riêng bạn)


2
Như các nhà bình luận khác đã chỉ ra, có lẽ bạn cũng sẽ muốn kiểm tra xem cùng một mục tiêu đã được trỏ vào mouseDown và mouseUp khi làm việc với các nhấp chuột đơn lẻ.
Hóa đơn

Tôi không chắc lắm. Ví dụ: Nút Windows không quan tâm chuột nằm ở đâu, miễn là nút nhận được sự kiện chuột lên. Có lẽ các hệ điều hành khác quan tâm nhiều hơn.
John McDonald

@ John John Đây không phải là một yêu cầu kỹ thuật nhiều như là một "yêu cầu người dùng của bạn thực sự muốn nhấp vào" yêu cầu gì.
Hóa đơn

1
@ John McD. Đo không phải sự thật. Nhấn nút chuột xuống một nơi nào đó trên máy tính để bàn của bạn, di chuyển con trỏ đến Menu Bắt đầu và nhả - Menu Bắt đầu có bật lên không? Nó không dành cho tôi.
Kylotan

@Kylotan, Bạn sẽ đúng, mặc dù "nút" menu bắt đầu hoạt động khác với tất cả các nút tiêu chuẩn khác. Có vẻ như các nút tiêu chuẩn trong cửa sổ thực sự yêu cầu cả chuột xuống và chuột lên các sự kiện, mặc dù chuột của bạn có thể di chuyển ra ngoài giới hạn nút ở giữa. Thu nhỏ, Tối đa hóa và Đóng tất cả các công việc như thế này, cũng như các nút bình thường bên trong các ứng dụng. Nhưng xin lưu ý rằng không có hành động nào xảy ra (ngoại trừ nút khởi động) cho đến khi nút chuột được phát hành, những người như tôi sẽ nhận thấy. Annyway ... Bill nói đúng, nó đi theo yêu cầu.
John McDonald

4

Không có "tốt nhất" - bạn cần tất cả chúng.

Nếu tôi bắn súng, tôi không muốn đợi chuột được thả ra để kích hoạt hiệu ứng bắn vũ khí. Và nếu bạn đang kéo một hộp xung quanh một loạt các đơn vị, bạn bắt đầu hành động kéo chuột xuống.

Mặt khác, nếu tôi đang nhấp vào một mục GUI thì tôi muốn đợi nhấp hoàn toàn vì đó là những gì tôi đã quen.

Vì vậy, có lẽ bạn nên thực hiện chuột xuống, chuột lên, kéo chuột (di chuột lên ở nơi khác biệt đáng kể để chuột xuống) và nhấp chuột (di chuột lên cùng một nơi với chuột xuống) và nối chúng với các phần của trò chơi của bạn như bạn thấy phù hợp


1

Cách mà hầu hết các hệ thống cửa sổ xử lý nó, cũng như các trò chơi mà tôi đã làm việc (và phải tự thực hiện một phần) là có một chút trên mỗi nút phát hiện nếu chuột vào trạng thái chuột xuống trên nút đã cho. Nó chỉ được đặt khung mà chuột đi xuống và chỉ bị xóa khi thả nút chuột. Nếu và chỉ khi chuột được nhả qua nút và bit được đặt, thì hãy tắt sự kiện đã nhấp vào nút.

(Bạn cũng có thể muốn một cờ được đặt đúng khi bit được đặt và chuột đang di chuột qua nút của bạn, để bạn có thể thay đổi nút để sử dụng kết cấu được nhấn thay vì kết cấu bình thường.)

Đây là sơ đồ cơ bản đằng sau hầu hết các nút. Đi trước và tìm một dấu nhắc hộp thoại. Nhấn xuống nút hủy nhưng đừng buông tay. Nút trở nên chán nản trong khi chuột ở trên nó và trở lại bình thường nếu chuột của bạn dừng di chuột qua nó, nhưng nó sẽ quay trở lại để nhấn nếu bạn di chuyển qua lại. Nó chỉ chạy hành động của nó nếu bạn buông tay và bạn vượt qua nó. Không sử dụng số mili giây, điều đó chủ yếu chỉ để phát hiện các lần nhấp đúp trong ngưỡng của bạn.

(và nếu bạn thực sự muốn có được sự ưa thích, có các sự kiện mà bạn có thể kết nối với từng chuyển đổi đó. Ví dụ: MouseOver khi nhập và thoát, nhập / thoát MouseDown, nhập / thoát MouseUp, nhập / thoát MouseClicky, v.v. )


1

Các nút chuột và phím bàn phím có thể có một số sự kiện khác nhau, những gì có sẵn tùy thuộc vào lựa chọn ngôn ngữ / thư viện của bạn, phổ biến nhất:

Phím xuống, kích hoạt khi nhấn nút.
Phím lên, kích hoạt khi một nút được phát hành.
Phím bị chậm lại, kích hoạt khi nhấn nút và sau đó kích hoạt liên tục tại một số khoảng thời gian phụ thuộc hệ thống cho đến khi phím được giải phóng.

Trên đầu trang này cũng có thể có một cuộc gọi để cho biết liệu một phím hiện có được giữ hay không.

Điều quan trọng là bạn phải biết chính xác công cụ bạn đang sử dụng, thông thường nhất là bạn sẽ cần hai công cụ đầu tiên, nếu chúng không có sẵn, hãy xây dựng chúng từ bất cứ thứ gì có sẵn.

Phương pháp tiêu chuẩn để đăng ký nhấn nút trên màn hình bằng chuột là để khẳng định rằng cùng một nút được chĩa vào cả ở sự kiện xuống và sự kiện lên. Tuy nhiên, đối với nhiều yếu tố trò chơi, điều này có thể quá chậm, vì vậy đối với nhiều hành động, có thể nên thận trọng khi thực hiện chúng tại sự kiện không hoạt động.


0

XOr có thể là bạn của bạn trong tình huống này.

bool oldIsButtonUp = true;

void pollMouse(bool isButtonUp) {
    if ((oldIsButtonUp ^ isButtonUp) && isButtonUp) {
        sendMouseClickEvent();
    }
    oldIsButtonUp = isButtonUp;
}

Điều này sẽ gọi sendMouseClickEvent () bất cứ khi nào trạng thái nút chuột chuyển từ false thành true.


4
Hoặc, để không làm cho một lập trình viên tạo ra một sự thật trong đầu (cô ấy?) Của mình : if (!oldIsButtonUp && isButtonUp) {.
giảm tốc

-1

Một phiên bản XNA của mã này sẽ giống như (đơn giản hóa để phát hiện sự kiện chuột xuống, để phát hiện các nhấp chuột kép, bạn sẽ cần một cái gì đó tinh vi hơn);

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 begins if the button 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); 
} 

Ngoài ra đây là mã cho MouseUp, không phải MouseClick - Cập nhật thường xuyên thực hiện như thế nào? Điều gì sẽ xảy ra nếu một lần nhấp ngắn hơn mà thời gian trò chơi của bạn đánh dấu?
Kromster

phụ thuộc vào trò chơi nhưng trong bản cập nhật XNA xảy ra khoảng 60fps theo mặc định. Sẽ rất khó để nhấn VÀ nhả nút chuột trong khung thời gian này.
Ken

Trên thực tế, đó là mã để phát hiện một sự kiện chuột xuống.
Ken

Tôi không thấy câu trả lời thực sự cho câu hỏi thực tế trong mẫu mã XNA trừu tượng này
Kromster

Tuy nhiên, cảm ơn vì đã sửa chữa, tôi đã thực hiện một thử nghiệm nhỏ và Click thực sự xảy ra để mất 16-100ms, tức là hơi dài hơn một chút so với thời lượng Cập nhật. Tuy nhiên, tôi sẽ không khuyến khích xử lý đầu vào trong vòng Cập nhật cho dấu thời gian có thể dưới 60fps, đặc biệt là không có hàng đợi đầu vào.
Kromster
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.