将相同内容显示在不同的Greenfoot世界

时间:2016-06-12 01:52:55

标签: greenfoot

对于Greenfoot决赛级项目,我决定制作一款名为“Doggie the Super Catcher”的游戏。这个游戏基本上做的是演员,狗狗,将尽力通过在屏幕上来回奔跑(通过用户的左右箭头键盘输入,抓住看起来从树上落下的三叶草和特殊款待,当然)。然而,问题是我想要创建多个级别,并且我希望我对第一个世界(名为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 个答案:

答案 0 :(得分:0)

在Greenfoot中,等级通常通过具有不同的世界来实现。所以你可能有:

class Level1 extends World
{
    ...
}

class Level2 extends World
{
     ...
}

它们都将直接出现在类图中的World下方。如果你想在你的关卡之间共享代码(例如它们都生成三元组),那么你可能想要一个共享的父类。所以你可能有:

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

然后你有两个级别的类,每个级别都扩展了DoggieWorld(不仅仅是普通的World),允许你从每个类调用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);
}

希望有所帮助