gpt4 book ai didi

JavaFX Canvas 始终在同一位置绘制

转载 作者:行者123 更新时间:2023-11-30 07:41:01 25 4
gpt4 key购买 nike

我正在尝试在 Canvas 上绘制一架飞机并移动它(不知道这是否重要 - 第二个 Canvas 放置在 GridPane 中与最后绘制的第一个 Canvas 相同的位置,如图所示) 。我使用了 GraphicContext appendSVGPath ,并成功地定位了飞机:

enter image description here

我添加了一个按钮来测试移动,每次单击时 x 和 y 增加 2,触发重绘。确实触发了重绘,并且使用了正确的参数,但绘图保持不变。我尝试测试如果在第二次单击时会发生什么,我只运行 clearRect 命令,实际上飞机已经清理干净所以我假设它只是每次都在相同的位置重新绘制..

我错过了什么?

public class AirplaneDrawer extends Canvas{
public double x,y,rotate,lastX,lastY;
public boolean isFirst = true;

public void setCords(double x,double y,double rotate) {
if(x != this.x || y != this.y || rotate != this.rotate) {
lastX=this.x;
lastY=this.y;
this.x = x;
this.y = y;
this.rotate = rotate;
redraw();
}
}

public void redraw() {
GraphicsContext gc = getGraphicsContext2D();
String path = new String("M 323.193 226.645 c 39.244 24.41 75.644 47.053 115.706 71.978 c 7.687 -5.443 20.518 -14.485 33.308 -23.596 c 16.733 -11.923 36.27 -11.452 49.046 3.779 c 3.513 4.191 2.568 15.766 -0.705 21.426 c -23.705 40.994 -48.427 81.404 -73.095 121.833 c -4.729 7.745 -9.06 19.278 -21.177 13.509 c -12.203 -5.8 -28.746 -9.521 -27.842 -28.026 c 0.891 -18.185 3.495 -36.292 4.924 -50.249 c -40.704 -19.793 -79.74 -38.778 -119.825 -58.269 c -16.168 17.561 -22.275 40.532 -27.606 64.119 c -8.975 39.719 -18.474 79.324 -28.171 118.881 c -5.593 22.809 -12.452 26.109 -34.167 17.908 c -28.122 -10.606 -31.047 -14.689 -31.318 -45.384 c -0.605 -68.198 -1.514 -136.4 -1.325 -204.593 c 0.045 -15.865 -4.177 -25.531 -19.237 -32.95 c -30.238 -14.884 -60.119 -30.866 -88.548 -48.915 c -13.988 -8.884 -26.951 -21.77 -35.867 -35.727 C 3.526 110.834 15.381 90.43 40.637 91.746 c 17.786 0.931 36.644 4.67 52.618 12.229 c 32.58 15.413 63.735 33.905 95.022 51.921 c 8.735 5.028 15.083 4.992 23.944 0.068 c 64.671 -35.921 129.717 -71.172 194.611 -106.705 c 25.712 -14.075 46.608 -10.335 65.331 12.008 c 10.309 12.302 2.247 20.797 -6.506 28.579 c -35.89 31.91 -72.438 63.093 -107.682 95.687 C 344.877 197.641 334.677 212.878 323.193 226.645 Z");
double wid = getWidth()/247;
double hei = getHeight()/152;
if(!isFirst) {
gc.rotate(360-rotate);
gc.scale(50, 50);
gc.translate(-lastX*wid, -lastY*hei);
}
gc.clearRect(0, 0, getWidth(), getHeight());
gc.translate(wid*x,hei*y);
gc.scale(0.02,0.02);
gc.rotate(rotate);
gc.appendSVGPath(path);
gc.setFill(Color.BLACK);
gc.fill();
gc.stroke();
isFirst = false;
}
}

Controller 中的按钮处理程序:

public void btnClickHandler(MouseEvent event) {
airplaneDrawer.setCords(airplaneDrawer.x+2, airplaneDrawer.y+2, 145);
}

这是 FXML 文件的一部分:

  <MapDrawer fx:id="mapDrawer" height="237.0" width="256.0" GridPane.columnIndex="1" GridPane.rowIndex="1" >
<GridPane.margin>
<Insets left="18.0" top="-5" />
</GridPane.margin>
</MapDrawer>
<AirplaneDrawer fx:id="airplaneDrawer" height="237.0" width="256.0" GridPane.columnIndex="1" GridPane.rowIndex="1" >
<GridPane.margin>
<Insets left="18.0" top="-5" />
</GridPane.margin>
</AirplaneDrawer>

最佳答案

enter image description here
这是我能让飞机移动的最好方法,您必须更改一些参数以适应您的应用。我在这里移动的是 Canvas 。
我建议您为 map 创建另一个 Canvas 。 (不确定这是否有效)。我仍然不明白为什么它在同一个空间上绘制,但是如果您尝试在翻译后附加另一个 svg 路径(例如,将 path2 添加到 if 中的 Canvas > 条件)你会在另一个位置看到你的第二架飞机。

public void redraw() {
GraphicsContext gc = getGraphicsContext2D();
String path = new String("M 323.193 226.645 c 39.244 24.41 75.644 47.053 115.706 71.978 c 7.687 -5.443 20.518 -14.485 33.308 -23.596 c 16.733 -11.923 36.27 -11.452 49.046 3.779 c 3.513 4.191 2.568 15.766 -0.705 21.426 c -23.705 40.994 -48.427 81.404 -73.095 121.833 c -4.729 7.745 -9.06 19.278 -21.177 13.509 c -12.203 -5.8 -28.746 -9.521 -27.842 -28.026 c 0.891 -18.185 3.495 -36.292 4.924 -50.249 c -40.704 -19.793 -79.74 -38.778 -119.825 -58.269 c -16.168 17.561 -22.275 40.532 -27.606 64.119 c -8.975 39.719 -18.474 79.324 -28.171 118.881 c -5.593 22.809 -12.452 26.109 -34.167 17.908 c -28.122 -10.606 -31.047 -14.689 -31.318 -45.384 c -0.605 -68.198 -1.514 -136.4 -1.325 -204.593 c 0.045 -15.865 -4.177 -25.531 -19.237 -32.95 c -30.238 -14.884 -60.119 -30.866 -88.548 -48.915 c -13.988 -8.884 -26.951 -21.77 -35.867 -35.727 C 3.526 110.834 15.381 90.43 40.637 91.746 c 17.786 0.931 36.644 4.67 52.618 12.229 c 32.58 15.413 63.735 33.905 95.022 51.921 c 8.735 5.028 15.083 4.992 23.944 0.068 c 64.671 -35.921 129.717 -71.172 194.611 -106.705 c 25.712 -14.075 46.608 -10.335 65.331 12.008 c 10.309 12.302 2.247 20.797 -6.506 28.579 c -35.89 31.91 -72.438 63.093 -107.682 95.687 C 344.877 197.641 334.677 212.878 323.193 226.645 Z");

double wid = getWidth()/247;
double hei = getHeight()/152;

if(!isFirst) {
gc.rotate(360-rotate);
gc.scale(50, 50);
setTranslateX(-lastX*wid);
setTranslateY(-lastY*hei);
gc.setStroke(Color.BLUE);
gc.stroke();

}
gc.clearRect(0, 0, getWidth(), getHeight());
System.out.println("x="+x+" y="+y);
setTranslateX(y*wid);
setTranslateY(y*hei);
gc.scale(0.02,0.02);
gc.rotate(rotate);
gc.appendSVGPath(path);
gc.setFill(Color.BLACK);
gc.fill();
gc.stroke();

isFirst = false;

}
}

关于JavaFX Canvas 始终在同一位置绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56681763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com