greenfoot 中的静态方法
Static methods in greenfoot
所以对于我的 class,我必须使用 Greenfoot IDE。我的目标是:
“the pig eats all the mushrooms currently in the barrel”
猪将不得不调用桶的 getMushroom()
方法来找出桶当前存储了多少蘑菇。猪可以将这个数量加到它吃掉的蘑菇数中。请记住,蘑菇已经从世界上消失了——这发生在桶“储存它们”的时候。
但是,如果我尝试进入 Pig class 并使用 Barrel.getMushrooms();
,它会说无法从静态上下文中引用非静态方法 getMushrooms()
。
但是当我尝试使用像
这样的东西时
Barrel b1 = new Barrel();
b1.getMushrooms();
我的 shrooms 计数器永远不会正确..
Class桶
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();
}
}
Class猪
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();
}
}
}
使用 class 名称调用方法时,例如
Barril.getMushrooms()
您的方法应该耦合到您的 class 而不是实例。你会怎么做?通过使其成为 static
方法。
我假设您想在此上下文中使用一个实例方法,因此正确的方法是您提供的方法:
Barril b = new Barril();
b.getMushrooms();
不过想想。如果您刚刚创建对象,mushroomsStored
的值是多少?
...你猜对了。您甚至没有初始化它,所以默认情况下它将 return 值:0
您的猪需要参考桶 class。通常在 Greenfoot 中,class A 通过以下两种方式之一获取对 class B 的引用:
Class A 在创建时将引用传递给 B。如果 B 创建 A,这是典型的:例如,如果枪发射子弹,则枪将枪引用传递给子弹。
Class A 与 class B 相撞,例如您的玩家角色撞到收藏品,或敌人与您的玩家相撞。
我不确定,但我怀疑你属于情况 2,在这种情况下你想使用:
Barrel b = (Barrel)getOneIntersectingObject(Barrel.class);
当您不接触桶时,b
变量将为空,否则它将是一个桶 object,您可以在其上调用方法。
所以对于我的 class,我必须使用 Greenfoot IDE。我的目标是:
“the pig eats all the mushrooms currently in the barrel”
猪将不得不调用桶的 getMushroom()
方法来找出桶当前存储了多少蘑菇。猪可以将这个数量加到它吃掉的蘑菇数中。请记住,蘑菇已经从世界上消失了——这发生在桶“储存它们”的时候。
但是,如果我尝试进入 Pig class 并使用 Barrel.getMushrooms();
,它会说无法从静态上下文中引用非静态方法 getMushrooms()
。
但是当我尝试使用像
这样的东西时Barrel b1 = new Barrel();
b1.getMushrooms();
我的 shrooms 计数器永远不会正确..
Class桶
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();
}
}
Class猪
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();
}
}
}
使用 class 名称调用方法时,例如
Barril.getMushrooms()
您的方法应该耦合到您的 class 而不是实例。你会怎么做?通过使其成为 static
方法。
我假设您想在此上下文中使用一个实例方法,因此正确的方法是您提供的方法:
Barril b = new Barril();
b.getMushrooms();
不过想想。如果您刚刚创建对象,mushroomsStored
的值是多少?
...你猜对了。您甚至没有初始化它,所以默认情况下它将 return 值:0
您的猪需要参考桶 class。通常在 Greenfoot 中,class A 通过以下两种方式之一获取对 class B 的引用:
Class A 在创建时将引用传递给 B。如果 B 创建 A,这是典型的:例如,如果枪发射子弹,则枪将枪引用传递给子弹。
Class A 与 class B 相撞,例如您的玩家角色撞到收藏品,或敌人与您的玩家相撞。
我不确定,但我怀疑你属于情况 2,在这种情况下你想使用:
Barrel b = (Barrel)getOneIntersectingObject(Barrel.class);
当您不接触桶时,b
变量将为空,否则它将是一个桶 object,您可以在其上调用方法。