I have a NullPointerException in lines 23 and 18 and im not sure what the error is.
Grabber code:
Vehicle Code:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class Grabber here.
*
* @author (your name)
* @version (a version number or a date)
*/
public abstract class Grabber extends Vehicle {
private Villager grabbed;
public Grabber(final VehicleSpawner origin) {
super(origin);
}
public void act() {
drive();
checkHitPedestrian();
}
public boolean checkHitPedestrian() {
final boolean isNewlyGrabbed = tryGrab();
if (grabbed.getWorld() == null){
grabbed = null;
}
if (grabbed != null && grabbed.getWorld() !=null) {
actionWithGrabbed(grabbed, isNewlyGrabbed);
}
return grabbed != null;
}
public Villager getGrabbed()
{
return grabbed;
}
private boolean tryGrab()
{
if (grabbed == null) {
final VehicleWorld world = (VehicleWorld)getWorld();
for (final Villager villager : getObjectsAtOffset((int)speed + getImage().getWidth() / 2, 0, Villager.class)) {
if (!world.isGrabbed(villager)) {
grabbed = villager;
return true;
}
}
}
return false;
}
/**
* Do whatever has to be done with the grabbed villager.
*
* This method is automatically called after checkHitPedestrian has grabbed onto a villager.
*
* @param grabbed the grabbed villager, must not be null.
* @param isNewlyGrabbed whether the villager has just been grabbed in this act.
*/
protected abstract void actionWithGrabbed(final Villager grabbed, final boolean isNewlyGrabbed);
public void releaseGrabbed() {
grabbed = null;
}
}
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();
}
if (bloodMooning)
{
speed = maxSpeed*2;
move (speed * direction);
}
else
{
speed = maxSpeed;
move (speed * direction);
}
}
/**
* 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;
}
}