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