【问题标题】:Static methods in greenfootgreenfoot 中的静态方法
【发布时间】:2015-10-08 04:15:44
【问题描述】:

所以对于我的课程,我必须使用 Greenfoot IDE。我的目标是:

“猪把桶里的蘑菇都吃光了”

猪必须调用桶的getMushroom() 方法来查明桶当前存储了多少蘑菇。猪可以将这个数量添加到它所吃蘑菇的数量中。请记住,蘑菇已经从世界上消失了——这发生在桶“储存它们”时。

但是,如果我尝试进入 Pig 类并使用 Barrel.getMushrooms();,它会说无法从静态上下文中引用非静态方法 getMushrooms()

但是当我尝试使用类似的东西时

Barrel b1 = new Barrel();
b1.getMushrooms();

我的蘑菇柜台永远不会正确..

类桶

 import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
 import java.util.List;

 /**
  * Write a description of class Barrel here.
  * 
  * @author (your name) 
  * @version (a version number or a date)
  */
 public class Barrel extends Actor
 {
     private final double SCALE_FACTOR_5 = 1.05;
     private final double SCALE_FACTOR_25 = 1.25;
     public int mushroomsStored;
     private int ns;

     public Barrel() {
         mushroomsStored = 0;
         ns = 0;
     }

     /**
      * Main method of Barrel
      */
     public void act() {
         followMouse();
         storeMushrooms();
         reset();
     }  

     /**
      * Follows mouse drag-and-drop motion.
      */
     public void followMouse() {
         if(Greenfoot.mouseDragged(this)) {
             MouseInfo mouse = Greenfoot.getMouseInfo();
             setLocation(mouse.getX(), mouse.getY());
         }
     }

     /**
      * Eats nearby mushrooms when dropped.
      * Increases its current image scale by 5% when it eats one mushroom.
      * Increases its current image scale by 25% when it eats five mushrooms.
      * If this barrel stores more than 10 mushrooms, this barrel has itself removed from
      * this world.
      */
     public void storeMushrooms() {
         if(Greenfoot.mouseDragEnded(this)) {
             List<Mushroom> nearby = getObjectsInRange(75, Mushroom.class);
             ns = nearby.size();
             for(Mushroom m : nearby) {
                 getWorld().removeObject(m);
                 mushroomsStored++;
             }
             if(ns < 5 ) {
                 GreenfootImage img = getImage();
                 int width = (int)(img.getWidth() * SCALE_FACTOR_5);
                 int height = (int)(img.getHeight() * SCALE_FACTOR_5);
                 img.scale(width, height);
             }
             if (ns >= 5) {
                 GreenfootImage img = getImage();
                 int width = (int)(img.getWidth() * SCALE_FACTOR_25);
                 int height = (int)(img.getHeight() * SCALE_FACTOR_25);
                 img.scale(width, height);
             }
             if(mushroomsStored == 10) {
                 getWorld().removeObject(this);
             }
         }
     }

     /**
      * Returns this barrel to its original (x,y) location and its
      * original image scale.
      */
     public void reset() {
         if(Greenfoot.mouseClicked(this)) {
             MouseInfo mouse = Greenfoot.getMouseInfo();
             if(mouse.getButton() == 3) {
                 this.setLocation(565, 350);
                 setImage(new GreenfootImage("barrel.png"));
                 mushroomsStored = 0;
             }
         }
     }

     /**
      * Returns how many mushrooms this barrel has stored.
      */
     public int getMushrooms() {
         return mushroomsStored;
     }

     /**
      * Automatically called by Greenfoot whenever a Barrel object
      * is placed in a world. In this assigment, we use it to remember
      * the initial state of this barrel - its (x,y) position and its
      * original image size.
      */
     public void addedToWorld(World world) {
         GreenfootImage img = new GreenfootImage("barrel.png");
         setImage(img);
         final int originalX = getX();
         final int originalY = getY();
         final int originalWidth = img.getWidth();
         final int originalHeight = img.getHeight();
     }
 }

类猪

 import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

 /**
  * Write a description of class Pig here.
  * 
  * @author (your name) 
  * @version (a version number or a date)
  */
 public class Pig extends Actor
 {
     /** Keeps track of how many mushrooms this pig has eaten. */
     private int shrooms;

     /** 
      * Constructs a Pig object and initializes it as having
      * eaten no mushrooms. 
      */
     public Pig() {
         shrooms = 0;
     }

     /**
      * Follows the mouse movement and eats mushrooms on mouse clicks.
      * Stops the scenario once this pig has eaten at least 15 mushrooms.
      */
     public void act() 
     {
         followMouse();
         eatMushrooms();
         getMS();
     }

     public void getMS() {
         b
     }

     public void followMouse() {
         if (Greenfoot.mouseMoved(null)) {
             MouseInfo mouse = Greenfoot.getMouseInfo();
             setLocation(mouse.getX(), mouse.getY());
         }
     }

     public void eatMushrooms() {
         if (Greenfoot.mouseClicked(null)) {
             Mushroom m = (Mushroom) getOneIntersectingObject(Mushroom.class);
             if (m != null) {
                 shrooms++;
                 getWorld().removeObject(m);
             }
         }
         if (shrooms > 29) {
             Greenfoot.stop();
         }
     }
 }

【问题讨论】:

  • @Bruce - 请停止建议到处都是反引号的编辑。反引号只能用于内联代码。您对这个问题所做的编辑是对反引号的很好使用,因为您将它们用于代码。您的许多其他编辑在文件名和其他不需要它们的东西周围都有反引号。此外,您在此问题中不需要引用块。其他人可以忽略此评论 - 我只是使用此问题向编辑提供一些反馈。
  • @skrrgwasme - 感谢您提供有用的信息。

标签: java ide greenfoot


【解决方案1】:

你的猪需要一个桶类的引用。通常在 Greenfoot 中,A 类通过以下两种方式之一获得对 B 类的引用:

  1. 类 A 在创建时传递对 B 的引用。如果 B 创建 A,这很典型:例如,如果枪发射子弹,枪会传递枪对子弹的引用。

  2. A 类与 B 类发生碰撞,例如您的玩家角色撞到了收藏品,或者敌人与您的玩家发生了碰撞。

我不确定,但我怀疑你属于情况 2,在这种情况下你想使用:

Barrel b = (Barrel)getOneIntersectingObject(Barrel.class);

b 变量在您不接触桶时将为空,否则它将是您可以调用方法的 Barrel 对象。

【讨论】:

  • 我确实必须添加 if(b != null) {b.getMushrooms();}
【解决方案2】:

当调用类名如

的方法时
Barril.getMushrooms()

您的方法应该与您的类而不是实例耦合。你会怎么做?通过使其成为static 方法。

我假设您希望在此上下文中使用一个实例方法,因此正确的方法是您提供的方法:

Barril b = new Barril();
b.getMushrooms();

但是想一想。如果您刚刚创建了对象,mushroomsStored 的值是多少?

... 你猜对了。你甚至没有初始化它,所以它会默认返回值:0

【讨论】:

  • 没错!我知道我应该使用 Barrel b = new Barrel();但是我储存的蘑菇的价值全都搞砸了..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多