Original Post
Ok so my problem is in my game I have two enemies. One of them is human controlled and can shoot at will. The AI however, seems to be a little broken. In my shoot method in this class, which is the enemy class, I try to use the system for shooting that I used for the player and I call the shoot method in run so it continuously updates. I can get one shot off right at the beginning, but I can't shoot any more after that. I've tried everything I know...and now I'm basically stuck. I want to see if I can do more with this game but for weeks I've struggled to no avail trying to figure this out. Help please? It would be very appreciated. I can include the other classes if needed just ask. So maybe you can run the game to see what I mean.
[source lang="java"]package game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;
public class Enemy implements Runnable
{
int x;
int y;
int xDirection;
int yDirection;
int health;
int p1Score;
int pHealth = 10;
int bx;
int by;
boolean shot = false;
public static boolean readyToFire;
Rectangle enemy;
Rectangle bullet;
Player p1 = new Player(290, 15, 10);
public Enemy(int x, int y, int health)
{
p1Score = 0;
this.x = x;
this.y = y;
this.health = health;
Random r = new Random();
int rDir = r.nextInt(1);
if(rDir == 0)
{
rDir--;
setXDirection(rDir);
}
int yrDir = r.nextInt(1);
/*if(yrDir == 0)
{
yrDir--;
setYDirection(yrDir);
}
*/
enemy = new Rectangle(this.x, this.y, 100, 30);
}
public void draw(Graphics g)
{
//draw the enemy initially
g.setColor(Color.BLUE);
g.fillRect(enemy.x, enemy.y, enemy.width+5, enemy.height);
g.fillRect(enemy.x+45, enemy.y+25, 15, 30);
if(shot)
{
g.setColor(Color.BLUE);
g.fillRect(bullet.x+5, bullet.y-10, bullet.width, bullet.height);
}
//if the enemy dies remove it
//Need to delete the current one and make a new enemy
if(health <= 0)
{
enemy = new Rectangle(x, y, 100, 30);
health = 10 ;
}
}
/*
* Always seems to create the enemy bullet in the same place
*...need to figure a way for it to always fire
* if within range of the player
*/
public void shoot()
{
readyToFire = true;
if(!shot && enemy.x >= p1.x)
{
while(readyToFire)
{
shot = true;
readyToFire = false;
bullet = new Rectangle (enemy.x+45, enemy.y+65);
by = enemy.y+65;
bx = enemy.x+45;
bullet = new Rectangle(bx, by, 3 , 15);
System.out.println("Hi");
if(bullet.y >= 595)
{
bullet = new Rectangle(0, 0, 0, 0);
shot = false;
readyToFire = true;
}
}
}
bullet.y+=3;
}
public void collision()
{
//Collision between the bullet and the enemy.
//Checks first if the player bullet is null
//Checks if the bounds of bullet and enemy intersect
if(enemy.getBounds().intersects(p1.player))
{
setYDirection(-1);
}
if(p1.bullet != null && enemy.getBounds().contains(p1.bullet.getBounds()))
{
//setYDirection(-1);
p1Score+=100;
health-=1;
p1.bullet = new Rectangle(0, 0, 0, 0);
}
}
public void move()
{
enemy.x+=xDirection;
enemy.y+=yDirection;
//Checks if the enemy hits the left side of the screen
//if so reverse the direction to the right
if(enemy.x <= 0)
{
setXDirection(1);
}
//Checks if the enemy hits the right side of the screen
//if so reverse the direction to the left
if(enemy.x >= 700)
{
setXDirection(-1);
}
//Checks if the enemy hits the top of the screen
//if so reverse the direction to the bottom
if(enemy.y <= 30)
{
setYDirection(1);
}
//Checks if the enemy hits the bottom of the screen
//if so reverse the direction to the top
if(enemy.y >= 570)
{
setYDirection(-1);
}
}
public void run()
{
try
{
while(true)
{
move();
shoot();
collision();
Thread.sleep(3);
}
}
catch(Exception e){System.err.println(e.getMessage());}
}
public void setXDirection(int direction)
{
xDirection = direction;
}
public void setYDirection(int direction)
{
yDirection = direction;
}
public int getX()
{
return x;
}
public void setX(int x)
{
this.x = x;
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
public int getHealth()
{
return health;
}
public void setHealth(int health)
{
this.health = health;
}
public int getP1Score()
{
return p1Score;
}
public void setP1Score(int score)
{
p1Score = score;
}
public Player getP1()
{
return p1;
}
public void setP1(Player p1)
{
this.p1 = p1;
}
public Rectangle getEnemy()
{
return enemy;
}
public void setEnemy(Rectangle enemy)
{
this.enemy = enemy;
}
public int getXDirection()
{
return xDirection;
}
public int getYDirection()
{
return yDirection;
}
public int getPHealth()
{
return pHealth;
}
public void setPHealth(int health)
{
pHealth = health;
}
}[/source]
[source lang="java"]package game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;
public class Enemy implements Runnable
{
int x;
int y;
int xDirection;
int yDirection;
int health;
int p1Score;
int pHealth = 10;
int bx;
int by;
boolean shot = false;
public static boolean readyToFire;
Rectangle enemy;
Rectangle bullet;
Player p1 = new Player(290, 15, 10);
public Enemy(int x, int y, int health)
{
p1Score = 0;
this.x = x;
this.y = y;
this.health = health;
Random r = new Random();
int rDir = r.nextInt(1);
if(rDir == 0)
{
rDir--;
setXDirection(rDir);
}
int yrDir = r.nextInt(1);
/*if(yrDir == 0)
{
yrDir--;
setYDirection(yrDir);
}
*/
enemy = new Rectangle(this.x, this.y, 100, 30);
}
public void draw(Graphics g)
{
//draw the enemy initially
g.setColor(Color.BLUE);
g.fillRect(enemy.x, enemy.y, enemy.width+5, enemy.height);
g.fillRect(enemy.x+45, enemy.y+25, 15, 30);
if(shot)
{
g.setColor(Color.BLUE);
g.fillRect(bullet.x+5, bullet.y-10, bullet.width, bullet.height);
}
//if the enemy dies remove it
//Need to delete the current one and make a new enemy
if(health <= 0)
{
enemy = new Rectangle(x, y, 100, 30);
health = 10 ;
}
}
/*
* Always seems to create the enemy bullet in the same place
*...need to figure a way for it to always fire
* if within range of the player
*/
public void shoot()
{
readyToFire = true;
if(!shot && enemy.x >= p1.x)
{
while(readyToFire)
{
shot = true;
readyToFire = false;
bullet = new Rectangle (enemy.x+45, enemy.y+65);
by = enemy.y+65;
bx = enemy.x+45;
bullet = new Rectangle(bx, by, 3 , 15);
System.out.println("Hi");
if(bullet.y >= 595)
{
bullet = new Rectangle(0, 0, 0, 0);
shot = false;
readyToFire = true;
}
}
}
bullet.y+=3;
}
public void collision()
{
//Collision between the bullet and the enemy.
//Checks first if the player bullet is null
//Checks if the bounds of bullet and enemy intersect
if(enemy.getBounds().intersects(p1.player))
{
setYDirection(-1);
}
if(p1.bullet != null && enemy.getBounds().contains(p1.bullet.getBounds()))
{
//setYDirection(-1);
p1Score+=100;
health-=1;
p1.bullet = new Rectangle(0, 0, 0, 0);
}
}
public void move()
{
enemy.x+=xDirection;
enemy.y+=yDirection;
//Checks if the enemy hits the left side of the screen
//if so reverse the direction to the right
if(enemy.x <= 0)
{
setXDirection(1);
}
//Checks if the enemy hits the right side of the screen
//if so reverse the direction to the left
if(enemy.x >= 700)
{
setXDirection(-1);
}
//Checks if the enemy hits the top of the screen
//if so reverse the direction to the bottom
if(enemy.y <= 30)
{
setYDirection(1);
}
//Checks if the enemy hits the bottom of the screen
//if so reverse the direction to the top
if(enemy.y >= 570)
{
setYDirection(-1);
}
}
public void run()
{
try
{
while(true)
{
move();
shoot();
collision();
Thread.sleep(3);
}
}
catch(Exception e){System.err.println(e.getMessage());}
}
public void setXDirection(int direction)
{
xDirection = direction;
}
public void setYDirection(int direction)
{
yDirection = direction;
}
public int getX()
{
return x;
}
public void setX(int x)
{
this.x = x;
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
public int getHealth()
{
return health;
}
public void setHealth(int health)
{
this.health = health;
}
public int getP1Score()
{
return p1Score;
}
public void setP1Score(int score)
{
p1Score = score;
}
public Player getP1()
{
return p1;
}
public void setP1(Player p1)
{
this.p1 = p1;
}
public Rectangle getEnemy()
{
return enemy;
}
public void setEnemy(Rectangle enemy)
{
this.enemy = enemy;
}
public int getXDirection()
{
return xDirection;
}
public int getYDirection()
{
return yDirection;
}
public int getPHealth()
{
return pHealth;
}
public void setPHealth(int health)
{
pHealth = health;
}
}[/source]