Im making a simulation and I want all of my actors under the Vehicle superclass to speed up when a "Blood Moon" event occurs but idk why my codes not speeding them up.
code relating to Blood Moon in World class:
Effect Code (Superclass)
BloodMoon class (subclass under Effect)
Vehicle class code:
public class VehicleWorld extends World
{
private GreenfootImage background;
// Color Constants
public static Color GREY_BORDER = new Color (108, 108, 108);
public static Color GREY_STREET = new Color (88, 88, 88);
public static Color YELLOW_LINE = new Color (255, 216, 0);
public static Color GREEN_STREET = new Color (114, 135, 0);
public static Color BROWN_LINE = new Color (101, 67, 33);
public static Color BROWN_BORDER = new Color (101, 67, 33);
// Instance variables / Objects
private boolean twoWayTraffic, splitAtCenter;
private int laneHeight, laneCount, spaceBetweenLanes;
private int[] lanePositionsY;
private VehicleSpawner[] laneSpawners;
//Static Variables
private static boolean bloodMooning;
/**
* Constructor for objects of class MyWorld.
*
*/
public VehicleWorld()
{
// Create a new world with 600x400 cells with a cell size of 1x1 pixels.
super(800, 600, 1, false);
setPaintOrder (Villager.class, EvilWitch.class, GoodWitch.class, Bus.class, Car.class, Ambulance.class, Prowler.class);
bloodMooning = false;
// set up background
GreenfootImage background = new GreenfootImage("background.png");
background.scale(getWidth(), getHeight());
setBackground(background);
// Set critical variables
laneCount = 6;
laneHeight = 48;
spaceBetweenLanes = 6;
splitAtCenter = false;
twoWayTraffic = false;
setActOrder(Pedestrian.class);
// Init lane spawner objects
laneSpawners = new VehicleSpawner[laneCount];
// Prepare lanes method - draws the lanes
lanePositionsY = prepareLanes (this, background, laneSpawners, 222, laneHeight, laneCount, spaceBetweenLanes, twoWayTraffic, splitAtCenter);
}
public void act () {
spawn();
}
private void spawn () {
// Chance to spawn a vehicle
if (Greenfoot.getRandomNumber (60) == 0){
int lane = Greenfoot.getRandomNumber(laneCount);
if (!laneSpawners[lane].isTouchingVehicle()){
int vehicleType = Greenfoot.getRandomNumber(5);
if (vehicleType == 0){
addObject(new Car(laneSpawners[lane]), 0, 0);
} else if (vehicleType == 1){
addObject(new Bus(laneSpawners[lane]), 0, 0);
} else if (vehicleType == 2){
addObject(new Ambulance(laneSpawners[lane]), 0, 0);
} else if (vehicleType == 3){
addObject(new Prowler(laneSpawners[lane]), 0, 0);
} else if (vehicleType == 4){
addObject(new RootedCorpse(laneSpawners[lane]), 0, 0);
}
}
}
// Chance to spawn a Pedestrian
if (Greenfoot.getRandomNumber (80) == 0){
int xSpawnLocation = Greenfoot.getRandomNumber (600) + 100; // random between 99 and 699, so not near edges
boolean spawnAtTop = true;//Greenfoot.getRandomNumber(2) == 0 ? true : false;
if (spawnAtTop){
addObject (new Villager (1), xSpawnLocation, 50);
} else {
addObject (new Villager (-1), xSpawnLocation, 550);
}
}
else if (Greenfoot.getRandomNumber (160) == 0){
int xSpawnLocation = Greenfoot.getRandomNumber (600) + 100; // random between 99 and 699, so not near edges
boolean spawnAtTop = true;//Greenfoot.getRandomNumber(2) == 0 ? true : false;
if (spawnAtTop){
addObject (new EvilWitch (1), xSpawnLocation, 50);
} else {
addObject (new EvilWitch (-1), xSpawnLocation, 550);
}
}
else if (Greenfoot.getRandomNumber (160) == 0){
int xSpawnLocation = Greenfoot.getRandomNumber (600) + 100; // random between 99 and 699, so not near edges
boolean spawnAtTop = true;//Greenfoot.getRandomNumber(2) == 0 ? true : false;
if (spawnAtTop){
addObject (new GoodWitch (1), xSpawnLocation, 50);
} else {
addObject (new GoodWitch (-1), xSpawnLocation, 550);
}
}
//BloodMoon Stuff
if (!bloodMooning && Greenfoot.getRandomNumber(240) == 0){
addObject (new BloodMoon(240), 400, 300);
bloodMooning = true;
}
if (bloodMooning && getObjects(BloodMoon.class).size() == 0){
bloodMooning = false;
}
}import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class effect here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Effect extends Actor
{
protected GreenfootImage image;
protected void fade (int timeLeft, int fadeTime){
double percent = timeLeft / (double)fadeTime;
int newTransparency = (int)(percent * 255);
image.setTransparency (newTransparency);
}
}
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.ArrayList;
/**
* Write a description of class BloodMoon here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class BloodMoon extends Effect
{
private int duration;
public BloodMoon (int duration){
this.duration = duration;
}
public void addedToWorld (World w){
image = drawSnow (w.getWidth(), w.getHeight(), 200);
setImage(image);
ArrayList<Vehicle> vehicles = (ArrayList<Vehicle>) w.getObjects(Vehicle.class);
for (Vehicle v : vehicles){
v.speedUp();
}
}
/**
* Act - do whatever the BloodMoon wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
if (duration == 0){
getWorld().removeObject(this);
} else if (duration <= 180){
fade (duration, 180);
}
duration--;
}
/**
* density should be 1-100. 100 will be almost completely white
*/
public static GreenfootImage drawSnow (int width, int height, int density){
Color[] swatch = new Color [64];
int red = 128;
int blue = 192;
for (int i = 0; i < swatch.length/2; i++){
swatch[i] = new Color (255, 0, 0);
}
for (int i = swatch.length/2; i < swatch.length; i++){
swatch[i] = new Color (255, 0, 0);
}
// The temporary image, my canvas for drawing
GreenfootImage temp = new GreenfootImage (width, height);
//temp.setColor (Color.BLACK);
//temp.fill();
// Run this loop one time per "density"
for (int i = 0; i < density; i++){
for (int j = 0; j < 150; j++){ // draw 100 circles
int randSize;
// Choose a random colour from my swatch, and set its tranparency randomly
int randColor = Greenfoot.getRandomNumber(swatch.length);;
int randTrans = Greenfoot.getRandomNumber(220) + 35; // around half transparent
temp.setColor (swatch[randColor]);
//setTransparency(randTrans);
// random locations for our dot
int randX = Greenfoot.getRandomNumber (width);
int randY = Greenfoot.getRandomNumber (height);
int tempVal = Greenfoot.getRandomNumber(250);
if (tempVal >= 1){
//randSize = 2;
temp.drawRect (randX, randY, 0, 0);
}else{
randSize = Greenfoot.getRandomNumber (2) + 2;
temp.fillOval (randX, randY, randSize, randSize);
}
// silly way to draw a dot..
}
}
return temp;
}
}
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* This is the superclass for Vehicles.
*
*/
public abstract class Vehicle extends SuperSmoothMover
{
protected double maxSpeed;
protected double speed;
protected int direction; // 1 = right, -1 = left
protected boolean moving;
protected int yOffset;
protected VehicleSpawner origin;
protected abstract boolean checkHitPedestrian ();
public Vehicle (VehicleSpawner origin) {
this.origin = origin;
moving = true;
if (origin.facesRightward()){
direction = 1;
} else {
direction = -1;
getImage().mirrorHorizontally();
}
}
public void addedToWorld (World w){
setLocation (origin.getX() - (direction * 100), origin.getY() - yOffset);
}
/**
* A method used by all Vehicles to check if they are at the edge.
*
* Note that this World is set to unbounded (The World's super class is (int, int, int, FALSE) which means
* that objects should not be stopped from leaving the World. However, this introduces a challenge as there
* is the potential for objects to disappear off-screen but still be fully acting and thus wasting resources
* and affecting the simulation even though they are not visible.
*/
protected boolean checkEdge() {
if (direction == 1)
{ // if moving right, check 200 pixels to the right (above max X)
if (getX() > getWorld().getWidth() + 200){
return true;
}
}
else
{ // if moving left, check 200 pixels to the left (negative values)
if (getX() < -200){
return true;
}
}
return false;
}
/**
* Method that deals with movement. Speed can be set by individual subclasses in their constructors
*/
public void drive()
{
boolean bloodMooning = VehicleWorld.isBloodMooning();
// Ahead is a generic vehicle - we don't know what type BUT
// since every Vehicle "promises" to have a getSpeed() method,
// we can call that on any vehicle to find out it's speed
Vehicle ahead = (Vehicle) getOneObjectAtOffset (direction * (int)(speed + getImage().getWidth()/2 + 4), 0, Vehicle.class);
if (ahead == null)
{
speed = maxSpeed;
} else {
speed = ahead.getSpeed();
}
move (speed * direction);
// what I need help on
if (bloodMooning)
{
speed = maxSpeed*3;
}
}
/**
* An accessor that can be used to get this Vehicle's speed. Used, for example, when a vehicle wants to see
* if a faster vehicle is ahead in the lane.
*/
public double getSpeed(){
return speed;
}
public void speedUp () {
speed = maxSpeed*3;
}
}