Java 为什么我的小程序游戏中的碰撞算法不能正常工作?

Java 为什么我的小程序游戏中的碰撞算法不能正常工作?,java,applet,awt,collision-detection,Java,Applet,Awt,Collision Detection,这是我的游戏项目。这是Flappy Bird的一个非常简单的版本,我对碰撞算法的工作原理有一些严重的问题。我分别为wall1和wall2编写了两段用于冲突的代码片段。当球试图穿过一个洞时,问题就开始了,因为程序不知何故检测到了与墙壁的碰撞。我几乎可以肯定碰撞算法写的是正确的,因为我一整天都在检查它 import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.Random; import ja

这是我的游戏项目。这是Flappy Bird的一个非常简单的版本,我对碰撞算法的工作原理有一些严重的问题。我分别为wall1和wall2编写了两段用于冲突的代码片段。当球试图穿过一个洞时,问题就开始了,因为程序不知何故检测到了与墙壁的碰撞。我几乎可以肯定碰撞算法写的是正确的,因为我一整天都在检查它

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.util.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Game extends Applet implements KeyListener, Runnable {

    Image bground;
    Random generator = new Random();
    int r1;
    int wall1x;
    int wall1y;
    int wall1long;
    int wall2x;
    int wall2y;
    int wall2long;
    Timer timer;

    private Image i;
    private Graphics doubleG;
    int r2;
    int blok_x1 = 800;
    int blok_y1;
    int blok_x = 800;
    int blok_y = 0;
    int blok_x_v = 2;
    int ballX = 20;
    int ballY = 20;
    int dx = 0;
    int dyclimb = 1;
    int dyrise = 1;

    double gravity = 3;
    double jumptime = 0;
    int FPS = 100;
    public int tab[];
    public boolean grounded = true, up = false;
    boolean OVER = false;

    @Override
    public void init() {
        bground = getImage(getCodeBase(), "12.png");
        this.setSize(600, 400);
        tab = new int[100];
        for (int t = 0; t < 100; t++) {
            tab[t] = generator.nextInt(380) + 1;
        }
        addKeyListener(this);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            ballX -= 10;

        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            ballX += 10;

        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            ballY -= 10;

            up = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            ballY += 10;

        }

    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(bground, 0, 0, this);
        if (OVER == false) {

            for (int i = 0; i < 100; i++) {
                g.setColor(Color.green);
                wall1x = blok_x + i * 400;
                wall1y = blok_y;
                wall1long = tab[i];

                g.fillRect(wall1x, wall1y, 20, wall1long);
                g.setColor(Color.green);
                wall2x = blok_x1 + i * 400;
                wall2y = tab[i] + 60;
                wall2long = 400 - tab[i];
                g.fillRect(wall2x, wall2y, 20, wall2long);
                g.setColor(Color.green);

            }
            g.setColor(Color.red);
            g.fillOval(ballX, ballY, 20, 20);
        } else {
            g.drawString("GAME OVER", 300, 300);
        }
    }

    @Override
    public void update(Graphics g) {
        if (i == null) {
            g.setColor(Color.green);
            i = createImage(this.getSize().width, this.getSize().height);
            doubleG = i.getGraphics();
            g.setColor(Color.green);
        }
        doubleG.setColor(getBackground());
        g.setColor(Color.green);
        doubleG.fillRect(0, 0, this.getSize().width, this.getSize().height);
        doubleG.setColor(getForeground());
        g.setColor(Color.green);
        paint(doubleG);
        g.drawImage(i, 0, 0, this);

    }

    @Override
    public void run() {
        int time = 10;

        while (true) {
            if (up == true) {

                ballY -= dyclimb;
                time--;
            } else {
                ballY += dyrise;
            }
            if (time == 0) {
                time = 10;
                up = false;
            }

            blok_x--;
            blok_x1--;

            if (ballX > 600 || ballX < 0 || ballY > 400 || ballY < 0) {
                OVER = true;

            }

            for (int i = 0; i < 100; i++) {                // collision algorithm
                wall1x = blok_x + i * 400;
                wall1y = blok_y;
                wall1long = tab[i];

                if (ballX + 20 >= wall1x && ballX <= wall1x + 20 && ballY <= wall1y + wall1long && ballY >= wall1x - 20) {  //wall1
                    OVER = true;

                }

            }
            for (int i = 0; i < 100; i++) {
                wall2x = blok_x1 + i * 400;
                wall2y = tab[i] + 60;
                wall2long = 400 - tab[i];

                if (ballX + 20 >= wall2x && ballX <= wall2x + 20 && ballY <= wall2y + wall2long && ballY >= wall2x - 20) {  //wall2
                    OVER = true;

                }

            }
            repaint();
            try {
                Thread.sleep(17);
            } catch (InterruptedException ex) {
                Logger.getLogger(NewApplet.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    @Override
    public void start() {
        Thread thread = new Thread(this);
        thread.start();

    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

}

使用矩形类。有一种方法叫做Intersect或Intersect之类的

假设有一个物体在移动。制作一个矩形以匹配位置中的对象基本上是对象的不可见覆盖物

对另一个对象执行相同的操作

当两者都要碰撞时,请使用“相交”方法通过使用矩形检查碰撞

这些可能会有帮助