private GreenfootImage left = new GreenfootImage("left.png");
    private GreenfootImage right= new GreenfootImage("right.png");
    private int ySpeed;
    private int apexTimer;
    /**
     * Act - do whatever the FlappyBird wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        if (Greenfoot.isKeyDown("right") == true)
        {
            setLocation(getX() + 4, getY());
            setImage(right);
        }
        
        if (Greenfoot.isKeyDown("left") == true)
        {
            setLocation(getX() - 4, getY());
            setImage(left);
        }
        int groundLevel = getWorld().getHeight() - getImage().getHeight()/2;
        boolean onGround = (getY() == groundLevel);
        if (!onGround) // in middle of jump
        {
            if (ySpeed == 0 && apexTimer > 0) apexTimer--; // run apex timer
            if (ySpeed == 0 && apexTimer > 0) return; // apex timer still running
            ySpeed+=3; // adds gravity effect
            setLocation(getX(), getY()+ySpeed); // fall (rising slower or falling faster)
            if (getY()>=groundLevel) // has landed (reached ground level)
            {
                setLocation(getX(), groundLevel); // set on ground
                Greenfoot.getKey(); // clears any key pressed during jump
           }
        }
        else // on ground
        {
            if ("up".equals(Greenfoot.getKey())) // jump key detected
            {
                ySpeed = -15; // add jump speed
                setLocation(getX(), getY()+ySpeed); // leave ground
                apexTimer = 5;  // set apex timer (adjust value to suit)
            }
        }
        
        if (Greenfoot.isKeyDown("space") == true)
        {
           addObject(attack(), getX()+1,getY());
        }
    }    
}
  
            
          
        