2014-11-21 260 views
-3

我正在尝试使用两个球体制作球体碰撞。当一个球碰撞时,它的速度应该取决于其他球的初始速度,所以在精灵中我需要调用另一个球的速度,但我无法弄清楚如何越过非静态变量消息。这是错误的行Java非静态变量

xa = BIGBALLspeedx()*(BIGBALLmass()-1)+(BallTest.ball.BALLspeedx()*2*1); 

这里是我的精灵的一个代码和主包 'BallTest':

package balltest; 

import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import static java.lang.Math.sqrt; 

public class BigBall { 

    private final int DIAMETER = 80; 
    int x = (int)(Math.random() * 200 + 15); 
    int y = (int)(Math.random() * 200 + 15); 
    int xa = (int)(Math.random() * 4 ); 
    int ya = (int)(1); 

    private BallTest game; 

    public BigBall(BallTest game) { 
     this.game= game; 
    } 

    public void move() { 
     if (x + xa < 0) 
      xa = 1; 
     if (x + xa > game.getWidth() - DIAMETER) 
      xa = -1; 
     if (y + ya < 0) 
      ya = 1; 
     if (y + ya > game.getHeight() - DIAMETER) 
      ya=-1; 
     if (y + ya < 1) 
      ya=1; 
     if (50>sqrt(xDIFF()*xDIFF()+yDIFF()*yDIFF()) && -50<sqrt(xDIFF()*xDIFF()+yDIFF()*yDIFF())) { 
      xa = BIGBALLspeedx()*(BIGBALLmass()-1)+(BallTest.ball.BALLspeedx()*2*1); 
     } 
     x = x + xa; 
     y = y + ya; 
    } 

    public int BIGBALLx() { 
     return x+40; 
    } 

    public int BIGBALLy(){ 
     return y+40; 
    } 

    public int BIGBALLspeedx(){ 
     return xa; 
    } 

    public int BIGBALLspeedy(){ 
     return ya; 
    } 

    public int BIGBALLmass(){ 
     return 5; 
    } 

    public int xDIFF(){ 
     return game.ball.BALLx()-game.BigBall.BIGBALLx(); 
    } 

    public int yDIFF(){ 
     return game.ball.BALLy()-game.BigBall.BIGBALLy(); 
    } 

    public void paint2(Graphics2D g) { 
     g.fillOval(x, y, DIAMETER, DIAMETER); 
    } 

    public Rectangle getBounds() { 
     return new Rectangle(x, y, DIAMETER, DIAMETER); 
    } 
} 

这里的BallTest代码:

package balltest; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import static java.awt.image.ImageObserver.ABORT; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

/** 
* 
     * @author F27834 
*/ 
public class BallTest extends JPanel { 

    Ball ball = new Ball(this); 
    BigBall BigBall = new BigBall(this); 

    private void move() { 
     ball.move(); 
     BigBall.move(); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.setColor(Color.RED); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 

     ball.paint(g2d); 

     g.setColor(Color.BLUE); 
     Graphics2D g3d = (Graphics2D) g; 
     BigBall.paint2(g3d); 
    } 

    public void gameOver() { 
     JOptionPane.showMessageDialog(this, "Game Over", "Game Over", JOptionPane.YES_NO_OPTION); 
     System.exit(ABORT); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame("Mini Tennis"); 
     BallTest game = new BallTest(); 
     frame.add(game); 
     frame.setSize(300, 400); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     while (true) { 
      game.move(); 
      game.repaint(); 
      Thread.sleep(10); 
     } 
    } 
} 
+0

什么是错误?你有什么确切的问题? – kingdamian42 2014-11-21 14:37:37

+0

非静态球无法从静态环境中引用 – krismosel 2014-11-21 14:40:13

+0

您没有向我们展示过BallTest类,但我会大胆猜测它没有静态字段'ball'。 – kingdamian42 2014-11-21 14:41:35

回答

0

你试图引用BallTest.ball - BallTest可能是另一个类,而ball是在该类中定义的实例变量。用Java术语来说,BallTest是一个静态引用(它指的是一个类,而不是一个对象),而Ball只是定义了一个BallTest的实例。

在代码的其他部分,您可以参考game.ball。如果没有看到代码的其余部分,无法确定,但是您应该使用game.ball而不是BallTest.ball?

也就是说,应该是这样吗?

xa = BIGBALLspeedx()*(BIGBALLmass()-1)+(game.ball.BALLspeedx()*2*1);