2016-01-13 42 views
0

我有這些box2d主體。我想檢查身體上的觸摸事件。具體來說,觸摸身體的某個區域。請看下面的圖片,在身體內部,我如何檢查用戶是否觸摸到身體的藍色區域(右上角)。在box2d主體的特定區域觸摸事件

enter image description here

我能得到觸摸座標,將其轉換爲世界座標,並檢查他們是否與包裝盒的重疊,但將觸發即使箱子被觸摸裏面的任何地方。

+0

您需要在代碼中定義該區域,並檢查它而不是框。 [多邊形](https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/math/Polygon.html)是一個好的開始。 – TheOsirian

回答

0

Body本身與Libgdx輸入/輸出操作沒有共同之處 - 這是重要的理解。 Libgdx由

,那麼你不能身體實例綁定到聽者但是你可以用全做到這一點屏幕(然後計算某種程度上,如果座標在身體邊界 - 那麼如果是在哪個部分完全)或你可以通過創建一個Scene2d actor實例

如果我是你,我會創建一個主體的部分大小的角色(例如矩形形狀),你想要「可觸摸」。 演員應該附上ClickListener與你想觸摸的方法。然後在演員的act()方法我會更新演員的位置,由於身體的位置。

1

也許它太晚了,但我會回答你的問題誰需要幫助。

您應該爲定義身體邊緣和屬性的身體創建一個夾具。比你需要添加固定裝置作爲傳感器的身體。代碼示例將會是這樣的。

// create bodydef 
    BodyDef bdef = new BodyDef(); 
    bdef.type = BodyType.DynamicBody; 
    bdef.position.set(60/PPM, 120/PPM); 
    bdef.fixedRotation = true; 
    bdef.linearVelocity.set(1f, 0f); 

    // create body from bodydef 
    Body body = world.createBody(bdef); 

    // create box shape for player collision box 
    PolygonShape shape = new PolygonShape(); 
    shape.setAsBox(13/PPM, 13/PPM); 

    // create fixturedef for player collision box 
    FixtureDef fdef = new FixtureDef(); 
    fdef.shape = shape; 
    fdef.density = 1; 
    fdef.friction = 0; 

    // create player collision box fixture 
    body.createFixture(fdef); 
    shape.dispose(); 

    // create box shape SENSOR for player 
    shape = new PolygonShape(); 
    shape.setAsBox(13/PPM, 3/PPM, new Vector2(0, -13/PPM), 0); 

    // create fixturedef SENSOR for player 
    fdef.shape = shape; 
    fdef.isSensor = true; 

    // create player SENSOR fixture 
    body.createFixture(fdef).setUserData("SENSOR");; 

祝您有愉快的一天。