So whenever my Creeper and Bullet class objects interact, they remove from the world and cause an error:java.lang.IllegalStateException: Actor not in world. An attempt was made to use the actor's location while it is not in the world. Either it has not yet been inserted, or it has been removed. I cannot figure out how to fix this, as i am still a little new to Greenfoot. Here is the Code for all my classes so far. Thank you in advance and all help is greatly appreciated.
Bullet:
Creeper Class:
Tower Class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | import greenfoot.*; import java.util.List; /** * Write a description of class Bullet here. * * @author (your name) * @version (a version number or a date) */ public class Bullet extends Actor { private Actor enemy; private int x= 0 ; public Bullet(Actor enemy) { this .enemy = enemy; } public void act() { setLocation(getX(), getY()); if (getX() >= getWorld().getWidth()- 1 ) { getWorld().removeObject( this ); } move( 1 ); ifAHit(); } //Track the enemy // public void move() // { // if ((getObjectsAtOffset(0,0,Creeper.class).isEmpty())) // { // int x=enemy.getX(); // int y=enemy.getY(); // turnTowards(x,y); // move(1); // } else { // move (1); // } // } public void ifAHit() { Actor creeper = getOneIntersectingObject(Creeper. class ); if (isTouching(Creeper. class )) { getWorld().removeObject(creeper); getWorld().removeObject( this ); if (atWorldEdge()) { getWorld().removeObject( this ); } } } public boolean atWorldEdge() { if (getX()< 1 ||getX()>getWorld().getWidth()- 10 ) { return true ; } if (getY()< 10 ||getY()>getWorld().getHeight()- 10 ) { return true ; } else return false ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import greenfoot.*; import java.util.ArrayList; public class Creeper extends Actor { int [] waypointX = { 120 , 119 , 91 , 92 , 42 , 42 , 120 , 120 , 175 }; int [] waypointY = { 29 , 58 , 57 , 77 , 77 , 105 , 105 , 153 , 153 }; int index= 0 ; int distance= 150 ; private int counter= 0 ;; private static final int max= 20 ; private int spawn= 0 ; public Creeper() { } public void act() { counter++; spawn++; if ((counter>= 20 )&&(spawn<=max)) { Creeper creeper = new Creeper(); World world = getWorld(); world.addObject(creeper, 0 , 29 ); counter= 0 ; } move(); } public void move() { move( 1 ); int theDistance = ( int )(Math.hypot(waypointX[index] - getX(), waypointY[index] - getY())); if (theDistance < 2 ) { for ( int i= 0 ;i<theDistance;i++) { distance=theDistance; index++; } } turnTowards(waypointX[index], waypointY[index]); if (counter>= 425 &&spawn>= 445 ) { getWorld().removeObject( this ); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.List; import java.util.ArrayList; /** * Write a description of class Tower here. * * @author (your name) * @version (a version number or a date) */ public class Tower extends Actor { private List<Creeper> enemies; private Actor closestEnemy; private int range; private int canShoot; private int count= 0 ; public Tower() { GreenfootImage tower = new GreenfootImage( 25 , 25 ); } public void act() { enemies = getObjectsInRange( 100 , Creeper. class ); System.out.println(count+ " (//X2)" ); System.out.println(canShoot+ " (//canShoot value)" ); System.out.println( "enemies " + enemies.size() + " (//enemies)" ); turnClosest(enemies); shootAt(); } public void turnClosest(List<Creeper> enemies) { Actor closest = null ; int distance= 100 ; if (enemies.size()> 0 ) { for ( int i= 0 ;i<enemies.size();i++) { Actor turtle = enemies.get(i); range=( int )(Math.hypot(turtle.getX() - getX(), turtle.getY()-getY())); if ((range<distance)) { closest=turtle; distance=range; } } System.out.println( "x = " + closest.getX() + " (//X axis)" ); int targetX=closest.getX(); int targetY=closest.getY(); closestEnemy = closest; turnTowards(targetX,targetY); } } public void shootAt( ) { canShoot= 15 ; count++; if (count>=canShoot) { getWorld().addObject( new Bullet(closestEnemy), getX(), getY()); if (count>=canShoot) { count= 0 ; } } } } |