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

2014/12/27

HELP! Transferring score counter from level 1 world class to level 2 world class while still keeping score

Starmadero Starmadero

2014/12/27

#
I'm making a game for my course, and I really need help as the deadline is fast approaching! I have a game that is almost fully functional apart from a few slight problems, this being one of the biggest. I have a working score counter, it increases correctly and displays correctly on level 1, but I don't know how to display the score on level 2 while still keeping the score from level 1. I'm still learning code and I suck with the terminology, so I politely ask if you guys could keep it simple for me! But firstly, when I try to display the counter on level 2, the game crashes when I touch the portal that takes me from level 1 to level 2. Code for my Main Character (Subject003), Score (ScoreTracker), Level 1 (SpaceShipLevel1), and Level 2 (SpaceShipLevel2) will be posted in this order. Here is the code for my main character
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Subject003 extends Characters
{
    private int x; // X variable
    private int y; // Y variable
    int speed = 2; // speed variable
    int reload = 0; // reload variable
    int abc = 0; // abc variable
    int gr = 0; // gr variable
    private int healthPoints = 1; // healthPoints variable
    public boolean poweredUp = false; // Default setting for poweredUp
    
    public Subject003() // When Subject003 hasn't picked up the Captive
    {
        // No instructions
    }
    
    public Subject003(boolean powerMeUp, int newSpeed, int newReload) // When Subject003 has picked up the captive
    {
        if(powerMeUp == true) // If Subject003 has picked up the powerup
        {
            speed = newSpeed; // Keep new increased speed
            reload = newReload; // Keep new increased reload
        }
    }
    
    public void act() 
    {
        checkKeys(); // Check which keys are pressed and move in the appropriate direction
        rotateImage(); // Rotate the image when the correct keys are pressed
        collision(); // Collide with Walls
        touchCaptive(); // Receive movement speed and firerate buff when Captive is touched
        touchPortal(); // Send to level 2 when touched
        damageTaken(); // Detect damage taken
        killed(); // Detect if health falls below 1
        touchControlPanel(); // Detect if intersecting with control panel
        touchInfectedDormous(); // Receive health buff when Captive2 is touched
        collectCheese(); // Increase the score by 25 when cheese is collected
    }    
    
    private void checkKeys() // Moves Subject003 in the direction of the arrow keys pressed.
    {
        if(Greenfoot.isKeyDown("up")) // Check if up arrow key is pressed
            {
                setLocation(getX(), getY() - speed); // Decrease position on Y axis to move upwards
            }
        if(Greenfoot.isKeyDown("down")) // Check if down arrow key is pressed
            {
                setLocation(getX(), getY() + speed); // Increase position on Y axis to move downwards
            }
        if(Greenfoot.isKeyDown("left")) // Check if left arrow key is pressed
            {
                setLocation(getX() - speed, getY()); // Decrease position on the X axis to move left
            }
        if(Greenfoot.isKeyDown("right")) // Check if right arrow key is pressed
            {
                setLocation(getX() + speed, getY()); // Increase position on the X axis to move right
            }
        if(Greenfoot.mouseClicked(null)) // Detect if the mouse is clicked
            {
                if(reload <= 0) // When reload is 0, a bullet can be fired
                {
                    getWorld().addObject(new DormousBullet(getRotation()),getX(),getY()); // Adds a new bullet object when moused is clicked and reload equals 0
                    reload = 80 - abc; // Reload resets to 80 every time mouse is clicked
                    Greenfoot.playSound("AWP.mp3"); // Play sound whenever mouse is clicked and reload equals 0
                }
            }
        reload--; // Decrease reload by 1 every act
    }
    
    private void rotateImage() // Rotate Subject003 in the direction of arrow keys pressed
    {
        if(Greenfoot.isKeyDown("down")) // Detect if down key is pressed
            {
                setRotation(180); // Rotate image by 180 degrees to the right
            }
        if(Greenfoot.isKeyDown("right"))
            {
                setRotation(90); // Rotate image 90 degrees to the right
            }
        if(Greenfoot.isKeyDown("left"))
            {
                setRotation(-90); // Rotate image 90 degrees to the left
            }
        if(Greenfoot.isKeyDown("up"))
            {
                setRotation(0); // Reset image to original position
            }
    }
    public void collision() // Collide with walls
    {
        if (getOneIntersectingObject(Wall2.class) != null) // Detect if intersecting with Wall2
            {
                setLocation(x,y); // Set location to X and Y
            }
        if (getOneIntersectingObject(Wall.class) != null) // Detect if intersecting with Wall
            {
                setLocation(x,y); // Set location to X and Y
            }
        else
            {
                x = getX(); // Get X position
                y = getY(); // Get Y position
            }
    }
    
    public void touchCaptive() // Receive buff if captive is touched
    {
        Actor Captive = getOneIntersectingObject(Captive.class);  // Detect if Captive is intersecting with Subject003
        if(Captive != null) // If Captive is detected
           {
               SpaceShipLevel1 no = (SpaceShipLevel1) getWorld(); // Get information from SpaceShipLevel1 world class
               no.Scoretracker.add(50); // Add 100
               speed += 1; // Increase speed by 1
               abc += 30; // Increase abc by 15
               poweredUp = true; // Whether or not Subject003 has picked up the captive
               Greenfoot.playSound("Wow.mp3"); // Play sound
               getWorld().removeObject(Captive); // Remove Captive
           }
    }
    
    public void killed() // When health falls below 1
    {
        healthPoints = healthPoints; // Detect healthPoints
        if(healthPoints <= 0) // If healthPoints fall below 1
        {
            Greenfoot.playSound("HITMARKER.mp3"); // Play sound
            Greenfoot.setWorld(new GameOver()); // Set world image to GameOver
        }
    }
    
    public void damageTaken() // Detect if damage has been taken
    {
        if(getOneIntersectingObject(GoblinBullet.class) != null) // If GoblinBullet is intersecting with Subject003
        {
            healthPoints -= 100; // Reduce healthPoints by 1
            getWorld().removeObject(getOneIntersectingObject(GoblinBullet.class)); // Remove the GoblinBullet
        }
    }
    
    public void touchPortal() // Detect if touching portal
    {
        if (getOneIntersectingObject(Portal.class) != null && poweredUp == false) // If Portal is intersecting with Subject003 and did not pick up Captive
        {
            Greenfoot.setWorld(new SpaceShipLevel2(poweredUp, speed, reload)); // Change level to SpaceShipLevel2 false
        }
        else if (getOneIntersectingObject(Portal.class) != null && poweredUp == true) // If Portal is intersecting with Subject003 and did pick up the captive
        {
            Greenfoot.setWorld(new SpaceShipLevel2(poweredUp, speed, reload)); // Change level to SpaceShipLevel2 true
        }
    }
    
    public void touchInfectedDormous() // Detect if touching Captive2
    {
        if (getOneIntersectingObject(Captive2.class) != null) // If Captive2 is intersecting with Subject003
        {
            if(gr == 0) // Only takes effect if variable gr equals 0
            {
                healthPoints += 100; // adds 100 healthPoint
                Greenfoot.playSound("Wow.mp3"); // Plays sound
                gr = 50; // Increase gr variable by 50
            }
        }
    }
    
    public void touchControlPanel() // Detect if touching control panel
    {
        if (getOneIntersectingObject(ControlPanel.class) != null) // If ControlPanel is intersecting with Subject003
        {
            Greenfoot.setWorld(new Win()); // Change level to Win
        }
    }
    
    public void collectCheese() // Increase score if cheese is collected
    {
        if (getOneIntersectingObject(Cheese.class) != null) // Detect if intersecting
            {
                SpaceShipLevel1 no = (SpaceShipLevel1) getWorld(); // Get information from SpaceShipLevel1 world class
                no.Scoretracker.add(25); // Add 25 to score
                getWorld().removeObject(getOneIntersectingObject(Cheese.class)); // Remove Cheese when intersecting with it
            }
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Code for my score counter
import greenfoot.*;  // (World, Actor, GreenfootImage, and Greenfoot)

import java.awt.Color;
import java.awt.Graphics;

public class ScoreTracker extends Counters
{
    private static final Color textColor = new Color(255, 180, 150);
    
    int value = 0;
    int target = 0;
    private String text;
    private int stringLength;

    public ScoreTracker(int currentScore)
    {
        this("");
        value = currentScore;
    }

    public ScoreTracker(String prefix)
    {
        text = prefix;
        stringLength = (text.length() + 2) * 10;

        setImage(new GreenfootImage(stringLength, 16));
        GreenfootImage image = getImage();
        image.setColor(textColor);
        updateImage();
    }
    
    public void act() {
        if(value < target) {
            value++;
            updateImage();
        }
        else if(value > target) {
            value--;
            updateImage();
        }
    }

    public void add(int score)
    {
        target += score;
    }

    public void subtract(int score)
    {
        target -= score;
    }

    public int getValue()
    {
        return value;
    }

    /**
     * Make the image
     */
    private void updateImage()
    {
        GreenfootImage image = getImage();
        image.clear();
        image.drawString(text + value, 1, 12);
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Code for Level 1
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class SpaceShipLevel1 extends World
{
    private static final int SIZE = 20; // Size of the array
    private int[][] mapArray = new int[SIZE][SIZE];
    private int[][] map = {
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,},
        {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,},
        {0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,},
        {0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,},
        {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0,},
        {0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,},
        {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0,},
        {0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,},
        {0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0,},
        {0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,},
        {0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,},
        {0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0,},
        {0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,},
        {0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,},
        {0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,},
        {0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,},
        {0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0,},
        {0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0,},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,}
    }; // Array of numbers representing Wall positions
    
    public ScoreTracker Scoretracker;
    
    public SpaceShipLevel1()
    {    
        super(800, 600, 1); // Sets world size
        Scoretracker = new ScoreTracker("Score: "); // Places Score tracker on screen
        fillArray(); // Sets the size of the array
        popMap(); // Seperates the Walls so they are not all on one position
        Switch(); // Add the switch that will control the removable walls
        collision2(); // Add two special removable walls
        place003(); // Add Subject003 on the map
        captive(); // Add the Captive which will buff Subject003 when touched
        portal(); // Add the portal which will take Subject003 to the next level
        spaceGoblin(); // Add the Goblins which will be trying to stop Subject003
        trackers(); // Places the score tracker
        cheese(); // Places the cheese collectibles
    }
    
        public void fillArray()
    {
        for (int j = 0; j < SIZE; j++)
        {
            for (int i = 0; i < SIZE; i++)
            {
                mapArray[i][j] = 1; // Allows for the array to be 2D along with easy size modification
            }
        }
    }
    
    public void popMap()
    {
       for (int j = 0; j < 20; j++)
       {
           for (int i = 0; i < 20; i++)
           {
               if (map[i][j] == 0)
               {
                   Wall block = new Wall(); // Adds the wall class
                   addObject(block, ((j * 40) + 15), ((i * 30) + 15));  // Adds the object while also seperating them
                }
            }
        }
    }
    
    public void place003()
    {
        addObject(new Subject003(),736, 580); // Adds Subject003 on the X, Y, axis
    }
    
    public void collision2()
    {
        addObject(new Wall2(), 695, 555); // Adds one of the special removable walls on the X, Y, axis
        addObject(new Wall2(), 135, 255); // Adds one of the special removable walls on the X, Y, axis
    }
    
    public void Switch()
    {
        addObject(new Switch(), 745, 59); // Adds the switch which will remove the walls on the X, Y, axis
    }
    
    public void captive()
    {
        addObject(new Captive(), 131, 323); // Adds the captive which will buff Subject003 when touched on the X, Y, axis
    }
    
    public void spaceGoblin()
    {
        addObject(new SpaceGoblin(), 450, 115); 
        addObject(new SpaceGoblin(), 320, 350); 
        addObject(new SpaceGoblin(), 100, 450); // Adds the Space Goblins which will try to kill Subject003 on the X, Y, axis
        addObject(new SpaceGoblin(), 450, 390); 
        addObject(new SpaceGoblin(), 450, 490); 
    }
    
    public void portal()
    {
        addObject(new Portal(), 655, 405); // Adds the portal which will take Subject003 to the next level on the X, Y, axis
    }
    
    public void trackers()
    {
       addObject(Scoretracker, 60, 380);
    }
    
    public void cheese()
    {
        addObject(new Cheese(), 708, 63);
        addObject(new Cheese(), 328, 134);
        addObject(new Cheese(), 656, 443);
        addObject(new Cheese(), 289, 195);
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Code for level 2
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class SpaceShipLevel2 extends World
{
    private static final int SIZE = 20; // Size of the array
    private int[][] mapArray = new int[SIZE][SIZE];
    private int[][] map = {
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
        {0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,},
        {0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0,},
        {0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,},
        {0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,},
        {0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0,},
        {0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0,},
        {0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0,},
        {0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0,},
        {0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0,},
        {0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0,},
        {0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,},
        {0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0,},
        {0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,},
        {0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0,},
        {0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0,},
        {0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0,},
        {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0,},
        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0,},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}
    }; // Array of numbers representing Wall positions
    
    public ScoreTracker Scoretracker;
    
    public SpaceShipLevel2()
    {    
        super(800, 600, 1);
        fillArray(); // Sets the size of the array
        popMap(); // Seperates the Walls so they are not all on one position
        populateWorld(); // Populates the world with Goblins, Subject003, Switch and Captive2
        Scoretracker = new ScoreTracker("Score: ");
    }
    
    public SpaceShipLevel2(boolean keepPowerUp, int currentSpeed, int currentReload) // If Subject003 picked up the Captive power up on level 1 use this method
    {
        super(800, 600, 1);
        fillArray(); // Sets the size of the array
        popMap(); // Seperates the Walls so they are not all on one position
        populateWorld(keepPowerUp, currentSpeed, currentReload); // Keep the current speed and reload from level 1
        Scoretracker = new ScoreTracker("Score: ");
    }

    public void fillArray()
    {
        for (int j = 0; j < SIZE; j++)
        {
            for (int i = 0; i < SIZE; i++)
            {
                mapArray[i][j] = 1; // Allows for the array to be 2D along with easy size modification
            }
        }
    }
    
    public void popMap()
    {
       for (int j = 0; j < 20; j++)
       {
           for (int i = 0; i < 20; i++)
           {
               if (map[i][j] == 0)
               {
                   Wall block = new Wall(); // Adds the wall class
                   addObject(block, ((j * 40) + 15), ((i * 30) + 15)); // Adds the object while also seperating them 
                }
            }
        }
    }
    
    public void populateWorld() // Populates the level with Subject003, SpaceGoblins, EngineControls, Portal2, switch and Wall2s
    {
        addObject(new Captive2(), 96, 344);
        addObject(new Portal2(), 55, 105);
        addObject(new Switch(), 626, 543);
        addObject(new SpaceGoblin(), 184, 494);
        addObject(new SpaceGoblin(), 93, 494);
        addObject(new SpaceGoblin(), 141, 468);
        addObject(new SpaceGoblin(), 719, 516);
        addObject(new SpaceGoblin(), 376, 371);
        addObject(new SpaceGoblin(), 556, 77);
        addObject(new SpaceGoblin(), 600, 78);
        addObject(new SpaceGoblin(), 651, 79);
        addObject(new SpaceGoblin(), 583, 213);
        addObject(new SpaceGoblin(), 551, 214);
        addObject(new ControlPanel(), 715, 555);
        addObject(new Subject003(), 55, 105);
        addObject(new Wall2(), 695, 465);
        //addObject(Scoretracker, 60, 380);
    }
    
    public void populateWorld(boolean powerUpSubject, int subjectSpeed, int subjectReload) // Populates the level with Subject003, SpaceGoblins, EngineControls, Portal2, switch and Wall2s
    {
        addObject(new Captive2(), 96, 344);
        addObject(new Portal2(), 55, 105);
        addObject(new Switch(), 626, 543);
        addObject(new SpaceGoblin(), 184, 494);
        addObject(new SpaceGoblin(), 93, 494);
        addObject(new SpaceGoblin(), 141, 468);
        addObject(new SpaceGoblin(), 719, 516);
        addObject(new SpaceGoblin(), 376, 371);
        addObject(new SpaceGoblin(), 556, 77);
        addObject(new SpaceGoblin(), 600, 78);
        addObject(new SpaceGoblin(), 651, 79);
        addObject(new SpaceGoblin(), 583, 213);
        addObject(new SpaceGoblin(), 551, 214);
        addObject(new ControlPanel(), 715, 555);
        addObject(new Subject003(powerUpSubject, subjectSpeed, subjectReload), 55, 105); // If boolean is true passes the previous values onto this level
        addObject(new Wall2(), 695, 465);
        //addObject(Scoretracker, 60, 380);
    }
If you got this far thank you very much for reading! And all the help offered is very much appreciated!
danpost danpost

2014/12/27

#
If you got this far thank you very much for reading!
Well, I only skimmed over it real quick. I saw you posted both world subclasses, the scoretracker, and the main character. I noticed how you declared the scoretrackers in both worlds and saw the code where the character goes to the second world when a portal is touched. As written, the touchePortal method could be simplified to this:
public void touchPortal() 
{
    if (getOneIntersectingObject(Portal.class) != null )
    {
        Greenfoot.setWorld(new SpaceShipLevel2(poweredUp, speed, reload));
    }
}
To pass the score to the new level, you can replace line 5 in my code above with this:
SpaceShipLevel2 level2 = new SpaceShipLevel2(poweredUp, speed, reload);
level2.Scoretracker.add(((SpaceShipLevel1)getWorld()).Scoretracker.getValue());
Greenfoot.setWorld(level2);
Unfortunatly, there are several places already in your main character class that looks to the world as a SpaceShipLevel1 object. You are going to run into problems once your level 2 world in initiated because 'getWorld' will no longer return a SpaceShipLevel1 object and cannot be assigned to a variable that is declared to hold one. What you could use is a 'super level support class' -- a class between the World class and your level world classes where you can have a constant location for methods and fields that are common to all worlds. For an example of this, refer to my Super Level Support Class scenario.
Starmadero Starmadero

2014/12/27

#
I feel honored being replied too by you! You've already helped me create this game so much already and now a personal response. Haha, thanks I will look into this!
Starmadero Starmadero

2014/12/27

#
I uploaded my scenario for you to look at completely. I don't think I have enough understanding of coding yet to implement your Super Level Support Class into my scenario yet. If you don't mind could you tell me why it currently doesn't work? I changed
    public void populateWorld() // Populates the level with Subject003, SpaceGoblins, EngineControls, Portal2, switch and Wall2s
    {
        addObject(new Captive2(), 96, 344);
        addObject(new Portal2(), 55, 105);
        addObject(new Switch(), 626, 543);
        addObject(new SpaceGoblin(), 184, 494);
        addObject(new SpaceGoblin(), 93, 494);
        addObject(new SpaceGoblin(), 141, 468);
        addObject(new SpaceGoblin(), 719, 516);
        addObject(new SpaceGoblin(), 376, 371);
        addObject(new SpaceGoblin(), 556, 77);
        addObject(new SpaceGoblin(), 600, 78);
        addObject(new SpaceGoblin(), 651, 79);
        addObject(new SpaceGoblin(), 583, 213);
        addObject(new SpaceGoblin(), 551, 214);
        addObject(new ControlPanel(), 715, 555);
        addObject(new Subject003(), 55, 105);
        addObject(new Wall2(), 695, 465);
        //addObject(Scoretracker, 60, 380);
    }
     
    public void populateWorld(boolean powerUpSubject, int subjectSpeed, int subjectReload) // Populates the level with Subject003, SpaceGoblins, EngineControls, Portal2, switch and Wall2s
    {
        addObject(new Captive2(), 96, 344);
        addObject(new Portal2(), 55, 105);
        addObject(new Switch(), 626, 543);
        addObject(new SpaceGoblin(), 184, 494);
        addObject(new SpaceGoblin(), 93, 494);
        addObject(new SpaceGoblin(), 141, 468);
        addObject(new SpaceGoblin(), 719, 516);
        addObject(new SpaceGoblin(), 376, 371);
        addObject(new SpaceGoblin(), 556, 77);
        addObject(new SpaceGoblin(), 600, 78);
        addObject(new SpaceGoblin(), 651, 79);
        addObject(new SpaceGoblin(), 583, 213);
        addObject(new SpaceGoblin(), 551, 214);
        addObject(new ControlPanel(), 715, 555);
        addObject(new Subject003(powerUpSubject, subjectSpeed, subjectReload), 55, 105); // If boolean is true passes the previous values onto this level
        addObject(new Wall2(), 695, 465);
        //addObject(Scoretracker, 60, 380);
    }
and removed the // from the Scoretrackers, I don't understand why removing these crashes my game completely. http://www.greenfoot.org/scenarios/12936 here is my scenario! Thank you so much for your help!
danpost danpost

2014/12/27

#
Well, if you are not going to maintain a common place for the fields and methods, then you will have to determine the type of world each time a method or field from any world is accessed. For example:
public void touchPortal() 
{
    if (getOneIntersectingObject(Portal.class) != null )
    {
        if (getWorld() instanceof SpaceShipLevel1)
        {
            Greenfoot.setWorld(new SpaceShipLevel2(poweredUp, speed, reload));
        }
    }
}
You can continue with 'else if' blocks for other world types. In a similar manner, this will have to be done everywhere you require a field or method in one of your world classes. By the way, I explained why it did not work when I wrote this:
You are going to run into problems once your level 2 world in initiated because 'getWorld' will no longer return a SpaceShipLevel1 object and cannot be assigned to a variable that is declared to hold one.
What I mean by that is that this:
SpaceShipLevel1 no = (SpaceShipLevel1) getWorld();
will fail if the actor is in an active world that is not of type SpaceShipLevel1. Just like you cannot assign a String to an int field, you cannot assign a SpaceShipLevel2 object to a SpaceShipLevel1 field. Also, ignoring the left side of the assignment in the line I just gave for an example, the right side will fail alone if getWorld returns an object that is not a SpaceShipLevel1 object because you are telling the compiler that it is of that type, but it really is not.
You need to login to post a reply.