Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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
javafxcanvas:在另一个图形中专门绘制一个图形_Java_Canvas_Javafx_Javafx 8_Shapes - Fatal编程技术网

javafxcanvas:在另一个图形中专门绘制一个图形

javafxcanvas:在另一个图形中专门绘制一个图形,java,canvas,javafx,javafx-8,shapes,Java,Canvas,Javafx,Javafx 8,Shapes,我目前正在用Java开发一个游戏,我一直在想如何在画布上绘制一个不同形状(例如正方形)的形状(例如圆形),但只绘制与正方形相交的部分,类似于Photoshop中图层之间的剪切遮罩 我曾尝试使用清除底部形状不存在的区域,但这会移除背景 下面的代码生成此结果: 然而,这是我想要的结果: 导入javafx.animation.AnimationTimer; 导入javafx.application.application; 导入javafx.scene.Group; 导入javafx.scene.

我目前正在用Java开发一个游戏,我一直在想如何在画布上绘制一个不同形状(例如正方形)的形状(例如圆形),但只绘制与正方形相交的部分,类似于Photoshop中图层之间的剪切遮罩

我曾尝试使用清除底部形状不存在的区域,但这会移除背景

下面的代码生成此结果:

然而,这是我想要的结果:

导入javafx.animation.AnimationTimer;
导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.paint.Color;
导入javafx.scene.transform.Rotate;
导入javafx.stage.stage;
公共类CircleWithinSquareTest扩展了应用程序{
@凌驾
public void start(Stage)引发异常{
整数宽度=200;
整数高度=200;
画布=新画布(宽度、高度);
GraphicsContext gc=canvas.getGraphicsContext2D();
AnimationTimer=新的AnimationTimer(){
最终int bgCellSize=8;
最终整数x=100;
最终整数y=100;
双角度=0;
@凌驾
公共无效句柄(长){
/*画格子背景*/
gc.setFill(颜色为白色);
gc.fillRect(0,0,宽度,高度);
gc.setFill(颜色为浅灰色);
布尔奇数=假;
对于(int y=0;y=360){
角度=0;
}
旋转r=新旋转(角度,x,y);
gc.setTransform(r.getMxx(),r.getMyx(),r.getMxy(),r.getMyy(),r.getTx(),r.getTy());
gc.setFill(颜色为红色);
gc.fillOval(x,y,30,30);
gc.restore();
}
};
timer.start();
组根=新组(画布);
场景=新场景(根);
舞台场景;
stage.show();
}
}
您可以使用,在setTransform之前添加下一个代码:

gc.beginPath();
gc.rect(x, y, 50, 50);
gc.closePath();
gc.clip();

哦,哇,谢谢!真不敢相信我错过了这个。这比我想象的要简单得多。另外,我注意到,如果我注释掉
gc.beginPath()
gc.closePath()
,它仍然会产生所需的结果。是的,它会工作,因为您有一个空路径。如果在同一图形上下文中开始使用其他路径,请不要忘记将它们返回。
gc.beginPath();
gc.rect(x, y, 50, 50);
gc.closePath();
gc.clip();