我有一个由一个子类定义的"生命栏",并在另一个子类中调用它,但由于某种原因,我和我的老师都无法更新它......有什么原因吗?
这是"生命条"方法,命名为 score:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.*;
/**
* Write a description of class Score here.
*
* @author James Brown
* @version 1.0
*/
public class Score extends Actor
{
Font font = new Font("Dialog", Font.BOLD, 20);
Color darkGreen = new Color(255, 51, 0);
Color green = new Color(255, 0, 0, 150);
GreenfootImage image = new GreenfootImage(100,30);
private int score = 3;
/**
* Score - sets up the score object
*/
public Score()
{
image.setFont(font);
setText();
setImage(image);
}
/**
* setText - sets the text of the score
*/
private void setText()
{
image.clear();
image.setColor(green);
image.drawString("Life:" + score, ShiftSouth(1,2), ShiftEast(15,2));
image.setColor(darkGreen);
image.drawString("Life:" + score, 1, 15);
}
/**
* updateScore - adds score then runs setText
*/
public void updateScore()
{
score--;
setText();
setImage(image);
}
/**
* ShiftSouth - shifts the coordinates down by the distance handed to it
* @param int p
* @param int distance
*/
public int ShiftSouth(int p, int distance){
return(p+distance);
}
/**
* ShiftEast - shifts the coordinates right by the distance handed to it
* @param int p
* @param int distance
*/
public int ShiftEast(int p, int distance){
return(p+distance);
}
public void setSpeed()
{
if(score>20)
{
Greenfoot.setSpeed(30);
}
}
}
下面是尝试调用一些"Lifebar"方法的类:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
* Write a description of class MachoMan here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class MachoMan extends Actor
{
public int life = 3;
Score score = new Score();
/**
* Act - do whatever the MachoMan wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
moveAround();
eat();
eatHulk();
}
public void moveAround()
{
move(2);
if (Greenfoot.getRandomNumber(100) <10)
{
turn(Greenfoot.getRandomNumber(90) -45);
}
if (getX() <=5 || getX() >= getWorld().getWidth()-5 )
{
turn(180);
}
if (getY() <=5 || getY() >= getWorld().getHeight()-5 )
{
turn(180);
}
}
public void eat()
{
Actor belt;
belt = getOneObjectAtOffset(0, 0, Belt.class);
if( belt != null)
{
World world;
world= getWorld();
world.removeObject(belt);
world.addObject(belt,Greenfoot.getRandomNumber(600), Greenfoot.getRandomNumber(400));
Greenfoot.playSound("Macho.wav");
life = life - 1;
score.updateScore();
}
}
public void eatHulk()
{
Actor hulk;
hulk = getOneObjectAtOffset(0, 0, Hulkamania.class);
if( hulk != null && life < 1)
{
World world;
world = getWorld();
world.removeObject(hulk);
Greenfoot.playSound("Macho.wav");
world.addObject(new GameOver(),300, 200);
Greenfoot.stop();
}
}
}
在 MachoMan 中,您可以创建一个 Score 对象,但不将其添加到世界中。 如果世界上有另一个 Score 对象,它不在同一对象中,因此它不会更新。 以下是一些解决方案:
- 让MachoMan创建乐谱,但使用
getWorld().addObject(...)
将其添加到世界中,以addedToWorld(World world)
方法 - 让大男子主义获取分数,在
addedToWorld(World world)
方法中使用getWorld().getObjects(Score.class).get(0)
- 如果你正在世界上创建 MachoMan 和分数,那么你可以先创建分数并将分数作为参数传递给 MachoMan的构造函数。