对于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;
}
}
答案 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);
}
希望有所帮助