阻止碰撞代码故障排除

时间:2015-12-18 04:29:36

标签: java

我完成了一个编码任务,要求我设置一个运动中的块阵列,从窗口和彼此之间反弹,但不幸的是,我完全迷失了下一步的去向。任何帮助将不胜感激(仍然掌握编码,所以我正在寻找所有可能的帮助)。具体来说,我需要首先出现矩形,然后排除运动故障,最后帮助进行碰撞检测。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Driver implements ActionListener
{
    private JFrame window;
    private Timer timer;
    private ChaseBlock[] blocks = new ChaseBlock[15];
    // constants for graphics
    private final int windowSize = 500;
    private final int blockSize = 20;
    /**
     * Simple initiating main().
     *
     * @param args Not used.
     */
    public static void main( String[] args )
    {
        Driver d = new Driver();
        d.createWindow();
    }

    /**
     * Set up the basic graphical objects.
     */
    private void createWindow()
    {
        // create the window
        window = new JFrame( "The Great Chase" );
        window.setVisible( true );
        window.setLayout( null );
        window.getContentPane().setBackground( Color.white );
        window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        window.setLocation( 50, 50 );
        window.setSize(
                       windowSize + window.getInsets().left + window.getInsets().right,
                       windowSize + window.getInsets().top + window.getInsets().bottom );
        window.setResizable( false );
        window.repaint();

        timer = new Timer(10, this);
        timer.start();
        blocks[1].setBackground(Color.blue);
        window.repaint();
        addBlocks();


    }

    private void addBlocks() {
        for (int i = 0; i < blocks.length; i++) {
            int x = i * blockSize + 10 * (i +1);
            blocks[i] = new ChaseBlock(x, windowSize / x - blockSize / 2, blockSize, windowSize);
        }
        for (int i = 0; i < blocks.length; i++) {
            window.add(blocks[i]);

        }
    }

    private void animate() {
        for (int i = 0; i < blocks.length; i++) {
            blocks[i].move();

            for (int b1 = 0; b1 < blocks.length; b1++)
                for (int b2 = 0; b2 < blocks.length; b2++)
                    if (b1 != b2)
                        blocks[b1].checkCollision(blocks[b2]);
        }
    }

    public void actionPerformed (ActionEvent e) {
        animate();
    }
}

这是我们使用的驱动程序类,也带有Rectangle类。接近底部,目标是添加矩形并使它们移动。我的问题是矩形不会出现或移动。

import java.awt.Color;
public class ChaseBlock extends Rectangle {
    private int dX, dY;
    private int windowWidth = 500;
    private int windowHeight = 500;

    public ChaseBlock(int x, int y, int w, int h) {
        super(x, y, w, h );
        if (Math.random() < 0.5) {
            dX = -1;
            dY = -1;
            setBackground(Color.green);
        } else
            dX = 1;
            dY = 1;
            setBackground(Color.blue);
    }

    public void move() {
        setLocation(getX(), getY() + 5);
        if(getX() < 0 || getY() + getWidth() >= windowWidth) {
            dX = dX * -1;
        }
        if (getY() < 0 || getY() + getHeight() >= windowHeight) {
            dY = dY * -1;
        }
    }

    public void checkCollision(ChaseBlock blocks) {
        boolean up = false;
        boolean down = false; 
        boolean left = false;
        boolean right = false; 
        boolean hit = false;

    }

}

这是我的班级来定义运动和其他一切。我的问题是我需要使用checkCollision方法来管理块本身和窗口之间的冲突,另外还要设置所有块的颜色。

1 个答案:

答案 0 :(得分:0)

首先,使用窗口边缘进行碰撞检查的第一个条件是不正确的。它应该是

if(getX() < 0 || getX() + getWidth() >= windowWidth) 

要检测两个轴对齐边界框之间的碰撞(这就是你所拥有的Rectangle s),你只需检查第一个的最小和最大点(x,y和x + h,y +) h)在第二个内部如下:

if(a.x + a.h < b.x or a.x > b.x + b.h) return false;
if(a.y + a.h < b.y or a.y > b.y + b.h) return false;
return true;

如果你想知道碰撞发生在哪个面(或哪个方向),你将不得不使用更长和更复杂的分离轴定理。