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

2016/10/11

How to get a actor method into a world class

Horcruxia Horcruxia

2016/10/11

#
Hey i am new to programming and am trying to get a maethod from my airplane class into my world class to get it into another kind of world level without changing the world
My World Class
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import greenfoot.Actor;
/**
 * Write a description of class ArrrrrTheSeaofBarrels here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class ArrrrrTheSeaofBarrels extends World
{
    /**
     * Constructor for objects of class ArrrrrTheSeaofBarrels.
     * 
     */
    public ArrrrrTheSeaofBarrels()
    {    
       super(800, 600, 1);
       int barrelMeter=0;
       addObject(new Airplane(), 400, 300);
       level1();

       if (Airplane.barrelCollision()){                                                 HELP IN THIS LINE OF CODE
           barrelMeter++;
        }
       if (barrelMeter==10){
           level2();
           barrelMeter=0;
        }
       if (barrelMeter==6){
           level3();
           barrelMeter=0;
        }
       if (barrelMeter==4){
           level4();
           barrelMeter=0;
        } 
    }
    private void barrelCreator(){
       addObject(new Barrel(),Greenfoot.getRandomNumber(800),Greenfoot.getRandomNumber(600));
       addObject(new Barrel(),Greenfoot.getRandomNumber(800),Greenfoot.getRandomNumber(600));
    }
    public void level1(){
        barrelCreator();
        barrelCreator();
        barrelCreator();
        barrelCreator();
        barrelCreator();
    }
    public void level2(){
       removeObjects(getObjects(Airplane.class));
       addObject(new Airplane(), 400, 300);
       barrelCreator();
       barrelCreator();
       barrelCreator();
       addObject(new Misslie(), 250, 300);  
    }
    public void level3(){
       removeObjects(getObjects(Airplane.class));
       removeObjects(getObjects(Misslie.class));
       addObject(new Airplane(), 400, 300);
       barrelCreator();
       barrelCreator();
       addObject(new Misslie(), 250, 300); 
       addObject(new Misslie(), 550, 300);

    }
    public void level4(){
       removeObjects(getObjects(Airplane.class));
       removeObjects(getObjects(Misslie.class));
       removeObjects(getObjects(Misslie.class));
       addObject(new Airplane(), 400, 300);
       barrelCreator();
       addObject(new Misslie(), 250, 300); 
       addObject(new Misslie(), 550, 300);
       addObject(new Misslie(), 700, 300);   

}
My Airplane Class
[code]import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Airplane here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Airplane extends Actor
{
public Airplane()
    {
      GreenfootImage image = getImage();
      image.scale(image.getWidth() - 60, image.getHeight() - 30);
      setImage(image);
    }
/**
     * Act - do whatever the Airplane wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act()
    {
    planeMovement();
    barrelCollission();
    planeDeath();
    if (isAtEdge()){
        turn(180);
      }
    }
public void barrelCollission()
  {
   int barrelMeter = 0;
   if(isTouching(Barrel.class)){  
      removeTouching(Barrel.class);
      barrelMeter++;
    }
}
private void planeMovement()
{     move(7);
    if (Greenfoot.isKeyDown("left")){
        turn(-5);
    }
    if (Greenfoot.isKeyDown("right")){
        turn(5);
    }
    if (Greenfoot.isKeyDown("down")){
        turn(180);
    }
}
private void planeDeath(){
    if (isTouching(Misslie.class)){
        removeTouching(Misslie.class);
        getWorld().addObject(new Explosion(), getX(), getY());
        getWorld().removeObject(Airplane.this);
    }
 }
}
I am trying to get (barrelCollision()) into the barrelMeter++ if statement. pls help
danpost danpost

2016/10/12

#
Maybe if it was better structured. Possibly with the 'barrelMeter' field in the World subclass and a method in the same class to increment its value that you can call from the Airplane class:
// in Airplane class, when barrel is touched and removed
((ArrrrrTheSeaofBarrels)getWorld()).collision();

// in ArrrrrTheSeaofBarrels class
public void collision()
{
    barrelMeter++;
    if (getObjects(Barrel.class).isEmpty())
    {
        if (barrelMeter == 10) level2();
        else if (barrelMeter == 6) level3();
        else if (barrelMeter == 4) level4();
        else if (barrelMeter == 2) gameOver();
        barrelMeter = 0;
    }
}
Horcruxia Horcruxia

2016/10/12

#
so should i also put the Airplane.class barrelCollission() method into the world's collision() method?
Horcruxia Horcruxia

2016/10/12

#
wait it works but the world isnt going to the next "level"it is just doing nothing after i collect the first set of barrels
danpost danpost

2016/10/12

#
Horcruxia wrote...
wait it works but the world isnt going to the next "level"it is just doing nothing after i collect the first set of barrels
Please show your revised ArrrrrTheSeaofBarrels and Airplane classes.
Horcruxia Horcruxia

2016/10/13

#
world class
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import greenfoot.Actor;
/**
 * Write a description of class ArrrrrTheSeaofBarrels here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class ArrrrrTheSeaofBarrels extends World
{
    /**
     * Constructor for objects of class ArrrrrTheSeaofBarrels.
     * 
     */
    public ArrrrrTheSeaofBarrels()
    {    
       super(800, 600, 1);
       int barrelMeter=0;
       addObject(new Airplane(), 400, 300);
       level1();
       collision(); 
    }
    private void barrelCreator(){
       addObject(new Barrel(),Greenfoot.getRandomNumber(800),Greenfoot.getRandomNumber(600));
       addObject(new Barrel(),Greenfoot.getRandomNumber(800),Greenfoot.getRandomNumber(600));
    }
    public void level1(){
        barrelCreator();
        barrelCreator();
        barrelCreator();
        barrelCreator();
        barrelCreator();
    }
    public void level2(){
       removeObjects(getObjects(Airplane.class));
       addObject(new Airplane(), 400, 300);
       barrelCreator();
       barrelCreator();
       barrelCreator();
       addObject(new Misslie(), 250, 300);  
    }
    public void level3(){
       removeObjects(getObjects(Airplane.class));
       removeObjects(getObjects(Misslie.class));
       addObject(new Airplane(), 400, 300);
       barrelCreator();
       barrelCreator();
       addObject(new Misslie(), 250, 300); 
       addObject(new Misslie(), 550, 300);

    }
    public void level4(){
       removeObjects(getObjects(Airplane.class));
       removeObjects(getObjects(Misslie.class));
       removeObjects(getObjects(Misslie.class));
       addObject(new Airplane(), 400, 300);
       barrelCreator();
       addObject(new Misslie(), 250, 300); 
       addObject(new Misslie(), 550, 300);
       addObject(new Misslie(), 700, 300);   
    }
    public void collision()
    {
    int barrelMeter = 0;
    if (getObjects(Barrel.class).isEmpty())
    {
        barrelMeter++;
            if (barrelMeter == 10) level2();
        else if (barrelMeter == 16) level3();
        else if (barrelMeter == 20) level4();
        else if (barrelMeter == 22) gameOver();
    }
    }   
    public void gameOver()
    {
    System.out.println("Congardulations, You Win!!");


    }    
}
Airplane Code
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Airplane here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Airplane extends Actor
{
public Airplane()
    {
      GreenfootImage image = getImage();
      image.scale(image.getWidth() - 60, image.getHeight() - 30);
      setImage(image);
    }
/**
     * Act - do whatever the Airplane wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act()
    {
    planeMovement();
    barrelCollission();
    planeDeath();
    if (isAtEdge()){
        turn(180);
      }
    }
public void barrelCollission()
  {
   int barrelMeter = 0;
   if(isTouching(Barrel.class)){  
      removeTouching(Barrel.class);
      barrelMeter++;
    }
   ((ArrrrrTheSeaofBarrels)getWorld()).collision();
}
private void planeMovement()
{     move(4);
    if (Greenfoot.isKeyDown("left")){
        turn(-5);
    }
    if (Greenfoot.isKeyDown("right")){
        turn(5);
    }
    if (Greenfoot.isKeyDown("down")){
        turn(180);
    }
}
private void planeDeath(){
    if (isTouching(Misslie.class)){
        removeTouching(Misslie.class);
        getWorld().addObject(new Explosion(), getX(), getY());
        getWorld().removeObject(Airplane.this);
    }
 }
}
danpost danpost

2016/10/13

#
A couple of things, here. First, you do not want to call 'collision' from your world constructor. This would execute the 'touching' code (1) before any touching has been detected and (2) before any actors have had a chance to even act. Second, line 32 in the 'barrelCollision' method declares a local variable that will only exist for the execution of the method. A new variable will be declared each time the method executes. To make the variable exist between calls to the method (and until the Actor object no longer has any references to it in your project), move that line outside the method. You do not want to reset its value to zero each time the method is called, as well. From outside the method, each time an object of the class is created, a field with that name is given it and set to the assigned value (zero, in this case -- which is the default initial value for 'int' fields; so you could just make it:
private int barrelMeter;
). Then, that field will persist for as long as the object it belongs to persists.
You need to login to post a reply.