首页 > 解决方案 > Ashley ECS IteratingSystem 不处理实体系列

问题描述

不知何故,我无法IteratingSystem工作。在更新中,我仔细检查是否有实体,它返回的值大于 0。但这应该意味着它processEntity会被调用,但它永远不会运行。

//...
import net.madmenyo.teststuff.AshleyTest.components.MovementComponent;
import net.madmenyo.teststuff.AshleyTest.components.PositionComponent;
//...

public class MovementSystem extends IteratingSystem {
    private ComponentMapper<PositionComponent> pm;
    private ComponentMapper<MovementComponent> mm;

    public MovementSystem () {
        super(Family.all(PositionComponent.class, MovementComponent.class).get());
        pm = ComponentMapper.getFor(PositionComponent.class);
        mm = ComponentMapper.getFor(MovementComponent.class);
    }

    @Override
    public void processEntity (Entity entity, float deltaTime) {
        System.out.println("Process moveSystem");
        PositionComponent position = pm.get(entity);
        MovementComponent movement = mm.get(entity);

        position.x += movement.velocityX * deltaTime;
        position.y += movement.velocityY * deltaTime;
    }

    @Override
    public void update(float deltaTime) {
        Engine engine = getEngine();

        int count = engine.getEntitiesFor(Family.all(PositionComponent.class, MovementComponent.class).get()).size();
    }
}

Afaik,对于 update 方法中的每个计数,它应该在ProcessEntity每次更新引擎时运行。由于 update 被调用,引擎被更新并且因为count > 0它应该处理实体,但它从未被调用。通过在运行时检查引擎,它还包含我定义的系列的多个实体。

标签: javalibgdx

解决方案


processEntity(...)由我没有调用的父更新方法调用。一旦我再次查看它就很容易修复,我只是把它留在这里以防万一。

@Override
public void update(float deltaTime) {
    super.update(deltaTime); // <-- call parent update
}

推荐阅读