2014-04-21 132 views
-2

我从静态上下文引用的非静态变量有一些问题,我不知道如何更改我的方法来解决它。静态和非静态问题

第一个是这个,这是应该的射手已经在发射时刻的位置产卵子弹:

World.addObject(new bulletH(), (int)posX , (int)posY); 

而且去除子弹,当他们离开这个世界没有按触发“T工作:

if(posX<0 || posX> getWorld().getWidth() || posY <0 || posY > getWorld().getHeight()){ 
     World.removeObject(this); 

我真的很感激它,如果你能帮助我与这些问题的,让我明白了,我怎么能绕过这个错误。

//编辑

类英雄

import greenfoot.*; 
import java.util.List; 
import java.awt.Rectangle; 

public class Hero extends alive 
{ 
    private double mspeed = 100.0; 
    private long frameBegin = 0; 
    private double posX; 
    private double posY; 
    private boolean isJumping = false; 
    private double maxJumpTime = 0.35; 
    private double jumpTime = 0; 
    private double jspeed = 250.0; 
    private double fspeed = jspeed; 
    private boolean faceR; 
    private int hoch = 30; 
    private int breit = 26; 
    private boolean onCD = false; 
    private long CD = 0; 

    public Hero() { 
    } 

    public void addedToWorld(World world) { 
     posX = getX(); 
     posY = getY(); 
     faceR = true; 
    } 

    public static void schuss(){ 
     /*World.addObject(new bulletH(), (int)posX , (int)posY); 
     if(faceR=true){ 
      bullet.firedR=true; 
     } 
     else{ 
      bullet.firedR=false; 
     } 

     */ 
    } 

    public Rectangle getBounds(){ 
     return new Rectangle((int)posX, (int)posY, breit,hoch);  
    } 

    public void act(){ 
     double deltaTime; 
      if(frameBegin == 0) { 
      deltaTime = 0; 
     } 
      else{ 
      deltaTime = ((double) (System.currentTimeMillis()-frameBegin))/1000; 
     } 
     frameBegin = System.currentTimeMillis(); 

     if(Greenfoot.isKeyDown("A")){ 
       posX -= mspeed * deltaTime; 
       faceR = false; 
      } 

     if(Greenfoot.isKeyDown("D")){ 
       posX += mspeed * deltaTime; 
       faceR = true; 
      } 

     if(Greenfoot.isKeyDown("W") && !getIntersectingObjects(Floor.class).isEmpty()) { 
      isJumping = true; 
      jumpTime = 0; 
     } 

     if((!Greenfoot.isKeyDown("W") || (jumpTime > maxJumpTime)) && isJumping) { 
      isJumping = false; 
     } 

     if(isJumping) { 
      posY -= jspeed * deltaTime; 
      jumpTime += deltaTime; 
     } 

     if(getIntersectingObjects(Floor.class).isEmpty() && !isJumping) { 
      posY += fspeed *deltaTime; 
     } 

     if(Greenfoot.isKeyDown("Space")) { 
      if(onCD = false){ 
       schuss(); 
       onCD = true; 
      } 
     } 
     if(posY > getWorld().getHeight()){ 
     Greenfoot.setWorld(new gameover()); 
     } 

     setLocation((int)posX, (int)posY); 
     CD += deltaTime; 

     if(CD> 0.3){ 
      CD=0; 
      onCD = false; 
     } 
    } 
} 

类子弹

import greenfoot.*; 
import java.awt.Rectangle; 

public class bullet extends Actor 
{ 
    public int mspeed = 250; 
    public boolean firedR = true; 
    public long frameBegin = 0; 
    public int yspeed = 0; 
    public int posX; 
    public int posY; 
    private int hoch = getImage().getHeight(); 
    private int breit = getImage().getWidth(); 

    public void addedToWorld(World world) { 
     posX = getX(); 
     posY = getY(); 
    } 

     public Rectangle getBounds(){ 
     return new Rectangle((int)posX, (int)posY, breit,hoch); 
    } 

    public void move(){ 
     double deltaTime; 
     if(frameBegin == 0) { 
      deltaTime = 0; 
     } 
     else{ 
      deltaTime = ((double) (System.currentTimeMillis()-frameBegin))/1000; 
     } 
     frameBegin = System.currentTimeMillis(); 

     if(firedR=true){ 
      posX += mspeed * deltaTime; 
     } 

     else{ 
      posX -= mspeed * deltaTime; 
     } 

     posY+= yspeed * deltaTime; 


     setLocation((int)posX, (int)posY); 
    } 

    public void act(){ 

    } 

} 
+0

如果您向我们展示哪些变量是静态的,哪些是非静态的,以及确切地说“不起作用”的含义,这可能会有所帮助。 – merlin2011

+0

哪些变量是**静态**,哪些变量是**非静态**? – Gundamaiah

+0

posX/posY是非静态的,其余的应该是静态的。 – user3556111

回答

1

这里有一个关键的错误。您不能从静态上下文中引用非静态变量,除非您将instanticiate您的课程
根据定义,静态变量/方法也称为类变量/方法,这意味着您不需要具有该类的实例即可访问。
非静态变量/方法也称为实例变量/方法,这意味着您必须有有该类的一个实例,并且您可能只能通过您的对象访问这些变量/方法。也就是说,如果您必须有权访问所述变量,您可以将它们设置为静态,也可以将代码移至非静态范围。
如果您创建对象的实例,则可以访问这些变量,但我认为这不符合您的目的。

+0

好的,谢谢,我该怎么做? – user3556111

+1

好吧,我认为你的静态方法是'schuss'。您可以使该方法不是静态的。毕竟,如果有人拍摄,这是你的阶级英雄射击的一个例子,而不是你的阶级英雄。就像一个男人在射击一样,这将是杰克,而不是阶级人 –