Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何表示两个形状接触的事件?JAVA_Java_Events_Actionlistener_Graphics2d - Fatal编程技术网

如何表示两个形状接触的事件?JAVA

如何表示两个形状接触的事件?JAVA,java,events,actionlistener,graphics2d,Java,Events,Actionlistener,Graphics2d,所以我有一个Blob形状,它实现了MoveableShape public interface MoveableShape { void draw(Graphics2D g2); void translate(int dx, int dy); } 假设一个Blob的一个实例b1碰到另一个Blob b2。一旦它碰到另一个水滴,我希望它能反转方向。我如何用java发出信号?到目前为止,我一直在这样做以正常移动它: Timer t = new Timer(DELAY, new

所以我有一个Blob形状,它实现了MoveableShape

public interface MoveableShape
{
   void draw(Graphics2D g2);
   void translate(int dx, int dy);
}
假设一个Blob的一个实例b1碰到另一个Blob b2。一旦它碰到另一个水滴,我希望它能反转方向。我如何用java发出信号?到目前为止,我一直在这样做以正常移动它:

Timer t = new Timer(DELAY, new
     ActionListener()
     {
        public void actionPerformed(ActionEvent event)
        {
           b1.translate(1, 0);
           label.repaint();
        }
     });
  t.start();
我真诚地相信,有一种更有效的方法可以做到这一点,而不是用以下内容替换第6行和第7行:

b1.translate(speed, 0);
label.repaint();
if(b1.getX()==b2.getX()) { speed = -speed }

我很抱歉没有记录每一个细节,但你应该从中得到一般要点。是否可以向b1添加某种自定义事件以反转其方向,或者类似的方式?此外,是否可以使用ActionListener来执行此操作?谢谢。

当形状发生碰撞时,您当然可以触发自定义事件,但您仍然需要编写代码来检测碰撞。如果您对当前的方法不满意,可能
Shape.intersects()
会有所帮助(假设您正在子类化
Shape

然而,除非您需要将冲突通知其他侦听器,否则可能没有必要触发另一个事件来处理它;使用动画代码执行此操作是有意义的


如果碰撞检测变得足够复杂,可能会影响性能,则可能需要将其转移到另一个线程中。不过,听起来您不太可能遇到这种特殊的复杂情况。

您需要对2D形状进行真正的碰撞检测,还是像示例中那样比较X坐标就足够了?坐标比较显然要简单得多,但在反转方向之前,图形中可能会有可见的重叠。@eaj后者很好。我唯一的问题是在actionPerformed中重复执行常量if语句。另外,这个类还有一个.getWidth()选项,所以最后我不会有重叠(我只是忘了在比较中包括它)。