2015-05-04 3 views
0

Я пытаюсь создать игру с libgdx и ashley. У меня есть базовое понимание того и другого, и мне было интересно, как обрабатывать столкновение объектов.Libgdx Ashley Entity Collision

Я видел ContactListener в Box2D, но я не уверен, как связать это с сущностями в ashley.

Я просто хочу, чтобы сущности не проходили через другие объекты.

+0

Фактически это не должно иметь значения, используете ли вы эшли (или любые другие ECS) или нет. Обнаружение столкновений следует разделить и просто зависит от типа (не каждый объект может сталкиваться со всеми другими, например, самолетом и подводной лодкой, поэтому вы можете «фильтровать» коллизии) + hitbox объектов. – Springrbua

+0

Привет, спасибо за ваш ответ. У меня обнаружено обнаружение столкновений, однако я не смог фактически заставить объекты остановиться, когда они сталкиваются. Я пробовал просто установить их скорость на 0, однако гравитация все еще действует на них, и они будут медленно проходить через неподвижную энергию. Знаете ли вы, что я могу сделать объект прекрасным, когда он столкнется? – Panda

+0

Вы хотите использовать Box2D Physics engine? Если это так, то вы должны прочитать [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 (Body Боде, Body 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