(Gdx-AI) СтолкновениеAvoidance поведение не работает - PullRequest
0 голосов
/ 10 июля 2019

Я довольно новичок в Gdx-ai, и у меня возникают проблемы с работой поведения CollisionAvoidance.Я на 99% уверен, что правильно настроил его на основе классов aiMaster из github, но, похоже, ничего не делает.Я использовал это в качестве справочного материала, и я не знаю, что я пропустил: [CollisionAvoidanceTest.java] [1].Вот мой код:

Код корабля противника:

public EnemyShip(GameScreen screen){
        //irrelevant code, setsup world and other things
        ship = new SteeringEntity(b2body, 10 / SpaceSoccer.PPM);
        ball = new SteeringEntity(ballBody, 15 / SpaceSoccer.PPM);
        iterator = new Iterator<SteeringEntity>() {
            @Override
            public boolean hasNext() {//Temporary code until I can get it working
                return !alreadyRun;
            }

            @Override
            public SteeringEntity next() {
                alreadyRun = true;
                System.out.println(">>");//This doesn't run
                return ball;
            }
        };
        iterable = new Iterable<SteeringEntity>() {
            @Override
            public Iterator<SteeringEntity> iterator() {
                return iterator;
            }

            @Override
            public void forEach(Consumer<? super SteeringEntity> consumer) {

            }

            @Override
            public Spliterator<SteeringEntity> spliterator() {
                return null;
            }
        };
        proximity = new RadiusProximity<Vector2>(ship, iterable, ship.getBoundingRadius());
        CollisionAvoidance<Vector2> avoid = new CollisionAvoidance<Vector2>(ship, proximity){
            @Override
            public boolean reportNeighbor(Steerable<Vector2> neighbor){//Temporary code until I can get the behaviour working
                return neighbor == ball;
            }
        };
        if(avoid.reportNeighbor(ball)){
            System.out.println("ok"); //this runs fine
        }
        blendedSteering = new BlendedSteering<Vector2>(ship);
        blendedSteering.add(avoid, 2);//One behaviour until collisionAvoidance works
        ship.setBehavior(blendedSteering);
    }

    private void DefineShip(){
        //irrelevant code, createsb2body 
    }

    public void update(float dt){
        //dt in this case is GdxAI.getTimepiece().getDeltaTime();
        ship.update(dt);
    }

Класс SteeringEntity:

public SteeringEntity(Body body, float boundingRadius){
        this.body = body;
        this.boundingRadius = boundingRadius;

    }

    public void update(float dt){
        if(behavior != null){
            behavior.calculateSteering(steerOutput);
            applySteering(dt);
        }
    }

    private void applySteering(float dt){

        anyAccelerations = false;

        if(!steerOutput.linear.isZero()){
            force = steerOutput.linear.scl(dt);
            body.applyForceToCenter(force, true);
            anyAccelerations = true;
        }

        if(steerOutput.angular != 0){
            body.applyTorque(steerOutput.angular * dt, true);
            anyAccelerations = true;
        }

        if(anyAccelerations){
            velocity = body.getLinearVelocity();
            currentSpeedSquared = velocity.len2();
            if(currentSpeedSquared > maxLinearSpeed * maxLinearSpeed){
                body.setLinearVelocity(velocity.scl(maxLinearSpeed / (float) Math.sqrt(currentSpeedSquared)));
            }

            if(body.getAngularVelocity() > maxAngularSpeed){
                body.setAngularVelocity(maxAngularSpeed);
            }
        }
    }

    //Irrelevant overrides, most edited to be self explanatory i.e :
    @Override
    public Vector2 getLinearVelocity() {
        return body.getLinearVelocity();
    }

Я пытался использовать средство определения формы, чтобы показать фактическую близость, но ничего не отображаетсяИспользуя операторы печати, я могу определить, что близость не равна нулю и не равна нулю, что сбивает с толку.

...