【问题标题】:Java Pong Game Collision Detection IssueJava Pong 游戏碰撞检测问题
【发布时间】:2016-08-22 01:06:17
【问题描述】:

我是 Java 新手,需要一些帮助。我已经创建了 Pong 游戏(使用 Eclipse),并且在大多数情况下,它运行良好。但是,碰撞检测有些问题。球从人工控制的桨上反弹得很好,但总是直接穿过人工智能控制的桨,我终生无法弄清楚我的代码有什么问题。代码如下:

主课“网球”:

package PongV2;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class Tennis extends Applet implements Runnable, KeyListener{
final int WIDTH = 700, HEIGHT = 500;
Thread thread;
HumanPaddle p1;
AIPaddle p2;
Ball b1;
boolean gameStarted;
Graphics gfx;
Image img;


public void init(){
     this.resize(WIDTH, HEIGHT);
     gameStarted = false;
     this.addKeyListener(this);
     p1 = new HumanPaddle(1);
     b1 = new Ball();
     p2 = new AIPaddle(2, b1);
     img = createImage(WIDTH, HEIGHT);
     gfx = img.getGraphics();
     thread = new Thread(this);
     thread.start();
}

public void paint(Graphics g){
    gfx.setColor(Color.black);
    gfx.fillRect(0, 0, WIDTH, HEIGHT);
    if(b1.getX() < -10 || b1.getX() > 710){
        gfx.setColor(Color.red);
        gfx.drawString("Game Over", 350, 250);
    }
    else{
    p1.draw(gfx);
    b1.draw(gfx);
    p2.draw(gfx);
}

    if(!gameStarted) {
        gfx.setColor(Color.white);
        gfx.drawString("Pong", 343, 100);
        gfx.drawString("Press Enter to Begin...", 295, 130);
    }
    g.drawImage(img, 0, 0, this);

}


public void update(Graphics g){
    paint(g);
}

public void run() {
    for(;;){
         if(gameStarted) {
        p1.move();
        p2.move();
        b1.move();
        b1.checkPaddleCollision(p1, p2);
         }
        repaint();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_UP) {
       p1.setUpAccel(true);
    } else if(e.getKeyCode() == KeyEvent.VK_DOWN){
        p1.setDownAccel(true);
    } else if(e.getKeyCode() == KeyEvent.VK_ENTER){
        gameStarted = true;

}
}
public void keyReleased(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_UP) {
        p1.setUpAccel(false);
    } else if(e.getKeyCode() == KeyEvent.VK_DOWN){
        p1.setDownAccel(false);
    }

}


public void keyTyped(KeyEvent arg0) {

}

}

如果有人需要,还可以查看“AIPaddle”类:

package PongV2;

import java.awt.Color;
import java.awt.Graphics;

public class AIPaddle implements Paddle{
double y, yVel;
boolean upAccel, downAccel;
final double GRAVITY = 0.94;
int player, x;
Ball b1;

public AIPaddle(int player, Ball b){
    upAccel = false; downAccel = false;
    b1 = b;
    y = 210; yVel = 0;
    if(player == 1)
        x = 20;
    else
        x = 660;
}

public void draw(Graphics g) {
    g.setColor(Color.white);
    g.fillRect(x, (int)y, 20, 80);

}

public void move() {
    y = b1.getY() -40;


     if(y < 0)
         y = 0;
     if(y > 420)
         y = 420;

}


public int getY() {
    return (int)y;
}

}

“球”类:

package PongV2;

import java.awt.Color;
import java.awt.Graphics;

public class Ball {
double xVel, yVel, x, y;

public Ball(){
    x = 350;
    y = 250;
    xVel = getRandomSpeed() * getRandomDirection();
    yVel = getRandomSpeed() * getRandomDirection();
}

public double getRandomSpeed(){
    return(Math.random() *3 + 2);
}

public int getRandomDirection(){
    int rand = (int)(Math.random() * 2);
    if(rand == 1)
        return 1;
    else
        return -1;
}

public void draw(Graphics g){
    g.setColor(Color.white); 
    g.fillOval((int)x-10, (int)y-10, 20, 20);
}

public void checkPaddleCollision(Paddle p1, Paddle p2){
    if (x <= 50){
       if(y >= p1.getY() && y <= p1.getY() + 80){
           xVel = -xVel;
}
    else if(x >= 650){
        if(y >= p2.getY() && y <= p2.getY() + 80)
            xVel = -xVel;
    }
    }
}

public void move(){
    x += xVel;
    y += yVel;

    if(y < 10)
        yVel = -yVel;
    if(y > 490)
        yVel = -yVel;
}

public int getX(){
    return (int)x;
}

public int getY(){
    return (int)y;
}

}

有人能告诉我我的代码在哪里需要更正吗?谢谢。

【问题讨论】:

  • 是否抛出了一些错误?
  • 不,没有错误。它启动了一切,球只是通过 AI 桨 - 没有碰撞检测。但它可以很好地从人工控制的桨上反弹。无法弄清楚代码中的错误在哪里。
  • 然后尝试使用调试器。
  • b1.checkPaddleCollision(p1, p2);至关重要 - 公园里的其余部分似乎很有趣
  • 你能发布你的 Ball 课程吗?

标签: java eclipse


【解决方案1】:

这是您的 checkPaddleCollisionMethod 中的 if 语句。你现在有这个。

if(...) {
    if(...) {
    }
    else if(...) {
        if(...) {
        }
    }
}

else if 平行于第二个 if,而不是第一个。你想要一个更像这样的结构。

if(...) {
    if(...) {
    }
}
else if(...) {
    if(...) {
    }
}

【讨论】:

  • 太棒了,成功了!谢谢!好像我的错误总是在花括号上,哈哈。
  • 很高兴听到这个消息。由于这解决了您的问题,您应该将其标记为已接受/最佳答案,以表示您不需要更多答案。这是通过单击上下投票按钮下的复选标记按钮来完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多