JavaFX8 时间轴滚动圆形对象的网格?

JavaFX8 Timeline to scroll Grid of Circle Objects?

在 IntelliJ 中使用 JavaFX8 和 JDK1.8.0_74,我创建了一个基本的像素编辑器应用程序。我有两个 windows(阶段)。一个是放置在网格窗格中的 32x128 圆形对象矩阵,另一个是工具窗口;我有一个 Controller.java。使用鼠标,工具 window 提供绘制线条、矩形等的工具以及用于设置、文件和播放列表的菜单。文件菜单向用户显示打开、另存为和删除。要查看保存的像素艺术文件,用户单击“打开”并通过 FileChooser 打开所选文件并显示每个圆圈的颜色 属性。保存的像素艺术文件可以通过 Wi-Fi 发送到同样为 32x128 的 RGB LED 矩阵。

要查看图片和视频,请转到:https://virtualartsite.wordpress.com/

我可以使用时间轴向左、向右、向上或向下滚动显示的像素艺术文件。但是,我也想对像素图像进行环绕,但未能消除环绕开始时出现的小异常,而其余 95% 的环绕是正确的?

classWrapLeft的关键代码如下:

  public static void runAnimation() {
        timeline = new Timeline(
            new KeyFrame(Duration.millis(200), event -> {
                    wrapFileLeft(pixelArray);
            }));

    timeline.setCycleCount(100);
    timeline.play();
  }   

  public static  void wrapFileLeft(Circle[][] pixelArray){

    // save pixelArray[r][0] in pixelArrayTmp[r][0] and wrap to end, pixelArray[r][col-1]

    Circle[] pixelArrayTmp = new Circle[row];

    for (int r = 0; r < row; r++) {
        pixelArrayTmp[r] = pixelArray[r][0];
    }

    // move all the pixelArray columns one column to the left

    for (int c = 0; c < col-1; c++) {
        for (int r = 0; r < row; r++) {
            Color color = (Color) pixelArray[r][c+1].getFill();
            pixelArray[r][c].setFill(color);
        }
    }

    // move the pixelArrayTmp[r][0] column into the new, blank, end column of pixelArray[r][col-1]

    for (int r = 0; r < row; r++) {
        Color color = (Color) pixelArrayTmp[r].getFill();
        pixelArray[r][col-1].setFill(color);
    }  } }

逻辑是暂时保存第0列,将所有剩余列左移一位,将第127列替换为第0列。这一切都在一次CycleCount()中完成。异常发生在左前四班;具有黑色以外颜色的圆形对象将更改为相邻颜色。但是四班之后,剩下的班次似乎都是正确的?

我最好的猜测是执行的逻辑顺序乱了,因为我没有正确使用时间轴或试图在单个关键帧中执行太多?增加持续时间似乎不会影响异常。

感谢您的帮助。

从逻辑上讲,您的解决方案是错误的,您将对圆的引用存储在一个临时数组中,然后更改引用圆的填充,然后使用更新后的引用填充来设置新填充。

不存储对圆的引用,而是存储填充值本身。

public void wrapItLeft(Circle[][] pixelArray){
    // save pixelArray[r][0] in pixelArrayTmp[r][0] and wrap to end, pixelArray[r][col-1]
    Paint[] pixelArrayTmp = new Paint[N_ROWS];
    for (int r = 0; r < N_ROWS; r++) {
        pixelArrayTmp[r] = pixelArray[r][0].getFill();
    }

    // move all the pixelArray columns one column to the left
    for (int c = 0; c < N_COLS-1; c++) {
        for (int r = 0; r < N_ROWS; r++) {
            Color color = (Color) pixelArray[r][c+1].getFill();
            pixelArray[r][c].setFill(color);
        }
    }

    // move the pixelArrayTmp[r][0] column into the new, blank, end column of pixelArray[r][col-1]
    for (int r = 0; r < N_ROWS; r++) {
        pixelArray[r][N_COLS-1].setFill(pixelArrayTmp[r]);
    }  
}