我今天的问题相对简单,有没有办法与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);
}
路径加载器只是简单地加载我上面提到的路径,尝试使用模糊和透明度,没有收紧路径碰撞的效果。