Java 循环中的路径转换
我有8x8板,其中SIZE=8,moveHistory是javafx.geometry.Point2D的ArrayList。以下是代码:Java 循环中的路径转换,java,class,arraylist,javafx,inner-classes,Java,Class,Arraylist,Javafx,Inner Classes,我有8x8板,其中SIZE=8,moveHistory是javafx.geometry.Point2D的ArrayList。以下是代码: private class ChessBoard extends Pane { ImageView knightImageView = new ImageView("image/knight.jpg"); ChessBoard() { this.setOnMouseClicked(e -> { s
private class ChessBoard extends Pane {
ImageView knightImageView = new ImageView("image/knight.jpg");
ChessBoard() {
this.setOnMouseClicked(e -> {
startX = (int)(e.getX() / (getWidth() / SIZE));
startY = (int)(e.getY() / (getHeight() / SIZE));
resetMoveHistory();
paint();
});
}
protected void paint() {
this.getChildren().clear();
this.getChildren().add(knightImageView);
knightImageView.setX(startX * getWidth() / SIZE);
knightImageView.setY(startY * getHeight() / SIZE);
knightImageView.setFitWidth(getWidth() / SIZE);
knightImageView.setFitHeight(getHeight() / SIZE);
for (int i = 1; i <= SIZE; i++) {
this.getChildren().add(new Line(0, i * getHeight() / SIZE,
getWidth(), i * getHeight() / SIZE));
this.getChildren().add(new Line(i * getWidth() / SIZE, 0,
i * getWidth() / SIZE, getHeight()));
}
if (moveHistory != null) {
for (int i = 1; i < moveHistory.size(); i++) {
Point2D p1 = moveHistory.get(i - 1);
Point2D p2 = moveHistory.get(i);
PathTransition ptMove = new PathTransition();
Line line = (new Line(
p1.getX() * (getWidth() / SIZE) + getWidth() / SIZE / 2,
p1.getY() * (getHeight() / SIZE) + (getHeight() / SIZE / 2),
p2.getX() * (getWidth() / SIZE) + getWidth() / SIZE / 2,
p2.getY() * (getHeight() / SIZE) + getHeight() / SIZE / 2));
ptMove.setPath(line);
ptMove.setNode(knightImageView);
ptMove.setCycleCount(1);
ptMove.setDuration(Duration.seconds(2));
ptMove.play();
}
}
}
}
私有类棋盘扩展窗格{
ImageView-knightImageView=新的ImageView(“image/knight.jpg”);
棋盘{
此.setonMouseClacked(e->{
startX=(int)(e.getX()/(getWidth()/SIZE));
startY=(int)(例如getY()/(getHeight()/SIZE));
重置移动历史();
油漆();
});
}
受保护的空心涂料(){
这是.getChildren().clear();
this.getChildren().add(knightImageView);
netightimageview.setX(startX*getWidth()/SIZE);
setY(startY*getHeight()/SIZE);
knightImageView.setFitWidth(getWidth()/SIZE);
knightImageView.setFitHeight(getHeight()/SIZE);
对于(inti=1;iTheplay()
方法启动动画播放并立即退出。因此,您可以几乎同时启动所有动画,并让它们同时播放。每个动画都会设置knightImageView
的translateX
和translateY
属性,并且这些值将由上的每个动画设置动画持续时间内的每个渲染帧。最后设置值的动画将在该帧上“获胜”,这是将渲染的值。因此,整体效果将高度不可预测
你想要(我认为)的是一个接一个地播放动画。你可以用一个。你的代码应该看起来像这样:
if (moveHistory != null) {
SequentialTransition sequentialTransition = new SequentialTranstiion();
for (int i = 1; i < moveHistory.size(); i++) {
Point2D p1 = moveHistory.get(i - 1);
Point2D p2 = moveHistory.get(i);
PathTransition ptMove = new PathTransition();
Line line = (new Line(
p1.getX() * (getWidth() / SIZE) + getWidth() / SIZE / 2,
p1.getY() * (getHeight() / SIZE) + (getHeight() / SIZE / 2),
p2.getX() * (getWidth() / SIZE) + getWidth() / SIZE / 2,
p2.getY() * (getHeight() / SIZE) + getHeight() / SIZE / 2));
ptMove.setPath(line);
ptMove.setNode(knightImageView);
ptMove.setCycleCount(1);
ptMove.setDuration(Duration.seconds(2));
sequentialTransition.getChildren().add(ptMove);
}
sequentialTransition.play();
}
if(moveHistory!=null){
顺序转换顺序转换=新的顺序转换();
for(int i=1;i
这里需要注意的另一件事是,转换通过操纵translateX
和translateY
坐标来移动图像视图。调用的ImageView
的setX
和setY
方法可能不会执行您认为的操作:请参见。您可以包括resetMove的代码吗历史记录()
method?因为每次单击时都要在paint()之前重置