2015-05-04 66 views
0

我正在嘗試使用libgdx和ashley進行遊戲。我對這兩者都有一個基本的瞭解,並且想知道如何處理實體衝突。Libgdx Ashley實體碰撞

我在Box2D中看到了一個ContactListener,但我不確定如何將它與ashley中的實體關聯。

我只是想阻止實體通過其他實體。

+0

實際上它不應該有所作爲,無論您是否使用ashley(或任何其他ECS)或不。碰撞檢測應該被分開,並且只取決於類型(並非每個實體都可以與其他例如飛機和潛艇碰撞,因此您可能需要「過濾」碰撞)+實體的hitbox。 – Springrbua

+0

嗨,謝謝你的回覆。我已經得到了碰撞檢測的工作,但是我一直無法讓實體在碰撞時停下來。我試過把它們的速度設置爲0,但是重力仍然作用於它們,並且它們將緩慢地穿過固定的物體。你知道一個更好的方式,我可以讓實體在碰撞時停下來嗎? – Panda

+0

你想使用Box2D物理引擎嗎?如果是這種情況,那麼你應該閱讀[libgdx wiki](https://github.com/libgdx/libgdx/wiki/Box2d)和[iforce2d]的教程(https://www.iforce2d.net/b2dtut /)。關於iforce2d的教程是針對C++的,但這個理論對於java(jBox2D)和C++來說是一樣的。這些例子也應該是可以理解的。 – Springrbua

回答

0

這裏是一個辦法,那我自己實現:

  1. 定義接口CollisionListener:

    公共接口CollisionListener { 無效onBeginContact(身體bodyA,身體bodyB); }

  2. 有關碰撞創建CollisionListenerSystem是自身註冊爲世界的聯繫監聽器,並通知其他系統:

    public class CollisionSystem implements ContactListener { 
    private final List<CollisionListener> collisionListeners; 
    
    public CollisionSystem(World world, List<CollisionListener> collisionListeners) { 
        world.setContactListener(this); 
        this.collisionListeners = collisionListeners; 
    } 
    
    @Override 
    public void beginContact(Contact contact) { 
        for (CollisionListener collisionListener : collisionListeners) 
         collisionListener.onBeginContact(contact.getFixtureA().getBody(), contact.getFixtureB().getBody()); 
    
  3. 在任何系統中實現CollisionListener,應該處理衝突,並通過它在collisionListener列表在CollisionSystem構造函數