Я довольно новичок в 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();
}
Я пытался использовать средство определения формы, чтобы показать фактическую близость, но ничего не отображаетсяИспользуя операторы печати, я могу определить, что близость не равна нулю и не равна нулю, что сбивает с толку.