让我们说一个图形世界,让我们说一个 World 的API和 Actor ,我建了一个对象来自 Actor 固有的新类名 Food ,但在某些情况下,我需要将对象从我的世界中消失。 什么应该是一个好方法呢?
我试过了:
public void killFood ()
{
getWorld().removeObject(this); // >>>>>Kill any object that inherate from Food and operate this method.
}
但它并没有杀死来自Food固有的Class的任何物体......为什么?
我用(
)包装它(在Food类中)public void act()
{
if (canMove())
move();
else
killFood();
}
public boolean canMove()
{
World myWorld = getWorld();
int x = getX();
int y = getY();
y--;
// test for outside border
if (x >= myWorld.getWidth() || y >= myWorld.getHeight())
return false;
else if (x < 0 || y < 0) // if out of the 1st quarter
return false;
return true; // if inside 1st quarter & borders it can be move.
}
但是物体并没有消失......为什么?
谢谢!
=============================================== =========================================== 编辑:canMove方法&amp;蘑菇类
public boolean canMove()
{
World myWorld = getWorld();
int x = getX();
int y = getY();
// test for outside border
if (x >= myWorld.getWidth() || y >= myWorld.getHeight()) {
return false;
}
else if (x < 0 || y < 0) {
return false;
}
return true;
}
public class Mushroom extends Food
{
private final int NEED_TOGO_LEFT = 3;
private int mushroomGotDown=0; // counter for regular +1 down steps
public void move()
{
mushroomGotDown++;
// if mushroom didn't got down 2 times, go down one time.
if (mushroomGotDown != NEED_TOGO_LEFT)
setLocation(getX() , getY() + 1);
else // mushroom got down twise, third will be 1 step left.
{
setLocation(getX() - 1 , getY());
mushroomGotDown=0;
}
}
} // end of class Mushroom
答案 0 :(得分:2)
我认为您的代码如下所示:
public abstract class Food {
...
public void killFood () {
getWorld().removeObject(this);
}
public void act() {
if (canMove()) {
move();
} else {
killFood();
}
}
}
public class Cheezeburger extends Food {
...
}
从表面上看,这应该有用。
为什么不去除cheezeburger的可能原因包括:
act()
,getWorld()
会返回与您期望的世界不同的世界,World.removeObject(...)
无法正常工作,act
或canMove
或killFood
,覆盖方法做错了。所有这些场景都可以概括为“错误在其他地方”。
假设您已经检查过代码而无法找到问题,那么下一步应该是使用调试器运行它,然后单步执行代码,看看实际上发生了什么。
答案 1 :(得分:1)
看起来getWorld().removeObject(this)
只会从您的世界中删除特定的实例。它不会从您的世界中删除特定类的所有实例。
您需要在要删除的类的每个特定实例上调用getWorld()。removeObject。
所以看看这是如何工作的尝试:
Food foo1 = new Food();
Food foo2 = new Food();
Food foo3 = new Food();
World world = new World();
world.add(foo1, ...); //Be sure to place each object in a distinct position so you can see each one.
world.add(foo2, ...);
world.add(foo3, ...);
//Now delete one.
foo1.killFood();
//one of th ethree should go away.
无论如何,从你的问题来看,我认为你把班级的实例与班级本身混为一谈。
这当然假设removeObject
有效。