I'm trying to make the player fire by holding down the mouse button, but every code I find comes with its own problems, from only firing one bullet per click, to never stopping firing, to firing continuously only if the mouse is moving. I'm honestly a bit at a loss.
Here's the code for the Player:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class Player here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Player extends Actor
{
private boolean shooting;
private int cooldown;
/**
* Act - do whatever the Player wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
movement();
fireBullet();
}
public void movement(){
if(Greenfoot.isKeyDown("d")){
setLocation(getX()+5, getY());
}
if(Greenfoot.isKeyDown("a")){
setLocation(getX()-5, getY());
}
if(Greenfoot.isKeyDown("w")){
setLocation(getX(), getY()-5);
}
if(Greenfoot.isKeyDown("s")){
setLocation(getX(), getY()+5);
}
if(atWorldEdgeX()){
if(getX()<10){
setLocation(10, getY());
} else {
setLocation(getWorld().getWidth()-10, getY());
}
}
if(atWorldEdgeY()){
if(getY()<10){
setLocation(getX(), 10);
} else {
setLocation(getX(), getWorld().getHeight()-10);
}
}
MouseInfo mouse = Greenfoot.getMouseInfo();
if (mouse != null)
{
turnTowards(mouse.getX(), mouse.getY());
}
}
public boolean atWorldEdgeX()
{
if(getX() < 10 || getX() > getWorld().getWidth() - 10)
return true;
else
return false;
}
public boolean atWorldEdgeY()
{
if(getY() < 10 || getY() > getWorld().getHeight() - 10)
return true;
else
return false;
}
public void fireBullet()
{
MouseInfo mouseInfo = Greenfoot.getMouseInfo();
if (cooldown == 0){
if (mouseInfo == null) return; // no change
if (shooting && (Greenfoot.mouseDragEnded(null) || Greenfoot.mouseClicked(null))) shooting = false;
if (!shooting && Greenfoot.mousePressed(null)) shooting = true;
if (shooting){
getWorld().addObject(new Bullet(), getX(), getY()); // firing bullet
Greenfoot.playSound("Laser_Shoot.wav");
cooldown = 10;
}
} else {
cooldown = cooldown -1;
}
}
}
