2013-05-25 27 views
7

Tôi sử dụng một Nhóm để lưu trữ một số Hình ảnh và vẽ chúng vào một SpriteBatch. Bây giờ tôi muốn phát hiện hình ảnh nào đã được nhấp. Vì lý do này, tôi thêm một InputListener vào nhóm để có được một sự kiện khi chạm xuống. InputEvent đến có một phương thức (getTarget) trả về một tham chiếu đến Actor được nhấn.Phát hiện đầu vào cho một Nhóm có hình ảnh trong suốt chồng lên nhau

Nếu tôi nhấp vào vùng trong suốt của diễn viên, tôi muốn bỏ qua sự kiện đến. Và nếu có một diễn viên đằng sau nó, tôi muốn sử dụng nó thay thế. Tôi đã nghĩ về một cái gì đó như thế này:

myGroup.addListener(new InputListener() { 
     @Override 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
      Actor targetActor = event.getTarget(); 
      // is the touched pixel transparent: return false 
      // else: use targetActor to handle the event and return true 
     }; 
    }); 

Đây có phải là cách phù hợp để làm điều đó không? Tôi nghĩ trả về false cho phương thức touchDown sẽ tiếp tục tuyên truyền cho sự kiện và cho phép tôi cũng nhận được các sự kiện touchDown cho các diễn viên khác ở cùng một vị trí. Nhưng điều này có vẻ là một sự hiểu lầm ...

CẬP NHẬT

P.T.s câu trả lời giải quyết vấn đề nhận được sự kiện đúng. Bây giờ tôi đã có vấn đề để phát hiện nếu các điểm ảnh hit là minh bạch. Dường như với tôi rằng tôi cần Hình ảnh làm Pixmap để có quyền truy cập. Nhưng tôi không biết làm thế nào để chuyển đổi một hình ảnh thành một Pixmap. Tôi cũng tự hỏi liệu đây có phải là giải pháp tốt về mặt hiệu suất và sử dụng bộ nhớ hay không ..

+0

Bạn không chuyển từ Hình ảnh sang Pixmap. Bạn chuyển từ Pixmap sang Texture thành Drawable to Image. – NateS

+0

Bạn đã thử giải pháp mà tôi đã cung cấp chưa? – ManishSB

Trả lời

5

Tôi nghĩ bạn muốn ghi đè phương thức Actor.hit(). Xem scene2d Hit Detection wiki.

Để làm điều này, hãy phân loại Image và đặt chuyên môn hit trong đó. Một cái gì đó như:

public Actor hit(float x, float y, boolean touchable) { 
    Actor result = super.hit(x, y, touchable); 
    if (result != null) { // x,y is within bounding box of this Actor 
    // Test if actor is really hit (do nothing) or it was missed (set result = null) 
    } 
    return result; 
} 

Tôi tin rằng bạn không thể thực hiện điều này trong touchDown nghe vì Stage sẽ bỏ qua Actors "đằng sau" cái này (chỉ có "cha mẹ" diễn viên sẽ nhận được sự kiện Touchdown nếu bạn quay lại sai ở đây) .

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