2011-05-10 78 views
1

删除对象比方说,一个图形世界,让说的世界API演员,我建立了一个对象,从类新名称食品演员固有但在某些情况下,我需要这个物体从我的世界中消失。 什么应该是一个很好的方法呢?问题在Java中

我尝试这样做:

public void killFood() 
    { 
      getWorld().removeObject(this); // >>>>>Kill any object that inherate from Food and operate this method. 
    } 

但它并没有杀死任何类型的对象从类中固有的食物......为什么?

我把它包(在食品类):

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方法&蘑菇类

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

没有看到removeObject()的实现,很难告诉你为什么removeObject()不起作用。 – EboMike 2011-05-10 21:59:25

+0

您可以发布方法'removeObject'的代码? – janhink 2011-05-10 22:00:06

+0

它在上面的API链接中... 链接:http://www.greenfoot.org/doc/javadoc/ – 2011-05-10 23:57:29

回答

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的作品。

+0

所以你说,getWorld()。removeObject(this);与'this'一起使用是否合法?如果它是一个图形界面,为什么当我使用killFood()时,食物固有的物品不会死亡,如果物品碰到地面? – 2011-05-10 22:13:13

+0

getWorld()。removeObject(this);很好。它会从您的世界中移除特定的食物。我不确定你为什么认为从食物中继承的物品会死亡。也许继承并不意味着你认为它的作用? – 2011-05-10 22:15:00

+0

现在我也了解了你,所以现在你可以修复我的代码(通过编辑你的代码),并告诉我如何解决它,以保证从食物中固有的类创建的每个对象将会死上楼吧?我真的需要它来理解它...... – 2011-05-10 22:18:37

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不会被删除包括:

  • 你的代码实际上不是呼吁cheezeburger act()
  • getWorld()返回一个不同的世界,为您期望,
  • ​​工作不正常,
  • 的Cheezeburger类(或超类)已经覆盖actcanMovekillFood一个d覆盖方法做错误的事情。

所有这些情况可以概括为“该错误是其他地方”。


假设你检查你的代码并不能发现问题,下一步应该是使用调试器来运行它,和单步它通过不工作,看看究竟发生什么事的代码。

+0

act()被接口自动调用 World.removeObject(...)测试其他类,直接从Actor演出,它的工作... Cheezeburger风格类做覆盖,但只在移动()类 所以我们只留下wi “可能的”getWorld()会向您期待的那个返回一个不同的世界“。你能再次检查我的编辑代码,并帮助我找到我的? thnx ;-) – 2011-05-11 00:00:55

+0

@Master C - 你发布的额外代码似乎不包含任何问题......假设'canMove'逻辑是正确的(我不能判断) – 2011-05-11 01:12:19

+0

我复制了canMove()方法从Actor类继承的其他类(Food是Actor的子类),因为其他类和Food都是从Actor继承的,并且因为canMove()可以正常工作,所以我认为Food应该是相同的。 但我仍然不明白为什么它不起作用... – 2011-05-11 01:41:04