In my Tower defense game, whenever my tower begins to shoot it will look at the closest enemy and shoot. After that, the tower will be looking at the closest enemy, but the bullet will move towards a different enemy.
Here is the Bullet and Tower class.
Tower superclass:
Bullets SuperClass:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.ArrayList;
import java.util.List;
/**
* Write a description of class Towers here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Towers extends Actor
{
MouseInfo mouse = Greenfoot.getMouseInfo();
public static int kind;
private boolean placed = false;
public List<Greeps> enemies;
private Actor closestEnemy;
int damage;
int fireRate;
int range;
int canShoot;
int count=0;
int posX = 10;
int posY= 10;
public Towers(int dmg, int rng, int fr)
{
this.damage=dmg;
this.range=rng;
this.fireRate=fr;
}
public void act()
{
enemies = getObjectsInRange(range,Greeps.class);
checkPlaced();
turnClosest(enemies);
}
/**
*turn to the closest enemy
*
* @param enemies A parameter
*/
public void turnClosest(List<Greeps>enemies)
{
Actor closest = null;
int distance=1000;
if(enemies.size()>0)
{
for(int i=0;i<enemies.size();i++)
{
Actor creep = enemies.get(i);
range=(int)(Math.hypot(creep.getX() - getX(), creep.getY()-getY()));
if((range<distance))
{
closest=creep;
distance=range;
}
}
closestEnemy = closest;
int targetX=closestEnemy.getX();
int targetY=closestEnemy.getY();
turnTowards(targetX,targetY);
}
}
/**
* Check if the tower is able to be placed
*
*/
public void checkPlaced()
{
if (!placed)
{
mouse = Greenfoot.getMouseInfo();
if (mouse != null)
{
posY=mouse.getY();
posX=mouse.getX();
setLocation (posX, posY);
if(Greenfoot.isKeyDown("esc")) getWorld().removeObject(this);
}
if (Greenfoot.mouseClicked(this))
{
setLocation(posX,posY);
placed=true;
}
}
}
}
import greenfoot.*;
import java.util.List;
import java.util.ArrayList;
/**
* Write a description of class Bullet here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Bullets extends Actor
{
public int bulletType;
private int x=0;
int dmg;
int rng;
int fr;
public int hp;
private Actor enemy;
public Counter2 moneyCounter;
private List<Counter2> myList= new ArrayList<Counter2>();
public Bullets(Actor enemy, Counter2 money)
{
this.enemy=enemy;
moneyCounter=money;
}
public void act()
{
move();
ifAtWorldEdge();
myList = getWorld().getObjects(Counter2.class);
moneyCounter = myList.get(0);
}
public void ifAtWorldEdge()
{
if(getX()<0)
{
getWorld().removeObject(this);
}
if(getX()>600)
{
getWorld().removeObject(this);
}
if(getY()<0)
{
getWorld().removeObject(this);
}
if(getY()>425)
{
getWorld().removeObject(this);
}
}
/**
* Bullet move towards a greep
*
*/
public void move()
{
if (enemy.getWorld()!=null)
{
int x=enemy.getX();
int y=enemy.getY();
turnTowards(x,y);
move(2);
} else {
move (2);
}
}
public void increaseMoney(Counter2 money)
{
Actor creeper=getOneIntersectingObject(Greeps.class);
Greeps greep=(Greeps)creeper;
moneyCounter=money;
if ((creeper!=null)&&(hp==0))
{
if(greep.type==1)
{
moneyCounter.add(10);
}
if(greep.type==2)
{
moneyCounter.add(15);
}
if(greep.type==3)
{
moneyCounter.add(20);
}
}
}
}
