2015-06-02 38 views
6

Tôi cần có thể kiểm tra xem con chuột có nằm ngoài cửa sổ ứng dụng libgdx của tôi đang chạy trên màn hình nền hay không.libgdx trên máy tính để bàn - Xác định xem con chuột bên ngoài cửa sổ

Gdx.input.getX()Gdx.input.getY() bị giới hạn trong cửa sổ ứng dụng của tôi trên Windows (nhưng không phải trên máy Mac).

Tôi đã thử Gdx.input.setCatched(true) làm cho nó không bị ràng buộc, nhưng nó cũng liên kết chuột hoàn toàn với ứng dụng của tôi. Vì vậy, Windows không nhận được bất kỳ sự kiện chuột cho đến khi tôi alt + tab đến một ứng dụng khác.

Tôi cũng đã thử viết InputProcessor, nhưng mouseMoved chỉ được kích hoạt trong cửa sổ. TouchDragged hoạt động bên ngoài, nhưng tất nhiên chỉ được kích hoạt khi nút chuột được nhấn và giữ trong cửa sổ.

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Tôi không nghĩ rằng có thể chỉ với libgdx –

+0

"bị ràng buộc với cửa sổ ứng dụng của tôi trên Windows (nhưng không phải trên máy Mac)." Bạn có nghĩa là trên máy Mac của bạn, khi con chuột của bạn bên ngoài cửa sổ trò chơi nhưng cửa sổ vẫn tập trung, bạn vẫn nhận được tọa độ chuột bằng cách sử dụng các chức năng nói trên? – Crembo

+0

@Crembo: Có. Đó là chính xác những gì tôi có ý nghĩa. –

Trả lời

2

Tôi tìm thấy một cách, nhưng bởi golly nó là một chút của một faff. Nó tận dụng lợi thế của lwjgl backend Mouse.isInsideWindow() method (nhờ Khopa cho liên kết).

Nếu có ai quan tâm, ở đây nó là ...

Tạo một giao diện trong mô-đun lõi libgdx của bạn ...

public interface MouseWindowQuery { 

    public boolean isMouseInsideWindow(); 
} 

Thêm một lĩnh vực MouseWindowQuery đến lớp AplicationListener chính của bạn (điều này sẽ lớp mở rộng Trò chơi cho nhiều người) và lưu nó ở đâu đó ...

public class SampleApp extends Game 
{ 
    private MouseWindowQuery mouseWindowQuery; 

    public FirstLibgdxApp(MouseWindowQuery mouseWindowQuery) { 
     this.mouseWindowQuery= mouseWindowQuery; 
    } 
    ... 
} 

Bây giờ trong mô-đun máy tính để bàn, bạn có thể triển khai giao diện như sau ...

public class MouseWindowQueryImpl implements MouseWindowQuery { 

    @Override 
    public boolean isMouseInsideWindow() { 

     return Mouse.isInsideWindow(); 
    } 
} 

Cuối cùng, chuyển phần này vào lớp ApplicationListener chính của bạn từ lớp DesktopStarter của bạn (lớp với phương thức main).

Bây giờ bạn có thể sử dụng trường hợp bạn đã chuyển vào theo ý bạn muốn.

Nếu bạn có các mô-đun khác (ví dụ: Android), bạn phải chuyển sang thực hiện rỗng thay vì (ví dụ: triển khai MouseWindowQuery vừa trả về false).

Trong trường hợp bạn tự hỏi, giao diện và triển khai là cần thiết để tránh giới thiệu sự phụ thuộc vào máy tính để bàn từ lõi.

Phew! Tôi thực sự hy vọng rằng sẽ giúp ai đó!

+0

Bạn có thể giải thích điều này là gì 'Mouse.isInsideWindow()'? Tôi dường như không thể tìm thấy lớp 'Chuột' trong API libgdx? – Crembo

+0

Nó không có trong API chuẩn. Nó nằm trong các lọ phụ trợ trên máy tính để bàn ... gdx-backend-lwjgl.jar phải chính xác. Đó là lý do tại sao bạn chỉ có thể gọi nó từ mã máy tính để bàn. –

+0

Tôi đào sâu vào mã để tìm mã đó! :) –

Các vấn đề liên quan