2015-10-08 4 views
0

Итак, для моего класса я должен использовать IDE Greenfoot. И моя цель состоит в том, чтобы:Статические методы в greenfoot

«свинья ест все грибы в настоящее время в бочке»

Свиньи придется вызывать getMushroom() метод ствола, чтобы узнать, сколько грибов ствола в настоящее время магазины , Свиньи могут добавить это количество в количество съеденных грибов. Помните, что грибы уже ушли из мира - это случилось, когда ствол

Однако если попытаться перейти в класс свиней и использовать Barrel.getMushrooms(); он говорит, не статический метод getMushrooms() нельзя ссылаться из «хранить их.» статический контекст.

Но когда я попробовать использовать такие вещи, как

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

Мой счетчик с Shrooms никогда не работает правильно ..

Класс Barrel

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(); 
    } 
} 

Класс Pig

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(); 
     } 
    } 
} 
+0

@Bruce - Пожалуйста, прекратите предлагать изменения, у которых есть обратные образы, разбрызганные по всему. Backticks следует использовать только для встроенного кода. Редактирование, сделанное вами по этому вопросу, было * хорошим * использованием backticks, потому что вы использовали их для кода. Многие из ваших других изменений имеют обратные ссылки вокруг имен файлов и других вещей, которые им не нужны. Кроме того, не было необходимости в блоке цитат, который вы задали в этом вопросе. Все остальные могут игнорировать этот комментарий - я просто использую этот вопрос, чтобы предоставить некоторые отзывы редактору. – skrrgwasme

+0

@skrrgwasme - спасибо за полезную информацию. – Bruce

ответ

0

Ваша свинья нуждается в ссылке на класс ствола. Как правило, в Greenfoot, класс А получает ссылку на класс B в одном из двух способов:

  1. Класс A передается ссылка на B о создании. Это типично, если B создает A: например, если пушка стреляет из пулей, пистолет передает пистолет на пулю.

  2. Класс A сталкивается с классом B, например, персонаж вашего игрока попадает в коллекционер, или противник сталкивается с вашим игроком.

Я не уверен, но я подозреваю, что вы попадаете под случай 2, в этом случае вы хотите использовать:

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

Переменная b будет аннулирована, если вы не прикоснувшись к баррель, и в противном случае это будет объект Barrel, который вы можете назвать методами.

+0

Мне пришлось добавить if (b! = null) {b.getMushrooms();} –

0

Когда c используя метод с названием класса

Barril.getMushrooms() 

Ваш метод должен быть связан с вашим классом, а не с экземпляром. Как бы Вы это сделали? Сделав его методом static.

Я предполагаю, что вы хотите иметь метод экземпляра, используемый в данном контексте, так что правильный способ сделать это один вы представили:

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

Но думать об этом. Каково значение mushroomsStored, если вы только что создали свой объект?

... Вы догадались. Вы даже не инициализировали его, чтобы он возвращал значение по умолчанию: 0

+0

Точно! Я знал, что должен использовать Barrel b = new Barrel(); но моя ценность для хранения грибов была испорчена .. –

Смежные вопросы