This site requires JavaScript, please enable it in your browser!
Greenfoot back
Tavi
Tavi wrote ...

2013/11/1

Dirty Actor not in world Error

Tavi Tavi

2013/11/1

#
Hi Guys ! I have some enemies who walk back and forth on platforms, however.. there are walls.. Now i have this bool method called checkLeftWall, and if it that is true it will activate stopByLeftWall.. That's all well and good.. However, now when this beasty of a piggie dies... It doesnt stop checking and i will get an Actor not in World error.. My question to the greenfoot Gods is this.. How can i adjust my code to make this work ? Here are my checking methods :
public boolean checkRightWalls()
    {
        int spriteWidth = getImage().getWidth();
        int xDistance = (int)(spriteWidth/2);

        Actor rightWall = getOneObjectAtOffset(xDistance, 0, Wall.class);

        if (rightWall == null) 
        {
            return false;
        }
        else
        {
            stopByRightWall(rightWall);
            return true;
        }
    }

    public void stopByRightWall (Actor rightWall)
    {
        int wallWidth = rightWall.getImage().getWidth();
        int newX = rightWall.getX() -(wallWidth + getImage().getWidth())/2;
        setLocation(newX - 2, getY());
    }

    public boolean checkLeftWalls()
    {
        int spriteWidth = getImage().getWidth();
        int xDistance = (int)(spriteWidth/2);

        Actor leftWall = getOneObjectAtOffset(-xDistance, 0, Wall.class);

        if (leftWall == null) 
        {            
            return false;
        }
        else
        {   
            stopByLeftWall(leftWall);
            return true;
        }
    }

    public void stopByLeftWall (Actor leftWall)
    {
        int wallWidth = leftWall.getImage().getWidth();
        int newX = leftWall.getX() +(wallWidth + getImage().getWidth())/2;
        setLocation(newX + 2, getY());
    }
And here is my piglet code :
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class RibbonPig here.
 * 
 * @author (Patrick van Kralingen) 
 * @version (0.8)
 */
public class RibbonPig extends Mob
{
    private int richting = 1;
    private int speed = 4;

    //Behaviour
    public int behaviourTimer = 10;
    public int actionRandomiser = 1;
    public int jumpStrength = -3;   
    
    
    //Eigenschappen 
    public double hp = 400.0;
   
    //Loot
    public int dropCalculator = 0;
    public int mesoValue = 0;
    public int throwingstarGenerator = 0;
    
    //XP 
    private XpBar currentXp;

    
    /**
     * SPRITES INLADEN
     **/
     //Idle left
    GreenfootImage[] idleLeft = new GreenfootImage[]
        {
            new GreenfootImage("ribbonPig_left_stand_0.png"),
            new GreenfootImage("ribbonPig_left_stand_1.png"),
            new GreenfootImage("ribbonPig_left_stand_2.png")
        };
        
     //Idle right   
    GreenfootImage[] idleRight = new GreenfootImage[]
        {
            new GreenfootImage("ribbonPig_right_stand_0.png"),
            new GreenfootImage("ribbonPig_right_stand_1.png"),
            new GreenfootImage("ribbonPig_right_stand_2.png")
        };   
        
    //Naar links lopen
    GreenfootImage[] animateLeft = new GreenfootImage[]
        {
            new GreenfootImage("ribbonPig_left_move_0.png"),
            new GreenfootImage("ribbonPig_left_move_1.png"),
            new GreenfootImage("ribbonPig_left_move_2.png")
        };
    //naar Rechts lopen    
    GreenfootImage[] animateRight = new GreenfootImage[]
        {
            new GreenfootImage("ribbonPig_right_move_0.png"),
            new GreenfootImage("ribbonPig_right_move_1.png"),
            new GreenfootImage("ribbonPig_right_move_2.png")
        };
        
    GreenfootImage[] dieLeft = new GreenfootImage[]
        {
            new GreenfootImage("ribbonPig_left_die1_0.png"),
            new GreenfootImage("ribbonPig_left_die1_1.png"),
            new GreenfootImage("ribbonPig_left_die1_2.png")
        };
        
    GreenfootImage[] dieRight = new GreenfootImage[]
        {
            new GreenfootImage("ribbonPig_right_die1_0.png"),
            new GreenfootImage("ribbonPig_right_die1_1.png"),
            new GreenfootImage("ribbonPig_right_die1_2.png")
        };
        
    GreenfootImage[] HitFaceLeft = new GreenfootImage[]
        {
            new GreenfootImage("ribbonPig_left_hit1_0.png")
        };
    GreenfootImage[] HitFaceRight = new GreenfootImage[]
        {
            new GreenfootImage("ribbonPig_right_hit1_0.png")
        };
    /**
     * Act - do whatever the RibbonPig wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public RibbonPig (XpBar xpbar)
    {
        currentXp = xpbar;
    }
    
    
    public void act() 
    {
        super.checkFall();
        super.timer();
        animate(sequence);
        checkTimer();
        behaviourTimer--;
        checkLeftWalls();
        checkRightWalls();
    }    
    
        public void animate(int sequence) {
        switch(sequence)
        {
            case 0:
            idle(richting);
            break;
            case 1:
            animateLeft();
            break;
            case 2: 
            animateRight();
            break;
            case 3: 
            die(richting);
            break;
            case 4: 
            hitFace(richting);
            break;
            default:
            break;
        }
    }
    
    
    
    /*************
           *Richting Checker
               **********/
    private void idle(int richting)
    {
        if(richting == 1)
        {
            animateIdleLeft();
        }
        if (richting == 2)
        {
            animateIdleRight();
        }
    }
    
    
     private void hitFace(int richting)
    {
        if(richting == 1)
        {
            animateHitFaceLeft();
        }
        if (richting == 2)
        {
            animateHitFaceRight();
        }
    }
    
    private void die(int richting)
    {
        if(richting == 1)
        {
            animateDieLeft();
        }
        if (richting == 2)
        {
            animateDieRight();
        }
    }
    
    /*************
       *
        *
         *
          *
           *ANIMATIONS
            *
             *
              *
               **********/
               
               
    public void animateIdleLeft()
    {
        if(frame == 1)
        {
            setImage(idleLeft[0]);
        }
        else if (frame == 2)
        {
            setImage(idleLeft[1]);
        }
        else if(frame == 3)
        {
            setImage(idleLeft[2]);
            frame = 0;
            return;
        }
    }
    
    public void animateIdleRight()
    {
        if(frame == 1)
        {
            setImage(idleRight[0]);
        }
        else if (frame == 2)
        {
            setImage(idleRight[1]);
        }
        else if(frame == 3)
        {
            setImage(idleRight[2]);
            frame = 0;
            return;
        }
    }
    
    public void animateRight()
    {
        if(frame == 1)
        {
            setImage(animateRight[0]);
        }
        else if (frame == 2)
        {
            setImage(animateRight[1]);
        }
        else if(frame == 3)
        {
            setImage(animateRight[2]);
            frame = 0;
            return;
        }
    }
    
    public void animateLeft()
    {
        if(frame == 1)
        {
            setImage(animateLeft[0]);
        }
        else if (frame == 2)
        {
            setImage(animateLeft[1]);
        }
        else if(frame == 3)
        {
            setImage(animateLeft[2]);
            frame = 0;
            return;
        }
    }
    
    public void animateDieLeft()
     {
        if(frame == 1)
        {
            setImage(dieLeft[0]);
        }
        else if (frame == 2)
        {
        }
        else if(frame == 3)
        {
        }
        else if(frame == 4)
        {
            setImage(dieLeft[1]);
        }
        else if(frame == 5)
        {
        }
        else if(frame == 6)
        {
        }
        else if(frame == 7)
        {
            setImage(dieLeft[2]);
            getImage().setTransparency(240);
        }
        else if(frame == 8)
        {
            setImage(dieLeft[2]);
            getImage().setTransparency(200);
        }
        else if(frame == 9)
        {
            setImage(dieLeft[2]);
            getImage().setTransparency(170);
        }
        else if(frame == 10)
        {
           removeAnimation();
           frame = 0;
           return;
        }
    }
    
    public void animateDieRight()
     {
        if(frame == 1)
        {
            setImage(dieRight[0]);
        }
        else if (frame == 2)
        {
        }
        else if(frame == 3)
        {
        }
        else if(frame == 4)
        {
            setImage(dieRight[1]);
        }
        else if(frame == 5)
        {
        }
        else if(frame == 6)
        {
        }
        else if(frame == 7)
        {
            setImage(dieRight[2]);
            getImage().setTransparency(240);
        }
        else if(frame == 8)
        {
            setImage(dieRight[2]);
            getImage().setTransparency(200);
        }
        else if(frame == 9)
        {
            setImage(dieRight[2]);
            getImage().setTransparency(170);
        }
        else if(frame == 10)
        {
           removeAnimation();
           frame = 0;
           return;
        }
    }
    
    public void animateHitFaceLeft()
    {
           if(frame == 1)
           {
               setImage(HitFaceLeft[0]);
               return;
            }
            
            else if(frame == 7)
           {
               frame = 0;
               return;
           }
           
    }
    
    public void animateHitFaceRight()
    {
           if(frame == 1)
           {
               setImage(HitFaceRight[0]);
               return;
            }
            
            else if(frame == 7)
            {
               frame = 0;
               return;
            }
           
    }
    
    public void  removeAnimation()
    {
        getWorld().removeObject(this);
    }
    
     /*************
       *
        *
         *
          *
           *BEHAVIOUR
            *
             *
              *
               **********/
     
     public void checkTimer()   
     {  
    if(behaviourTimer == 0)  
    {  
        behaviourTimer();  
    }  
    actionRandomiser();  
    }  
  
    public void behaviourTimer()  
    {  
    behaviourTimer =  Greenfoot.getRandomNumber(400) + 100; //  you may want a larger number here  
    actionRandomiser = Greenfoot.getRandomNumber(3);  
    }  
  
    public void actionRandomiser()  
    {  
    switch (actionRandomiser)  
    {  
        case 0:  
            speed = 0;  
            sequence = 0;  
            break;  
        case 1:  
            speed = 4;  
            sequence = 2;  
            moveRight();  
            richting = 2;  
            break;  
        case 2:  
            speed = 4;  
            sequence = 1;  
            moveLeft();  
            richting = 1;  
            break;  
        case 3:  
            speed = 0;  
            sequence = 3;
            break;
    }  
    }  
               
    public void moveRight()
    {
        setLocation(getX()+speed, getY());
    }
    
    public void moveLeft()
    {
        setLocation(getX()-speed, getY());
    }
    
    // Damage
     public void setRibbonPigDamage(int ribbonPigDamage){
         // this.ribbonPigDamage = ribbonPigDamage;
         // rev 02 - Temp value
         ribbonPigDamage = 20;
    }

    public int getRibbonPigDamage(){
        return 20;
        //return ribbonPigDamage;
    }
    
    //HIT
    /**
     * 
     */
    public void hit(double damage) {
        hp = hp - damage;
        if(hp <= 0) 
        {
            actionRandomiser = 3;
            createLoot();
            behaviourTimer = behaviourTimer + 200;
            Greenfoot.playSound("RibbonPig_Die.wav");
            currentXp.add(150);
        }
        else 
        {
            if ( damage >= 150)
            {
                sequence = 4;
                speed = 0;
                frame = 0;
                behaviourTimer = behaviourTimer + 200;
                 System.out.println(("HITFACE"));
                 System.out.println(("behaviourTimer = ") + behaviourTimer );
            }
        } 
    }
    
    
    //Loot Generator
    
    public void createLoot()
    {
        dropCalculator = Greenfoot.getRandomNumber(100);
        throwingstarGenerator = Greenfoot.getRandomNumber(100);
        if (dropCalculator >= 70)
        {
            mesoValue = Greenfoot.getRandomNumber(100) + 50;
            getWorld().addObject(new Meso(mesoValue), getX(), getY());
            Greenfoot.playSound("DropItem.wav");
        }
        else if (dropCalculator <= 3)
        {
            getWorld().addObject(new Claw1(), getX(), getY());
            Greenfoot.playSound("DropItem.wav");
        }
        
        else if (throwingstarGenerator <=5  )
        {
            getWorld().addObject(new WolbiDrop(), getX(), getY());
            Greenfoot.playSound("DropItem.wav");
        }
    }
}
    
Hope you guys can help :) Thank you !
danpost danpost

2013/11/1

#
The short answer:
if (getWorld() != null) checkLeftWalls();
You need to login to post a reply.