JavaFX8 时间轴滚动圆对象网格



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

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

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

类 WrapLeft 的关键代码如下:

  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]);
    }  
}

最新更新