没有stackoverflower错误的循环中的Java调用函数

时间:2013-12-21 14:00:56

标签: java applet stack-overflow

我知道我之前曾问过这样的问题,但旧问题的答案都没有对我有用。我正在尝试制作一个单人乒乓球游戏(它在Java小程序中)。我已经有了一个moveBall()函数,如下所示。但我不知道在哪里打电话。我无法在paint()方法中调用它,因为它是双缓冲的。

public class Main extends Applet implements KeyListener, MouseListener {
private Rectangle paddle;
private Rectangle ball;
private ArrayList<Integer> keysDown;
private Image dbImage;
private Graphics dbg;
public int time = 300000;
Random randomGenerator = new Random();
int speed = 10;
int level = 1;     // change to 0 once start menu works
int xpos, ypos;
int ballx, bally;
int width = 1024;
int height = 768;
int paddleWidth = 96;
int ballSize = 16;
String version = "0.0.1";
public static final int START_X_POS = 160;
public static final int START_Y_POS = 160;
public static final int START_WIDTH = 256;
public static final int START_HEIGHT = 64;
boolean startClicked;
boolean falling = true;

public void init() {
    setSize(width, height); 
    addKeyListener(this);
    addMouseListener(this);
    setBackground(Color.black); 
    Frame c = (Frame)getParent().getParent();
    c.setTitle("Asteroid Attack - Version " + version);
    keysDown = new ArrayList<Integer>();
    paddle = new Rectangle(getWidth()/2-paddleWidth, getHeight()-96, paddleWidth, 12);
    ball = new Rectangle(getWidth()/2-ballSize, 96, ballSize, ballSize); 
}

public void update(Graphics g) {
    dbImage = createImage(getSize().width, getSize().height);
    dbg = dbImage.getGraphics ();
    if (dbImage == null) {}
    dbg.setColor(getBackground ());
    dbg.fillRect(0, 0, getSize().width, getSize().height);
    dbg.setColor(getForeground());
    paint(dbg);
    g.drawImage(dbImage, 0, 0, this);
}


public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    if (level != 0) {
        g2.setPaint(Color.gray);
        g2.fill(paddle);
        g2.setPaint(Color.darkGray);
        g2.fill(ball);
        moveBall();
    }
}

public void moveBall() {
    bally = ball.y;
    ballx = ball.x;
    if (bally < paddle.y-32 && falling) {
        bally += 12;
    }
    if (bally < paddle.y-32 && falling && paddle.x <= ballx && paddle.getMaxX() >= ball.x) { // collides with paddle
        falling = false;
    }
    else { // does not collide with paddle

    }
    ball.setLocation(ballx, bally);
}

@Override
public void keyPressed(KeyEvent e) {
    if (!keysDown.contains(e.getKeyCode()))
        keysDown.add(new Integer(e.getKeyCode()));
    key();
}

@Override
public void keyReleased(KeyEvent e) {
    keysDown.remove(new Integer(e.getKeyCode()));
}

public void key() {
    if (level != 0) {
        int x = paddle.x;
        int y = paddle.y;
        if (keysDown.contains(KeyEvent.VK_ESCAPE)) {System.exit(0);}
        if (x > 0 && x+paddleWidth < this.getWidth()) {
            if (keysDown.contains(KeyEvent.VK_LEFT)) {x -= speed;}
            if (keysDown.contains(KeyEvent.VK_RIGHT)) {x += speed;}
        }
        else {  // so paddle doesn't exit room
            if (x <= 0) {x += 4;}
            else {x -= 4;}
        }
        paddle.setLocation(x, y);
        repaint(); 
    }
}

@Override
public void keyTyped(KeyEvent e) {}

@Override
public void mouseClicked(MouseEvent me) {
    if (level == 0) {
        xpos = me.getX(); 
        ypos = me.getY();
        if (xpos >= START_X_POS && ypos >= START_Y_POS && xpos <= START_X_POS + START_WIDTH && ypos <= START_X_POS + START_HEIGHT ) {
            level = 1;
        }
    }
}

@Override
public void mouseEntered(MouseEvent me) {}

@Override
public void mouseExited(MouseEvent me) {}

@Override
public void mouseReleased(MouseEvent me) {}

@Override
public void mousePressed(MouseEvent me) {}
}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

你可能想要一个单独的线程来移动球,在循环中跟踪时间 - 这样如果帧速率下降或加速,你可以尝试确保球移动速度的一致性。 / p>

e.g。这里使用applet中的一个线程http://www.realapplets.com/tutorial/threadexample.html