javafx中的SVG路径冲突

时间:2014-05-01 16:05:24

标签: svg javafx-2 collision-detection

我今天的问题相对简单,有没有办法与JGPafx的SVGPath实现进行冲突处理? EX:如果我在屏幕上放置一个粒子,并且它遇到了svgPath的 Any 部分,它就会发出一个碰撞信号。

我尝试使用常规边界碰撞,但是如果路径形状像'L'那么它给了我一个对SVGPath来说巨大的边界框

我专门玩的路径是:

m 252,12.362183
     c 1.03171,23.632637 -4.57241,55.427587 9,69 65.41611,65.416117 361.05896,43.999997 469,43.999997

我是否必须重新插入线并且有一个数组存储一组(x,y)位置,我经常检查?这似乎相当笨拙,但我根本无法想到任何其他(更简单)的方式?

我为常规有界碰撞尝试的代码如下:

observableBooleanValue colliding = Bindings.createBooleanBinding(new Callable<Boolean>() {

            @Override
            public Boolean call() throws Exception {
                return particle.getBoundsInParent().intersects(path.getBoundsInParent());
            }

        }, particle.boundsInParentProperty(), path.boundsInParentProperty());

        System.out.println("path bounds: " + path.boundsInParentProperty());
        colliding.addListener(new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> obs,
                    Boolean oldValue, Boolean newValue) {
                if (newValue) {
                    System.out.println("Colliding");
                } else {
                    System.out.println("Not colliding");
                }
            }
        });

请注意,粒子只是一个半径为2的圆,而路径只是一个用上述svg加载的SVG路径。

- 将会

小编辑

因此,在研究了其他一些方法之后,我得到了接近准确碰撞的地方,但它仍然过早约20%(它在实际出现之前检测到碰撞)。几乎就好像路径的边缘有点'模糊'。

代码:

particle.layoutYProperty().addListener(new ChangeListener<Number>(){

            @Override
            public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
               Shape intersect = Shape.intersect(path, particle);
                if ((intersect.getBoundsInLocal().getHeight() != -1) && (intersect.getBoundsInLocal().getWidth() != -1)) {
                    System.out.println("Collison!");
                }
            }

        });

我真的很难过为什么svgpath的边缘会有如此大的缓冲区。

创建路径的代码:

/**
     * This function helps to make the path for animating particles
     *
     * @throws IOException
     */
    public void makePaths() throws IOException {
        PathLoader loader = new PathLoader();
        path = new SVGPath();
        path.setContent(loader.getPath(1));
        path.setStroke(Color.AQUA);
        //path.setFill(Color.TRANSPARENT);
        //path.setEffect(boxBlur);


    }

路径加载器只是简单地加载我上面提到的路径,尝试使用模糊和透明度,没有收紧路径碰撞的效果。

0 个答案:

没有答案