Back to project page libgdx-demo-pax-britannica.
The source code is released under:
Copyright (c) 2010 Ben Abraham, Renaud B?dard, Henk Boom, Daniel Burton, Matthew Gallant Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated ...
If you think the Android project libgdx-demo-pax-britannica listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package de.swagner.paxbritannica.bomber; // www .j av a2s .c o m import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import de.swagner.paxbritannica.Ship; import de.swagner.paxbritannica.Targeting; import de.swagner.paxbritannica.frigate.Frigate; public class BomberAI { private float APPROACH_DISTANCE = 210; private float COOLDOWN_DURATION = 0.6f; private float MAX_SHOTS = 4; private float cooldown_timer = 0; private float shots_counter = MAX_SHOTS; private int approach_sign = 1; float delta; // 0 = approach // 1 = turn // 2 = shoot // 3 = move_away private int state = 0; //recylce Vector2 target_direction = new Vector2(); public Ship target; private Bomber bomber; public BomberAI(Bomber bomber) { this.bomber = bomber; } public void retarget() { target = Targeting.getNearestOfType(bomber, 2); if (target == null) { target = Targeting.getNearestOfType(bomber, 3); } // if (target == null) { // target = Targeting.get_nearest_of_type(bomber, "bomber"); // } else // return; // if (target == null) { // target = Targeting.get_nearest_of_type(bomber, "fighter"); // } else // return; } public void reviseApproach() { if (MathUtils.random() < 0.5) { approach_sign = 1; } else { approach_sign = -1; } } public void update() { delta = Math.min(0.06f, Gdx.graphics.getDeltaTime()); if (target == null || !target.alive || MathUtils.random() < 0.005f) { Ship old_target = target; retarget(); if (old_target != null && target != null && old_target.id != target.id) { reviseApproach(); } } if (target != null) { float target_distance = target.collisionCenter.dst(bomber.collisionCenter); target_direction.set(target.collisionCenter).sub(bomber.collisionCenter).nor(); float unit_factor; if (target instanceof Frigate) { unit_factor = 0.6f; } else { unit_factor = 1; } if (target_distance > (APPROACH_DISTANCE + 50) * unit_factor) { state = 0; } // approach if (state == 0) { bomber.goTowards(target.collisionCenter, true); if (target_distance < APPROACH_DISTANCE * unit_factor) { reviseApproach(); state = 1; } } // turn else if (state == 1) { bomber.turn(-approach_sign); bomber.thrust(unit_factor * 0.75f); if (target_direction.dot(bomber.facing) < 0.5f) { state = 2; } } // shoot else if (state == 2) { bomber.turn(approach_sign * 0.05f); bomber.thrust(unit_factor * 0.75f); cooldown_timer -= delta; if (cooldown_timer <= 0) { bomber.shoot(approach_sign); cooldown_timer = COOLDOWN_DURATION; shots_counter -= 1; if (shots_counter == 0) { shots_counter = MAX_SHOTS; state = 3; } } } // move_away else if (state == 3) { bomber.goAway(target.collisionCenter, true); } } } }