I have a question
I am programming a game called box head
Unfortunately, the game gets slower or lags as I am playing it. How can I fix this problem?
I know that the problem is caused because too many methods are compiling at once.
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class Human here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Human extends Animal
{
int health = 50;
int healthrestore = 0;
int pistol = 0;
int SMG = 0;
int ShotGun = 0;
int Barrel = 0;
int ammo = 100;
int SMGammo = 150;
int Shotgunammo = 20;
private int direction;
/**
* Act - do whatever the Human wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
moveAround();
health();
healthrestore();
chooseGun();
showHealth();
}
public void moveAround()
{
if(Greenfoot.isKeyDown("up"))
{
setLocation(getX(), getY()-2);
setRotation(270);
}
if(Greenfoot.isKeyDown("down"))
{
setLocation(getX(),getY()+2);
setRotation(90);
}
if(Greenfoot.isKeyDown("right"))
{
setLocation(getX()+2, getY());
setRotation(0);
}
if(Greenfoot.isKeyDown("left"))
{
setLocation(getX()-2, getY());
setRotation(180);
}
if(Greenfoot.isKeyDown("up") && Greenfoot.isKeyDown("right"))
{
setLocation(getX()+2, getY()-2);
setRotation(315);
}
if(Greenfoot.isKeyDown("up") && Greenfoot.isKeyDown("left"))
{
setLocation(getX()-2, getY()-2);
setRotation(225);
}
if(Greenfoot.isKeyDown("down") && Greenfoot.isKeyDown("left"))
{
setLocation(getX()-2, getY()+2);
setRotation(135);
}
if(Greenfoot.isKeyDown("down") && Greenfoot.isKeyDown("right"))
{
setLocation(getX()+2, getY()+2);
setRotation(45);
}
}
public void health()
{
if(canSee(Zombie.class) || canSee(Fireball.class))
{
if(canSee(Zombie.class))
{
health = health - 10;
clear();
}
else if (canSee(Fireball.class))
{
health = health - 25;
clear();
eat(Fireball.class);
}
}
}
public void healthrestore()
{
healthrestore = healthrestore + 1;
if (healthrestore == 1000 && health < 50)
{
health = 50;
healthrestore = 0;
clear();
}
}
public void chooseGun()
{
displayMessage("Pistol: " + ammo, 30, 30, black, 15);
displayMessage("SMG: " + SMGammo, 30, 50, black, 15);
displayMessage("Shotgun: " + Shotgunammo, 30, 70, black, 15);
pistol = pistol + 1;
SMG = SMG + 1;
ShotGun = ShotGun + 1;
if(pistol > 30 && Greenfoot.isKeyDown("space"))
{
getWorld().addObject(new Bullet(), getX(),getY());
ammo = ammo - 1;
pistol = 0;
clear();
if(ammo <= 0)
{
clear();
displayMessage("reload the ammo", 30,30, black, 15);
}
}
if(SMG > 5 && Greenfoot.isKeyDown("z"))
{
getWorld().addObject(new Bullet(), getX(),getY());
SMGammo = SMGammo - 1;
SMG = 0;
clear();
}
if(ShotGun > 50 && Greenfoot.isKeyDown("x"))
{
getWorld().addObject(new Bullet(), getX(),getY());
Shotgunammo = Shotgunammo - 1;
ShotGun = 0;
clear();
}
if(Greenfoot.isKeyDown("r"))
{
ammo = 100;
SMGammo = 150;
Shotgunammo = 20;
clear();
}
}
public void showHealth()
{
displayMessage("Health: " + health, 1000, 50, black, 15);
if (health != health)
{
clear();
}
}
}import greenfoot.*;
import java.awt.*;// add so text can be added
import java.util.List;
import java.util.ArrayList;
/**
* ASD Revised Animal class
* last revision - Fall 2017
*
* ASD revised the code with updates for Color and Font classes
* This revision updates the code so that all Color and Font are updated with greenfoot.Color
* and greenfoot.Font per latest version (3.1.0) specifications
*
* Also for bold-ing the text, revisions had to be made:
* instead of Font font = new Font("bold", 1, size);
* --> changed to --> greenfoot.Font font = new greenfoot.Font("b",true,false, size);
*/
/**
* ASD Revised Animal class
* last revision - 12/13
*
* ASD has revised the Animal class to add additional functionality to Animal
* This revision has added methods for:
* 1) Having objects removed from the world by a different object.
* 2) Adding text to the screen by one or more actors:
*/
/**
* Animal. This is the base class for all animals. In addition to the standard Actor
* methods, it provides the ability to move and turn.
*
* @author Michael Kolling
* @version 1.0
*/
public class Animal extends Actor
{
private static final double WALKING_SPEED = 5.0;
// Below are variables added for the new text method - one GreefootImage variable (image) and color variables
public GreenfootImage image = null;
public greenfoot.Color black = new greenfoot.Color(0, 0, 0);
public greenfoot.Color white = new greenfoot.Color(255, 255, 255);
public greenfoot.Color red = new greenfoot.Color(255, 0, 0);
public greenfoot.Color blue = new greenfoot.Color(0, 0, 255);
public greenfoot.Color green = new greenfoot.Color(0, 255, 0);
public greenfoot.Color orange = new greenfoot.Color(255, 100, 0);
public greenfoot.Color lightBlue = new greenfoot.Color(0, 255, 255);
public greenfoot.Color pink = new greenfoot.Color(255, 0, 255);
public greenfoot.Color yellow = new greenfoot.Color(255, 255, 0);
public greenfoot.Color brown = new greenfoot.Color(100, 0, 0);
/**
* Constructor for Animal - nothing to do.
*/
public Animal()
{
}
/**
* Act - empty method. Animals have no default action.
*/
public void act()
{
}
/**
* Turn 'angle' degrees towards the right (clockwise).
*/
public void turn(int angle)
{
setRotation(getRotation() + angle);
}
/**
* Move forward in the current direction.
*/
public void move()
{
double angle = Math.toRadians( getRotation() );
int x = (int) Math.round(getX() + Math.cos(angle) * WALKING_SPEED);
int y = (int) Math.round(getY() + Math.sin(angle) * WALKING_SPEED);
setLocation(x, y);
}
/**
* Test if we are close to one of the edges of the world. Return true is we are.
*/
public boolean atWorldEdge()
{
if(getX() < 20 || getX() > getWorld().getWidth() - 20)
return true;
if(getY() < 20 || getY() > getWorld().getHeight() - 20)
return true;
else
return false;
}
/**
* Return true if we can see an object of class 'clss' right where we are.
* False if there is no such object here.
*/
public boolean canSee(Class clss)
{
Actor actor = getOneObjectAtOffset(0, 0, clss); // This is the original canSee() method collision command
//Actor actor = getOneIntersectingObject(clss); // ASD changed collision command so any part of objects will see or eat the other.
return actor != null;
}
/**
* Return true if we can see an object of class 'clss' right where we are.
* False if there is no such object here.
*/
public boolean canSee2(Class clss)
{
//Actor actor = getOneObjectAtOffset(0, 0, clss); // This is the original canSee() method collision command
Actor actor = getOneIntersectingObject(clss); // ASD changed collision command so any part of objects will see or eat the other.
return actor != null;
}
/**
* Try to eat an object of class 'clss'. This is only successful if there
* is such an object where we currently are. Otherwise this method does
* nothing.
*/
public void eat(Class clss)
{
Actor actor = getOneObjectAtOffset(0, 0, clss); //This is the original eat() method command
//Actor actor = getOneIntersectingObject(clss); // ASD changed collision command so any part of objects will see or eat the other.
if(actor != null) {
getWorld().removeObject(actor);
}
}
/**
* Try to eat an object of class 'clss'. This is only successful if there
* is such an object where we currently are. Otherwise this method does
* nothing.
*/
public void eat2(Class clss)
{
//Actor actor = getOneObjectAtOffset(0, 0, clss); //This is the original eat() method command
Actor actor = getOneIntersectingObject(clss); // ASD changed collision command so any part of objects will see or eat the other.
if(actor != null) {
getWorld().removeObject(actor);
}
}
/**
* ASD Remove Object Method added here.
* Remove one actor of a particular class. If there are multiple
* actors in the world from that class, it will remove the 1st actor
* in that class that was placed.
*/
public void removeObject(Class clss)
{
List<Actor> actors = getWorld().getObjects(clss);
int num = 0;
for(Actor c: actors) {
if(num == 0) {
num = 1;
getWorld().removeObject(c);
}
}
}
/**
* ASD Text Addition Method added here:
*/
public Actor access(java.lang.Class clss)
{
List<Actor> list = getWorld().getObjects(clss);
int num = 0;
Actor actor = null;
for(Actor a: list)
{
if(num == 0) {
num = 1;
actor = a;
}
}
return actor;
}
/**
* There are 2 different methods below both called dispalyMessage().
* Which one is used depends on the type of parameters
* that are typed in the actor with this method.
* The first one has a string as the first parameter.
* The second one has a number (int) has the first parameter.
* Both methods will need to have an x, y location, color and size.
*
* Example 1 starting with a string: displayMessage("Counter = " + count, 100, 50, black, 10);
* This example assumes that you have a int variable called count
* which is counting somewhere.
*
* Example 2 starting with an integer: displayMessage(count, 100, 50, black, 10);
* This example assumes that you have a int variable called count
* which is counting somewhere.
*/
/**
* This method displays the String "message" at the
* ints ("x", "y"), using existing Color variables,
* using the parameters in the method.
*/
public void displayMessage(String message, int x, int y, greenfoot.Color c, int size)
{
if(image == null)
{
image = new GreenfootImage(getWorld().getBackground());
}
GreenfootImage img = new GreenfootImage(getWorld().getBackground());
img.setColor(c); //This sets the drawing color of the image "img".
greenfoot.Font font = new greenfoot.Font("b",true,false, size);
img.setFont(font); //This sets the font of the image "img".
img.drawString(message, x, y); //This draws the string "message" onto the image "img".
getWorld().setBackground(img); //This sets the background of the world to "img".
}
/**
* This method calls the other displayMessage() method,
* turning the int "num" in the parameter into a String.
*/
public void displayMessage(int num, int x, int y, greenfoot.Color c, int size)
{
displayMessage("" + num, x, y, c, size);
}
/**
* This method sets the background of the world
* to the GreenfootImage "image" if it is not null.
* Basically this method clears all the text on the screen.
* Then new text can be written without writing over the old text.
* If multiple actors are writing text on the screen this method
* is used only once with the 1st actor that is writing.
*/
public void clear()
{
if(image != null) {
getWorld().setBackground(image);
}
}
}