不能让无法通行的'墙'

时间:2013-04-22 23:55:49

标签: java swing user-interface

我有一个基本程序,您可以使用箭头键在圆圈中移动。我试图这样做,所以球不能输入某个区域(蓝色矩形),但它不起作用。 我正在使用Eclipse。

package TLOT;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Movement extends JPanel implements ActionListener, KeyListener
{
 Timer tm = new Timer(5,this);
 int x = 0, velX = 0;
 int y = 0, velY = 0;

 public Movement()
 {
  tm.start();
  addKeyListener(this);
  setFocusable(true);
  setFocusTraversalKeysEnabled(false);

 }

 public void actionPerformed(ActionEvent e)
 {
  if (x < 0){
   velX = 0;
   x = 0;
  }
  if (x > 633){
   velX = 0;
   x = 533;
  }
  if (y < 0){
   velY = 0;
   y = 0;
  }
  if (y > 410){
   velY = 0;
   y = 310;
  }
  //this is that part thats supposed to make it stop if it hits a certain point.
 if (50 < x && x < 100 && y > 50 && y > 100){
      velX = 0; //700 , 500
      velY = 0;
      }

  x = x + velX;
  y = y + velY;
  repaint();
 }

 public void keyPressed(KeyEvent e){
  int c = e.getKeyCode();
  if (c == KeyEvent.VK_LEFT || c == KeyEvent.VK_A){
   velX = -1;
   velY = 0;
  }
  if (c == KeyEvent.VK_UP || c == KeyEvent.VK_W){
   velX = 0;
   velY = -1;
  }
  if (c == KeyEvent.VK_RIGHT || c == KeyEvent.VK_D){
   velX = 1;
   velY = 0;
  }
  if (c == KeyEvent.VK_DOWN || c == KeyEvent.VK_S){
   velX = 0;
   velY = 1;
  }
 }

 public void keyTyped(KeyEvent e){}
 public void keyReleased(KeyEvent e){
  velX = 0;
  velY = 0;
 }

 public void paintComponent(Graphics g){
  super.paintComponent(g);
  g.setColor(Color.red);
  g.fillOval(x, y, 50, 50);
  g.setColor(Color.blue);
  g.fillRect(320, 200, 40, 60);
  tm.start();
 }


    public static void main(String[] args) { 
     Movement q = new Movement();
     JFrame jf = new JFrame();
     jf.setTitle("Movement Test");
     jf.setSize(700,500);
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     jf.add(q);
     jf.setVisible(true);
    }

}

1 个答案:

答案 0 :(得分:4)

这可能是问题所在:

y > 50 && y > 100

当然应该是

y > 50 && y < 100

这就是为什么单元测试,调试器,桌面检查等都存在的原因 - 程序员的脑 - 计算机界面是错误的和不准确的;)

此外,最好检查添加velX和velY是否会将您嵌入墙中,而不是如果您已经嵌入墙中。否则你第一次介入时就会陷入困境:

50 < (x+velX) && (x+velX) < 100 && (y+velY) > 50 && (y+velY) < 100

更好的行为就是做一个较小的步骤,以便你完全靠墙。这样做的方法包括进行几何交叉计算(圆/矩,圆/圆,矩/矩,多边形/多边形......)或者只是在二分搜索中尝试越来越小的步骤,直到你足够接近。