2014-04-21 155 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'。您可以使該方法不是靜態的。畢竟,如果有人拍攝,這是你的階級英雄射擊的一個例子,而不是你的階級英雄。就像一個男人在射擊一樣,這將是傑克,而不是階級人 –