// Gibt Gegner Position zur�ueck, die am naechersten ist, falls keiner im // Sichtfeld = null public Entity searchTarget() { ComponentMapper<PositionComponent> pm = ComponentMapper.getFor(PositionComponent.class); Entity result = null; ImmutableArray<Entity> entities = engine.getEntities(); float smallestDistance = sightRadius * sightRadius; float collisionDistance = 30f; for (Entity entity : entities) { // check if entity is a point of interest if (entity.getClass() == PointOfInterestEntity.class) { PointOfInterestEntity pie = (PointOfInterestEntity) entity; PositionComponent piePosition = pm.get(pie); // if the POI is a target and the distance < collision distance => collision if (team == Team.GREEN && pie.toString() == "target" && piePosition.position.dst2(pm.get(this).position) <= (collisionDistance * collisionDistance)) { // add a new green boid entity BoidEntity boidR = new BoidEntity(BoidEntity.Team.GREEN, engine, new EvadeState()); boidR.add(new PositionComponent()); pm.get(boidR).position = piePosition.position.cpy(); boidR.add(new VelocityComponent()); boidR.add(new RenderComponent()); boidR.add(new BoidCenterComponent()); boidR.add(new BoidDistanceComponent()); boidR.add(new BoidMatchVelocityComponent()); boidR.add(new RessourceComponent()); boidR.setPointOfInterest(pie); engine.addEntity(boidR); // heal the boid that collected the cross this.resetRessources(); // set new target position piePosition.position.set( MathUtils.random(0, Gdx.graphics.getWidth()), MathUtils.random(0, Gdx.graphics.getHeight())); } } if (entity.getComponent(BoidCenterComponent.class) == null) continue; BoidEntity currentBoid = (BoidEntity) entity; float newDistance = pm.get(this).position.dst2(pm.get(currentBoid).position); // Checke falls Gegner in Sicht => pursue Gegner if (this.team != currentBoid.team && newDistance < smallestDistance) { smallestDistance = newDistance; result = currentBoid; } } return result; }