2015-12-18 173 views
0

我正在完成一个编码任务,需要我设置一组运动中的块,弹出窗口和对方,但不幸的是,我完全失去了接下来要去的地方。任何帮助将不胜感激(仍然得到编码的吊,,所以我正在寻找所有可能的帮助)。具体来说,我需要首先出现矩形,然后排除移动故障,最后帮助进行碰撞检测。块碰撞代码故障排除

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

试着问一个具体的问题,这将有助于你解决你的问题。仔细想想你遇到了什么问题,然后问一个关于那件事情的问题。这个问题太广泛了。也可以尝试只包含尽可能多的代码来说明问题,而不是倾销整个项目......这将帮助您获得更有用的答案。 – PeteB

回答

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; 

如果你想找出哪些面(或方向)发生碰撞,你将不得不使用更长时间,并略多复杂的分离轴定理。