Отображение одного и того же содержимого в другом мире Greenfoot

Для проекта финального класса Greenfoot я решил создать игру под названием "Песик Супер Ловец снов". В основном эта игра состоит в том, что актер, Песик, будет стараться поймать клевер и специальные угощения, которые, кажется, падают с деревьев, бегая взад-вперед по экрану (через ввод левой и правой клавиш клавиатуры, конечно). Однако дело в том, что я хочу создать несколько уровней, и я хочу, чтобы то, что у меня было, чтобы первый мир (названный GameWorld) появился на уровне 1, который находится в другом мире. Как я должен это сделать? Другими словами, я не могу передать те же вещи из GameWorld на Level1, который включает в себя клевер, конфеты и табло, когда выполняется определенное условие (то есть достигается определенное количество очков)? К вашему сведению: я использовал отдельного актера для табло (надеюсь, это поможет...). Кто-нибудь из вас знает способ? Благодарю.

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

public class Doggie extends Actor
{

// Declare arrays of Greenfoot images for animation
private GreenfootImage[] runningLeft;
private GreenfootImage[] runningRight;

// Declare Greenfoot images for standing still facing left and right
private GreenfootImage standingStill;
private GreenfootImage standingLeft;
private GreenfootImage standingRight;

// 
boolean facingLeft;

// Integers that help control the speed of movement and animation
private int animationCounter;
private int animationDelay;
private int animationDelayCounter;
private int animationSpeed;

Clover c;
SpecialTreat1 c1;
SpecialTreat2 c2;

public Doggie()
{
    String fileName;
    String fileNamePrefix = "left0";
    String fileNameSuffix = ".png";

    runningLeft = new GreenfootImage[3];
    runningRight = new GreenfootImage[3];

    for (int imageCounter = 0; imageCounter < runningLeft.length; imageCounter++)
    {
        fileName = fileNamePrefix + (imageCounter + 1) + fileNameSuffix;
        runningLeft[imageCounter] = new GreenfootImage(fileName);
        runningRight[imageCounter] = new GreenfootImage (runningLeft[imageCounter]);
        runningRight[imageCounter].mirrorHorizontally();
    }

    standingStill = new GreenfootImage ("still01.png");
    standingLeft = new GreenfootImage ("left01.png");
    standingRight = new GreenfootImage (standingLeft);
    standingRight.mirrorHorizontally();

    facingLeft = true;

    animationSpeed = 5;

    animationDelay = 6;

    animationDelayCounter = 0;

    animationCounter = 0;
}

/**
 * Act - do whatever the Doggie wants to do. This method is called whenever
 * the 'Act' or 'Run' button gets pressed in the environment.
 */
public void act() 
{
    animationDelayCounter++;
    if (animationDelayCounter == animationDelay)
    {
        animationCounter++;
        animationDelayCounter = 0;
    }

    if (animationCounter > runningRight.length - 1)
        animationCounter = 0;

    c = (Clover)getOneIntersectingObject(Clover.class);
    c1 = (SpecialTreat1)getOneIntersectingObject(SpecialTreat1.class);
    c2 = (SpecialTreat2)getOneIntersectingObject(SpecialTreat2.class);

    if (c != null)
    {
        c.collect();
        GameWorld gW = (GameWorld)getWorld();
        gW.showPoints();
    }

    if (c1 != null)
    {
        c1.collect();
        GameWorld gW = (GameWorld)getWorld();
        gW.showPoints();
    }

    if (c2 != null)
    {
        c2.collect();
        GameWorld gW = (GameWorld)getWorld();
        gW.showPoints();
    }
}

public void runLeft()
{
    if (!(facingLeft))
        animationCounter = 0;

    facingLeft = true;

    setImage (runningLeft[animationCounter]);
    setLocation (getX() - animationSpeed, getY());
}

public void runRight()
{
    if (facingLeft)
        animationCounter = 0;

    facingLeft = false;

    setImage (runningRight[animationCounter]);
    setLocation (getX() + animationSpeed, getY());
}

public void standStill()
{
    if (facingLeft)
    {   
        setImage(standingLeft);
    }
    else
        setImage(standingRight);
    animationCounter = 0;
    animationDelayCounter = 0;
}

}

1 ответ

Решение

В Greenfoot уровни обычно реализуются с помощью разных миров. Таким образом, вы могли бы иметь:

class Level1 extends World
{
    ...
}

А также

class Level2 extends World
{
     ...
}

Они оба появятся прямо под Миром на диаграмме классов. Если вы хотите поделиться кодом между вашими уровнями (например, они оба порождают клевер), то вам, вероятно, нужен общий родительский класс. Таким образом, вы могли бы иметь:

class DoggieWorld extends World
{
    public void spawnClovers(int speed)
    {
        if (Greenfoot.getRandomNumber(1000) < speed)
            addObject(new Clover(), Greenfoot.getRandomNumber(getWidth()), 0);
    }
}

Затем у вас есть два уровня классов, каждый из которых расширяет DoggieWorld (а не просто мир), позволяя вам вызывать метод spawnClovers из каждого:

class Level1 extends DoggieWorld
{
    public void act()
    {
        spawnClovers(20);
    }
}

class Level2 extends DoggieWorld
{
    public void act()
    {
        spawnClovers(50);
    }
}

Я не хочу делать этот ответ слишком длинным, но надеюсь, что это дает общую идею: иметь общий родительский мировой класс, от которого наследуются оба класса уровня (используя extends), и тогда оба класса уровня могут вызывать методы из общего родителя.

Редактировать: извините, я думаю, я просто более четко понял, что вы также хотите перемещать актеров между мирами при переключении уровня. Вы можете сделать это, пройдя через всех актеров интересующего вас типа, удалив их из существующего мира и добавив их в новый мир. Например, включите этот метод в Level1:

public void changeLevel()
{
    World nextLevel = new Level2();
    for (Clover c : getObjects(Clover.class))
    {
        // Must ask for position before removing from world:
        int x = c.getX();
        int y = c.getY();
        removeObject(c);
        nextLevel.addObject(c, x, y);
    }
    Greenfoot.setWorld(nextLevel);
}

надеюсь, это поможет

Другие вопросы по тегам