2016-02-25 6 views
0

Используя JavaFX8 и JDK 1.8.0_74 в IntelliJ, я создал приложение для основного пиксельного редактора. У меня есть два окна (этапы). Один из них представляет собой матрицу 32x128 объектов окружности, расположенную в грид-панели, а другую, вдова Tools; У меня есть один Controller.java. Используя мышь, окно «Инструменты» предоставляет инструменты для рисования линий, прямоугольников и т. Д. И меню для «Настройка», «Файлы» и «Списки воспроизведения». Меню «Файлы» предоставляет пользователю функции «Открыть», «Сохранить» и «Удалить». Чтобы просмотреть сохраненный файл изображения в пикселях, пользователь нажимает «Открыть» и через FileChooser, открывается выбранный файл и отображается каждое свойство цвета Circle. Файл сохраненного пикселя может быть отправлен через Wi-Fi в матрицу RGB LED, также 32x128.JavaFX8 Временная шкала для прокрутки сетки объектов круга?

Для просмотра фото и видео перейдите по ссылке: 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(). Аномалии происходят в первые четыре смены слева; Объекты Circle с цветами, отличными от черного, меняются на соседний цвет. Но после четырех сдвигов все оставшиеся сдвиги кажутся правильными?

Мое лучшее предположение заключается в том, что логический порядок выполнения выходит из строя, потому что я не использую Timeline правильно или пытаюсь выполнить слишком много в одном KeyFrame? Увеличение продолжительности, по-видимому, не влияет на аномалии.

Благодарим за помощь.

ответ

0

Логически, ваше решение неверно, вы храните ссылки на круги во временном массиве, а затем изменяете заполнение ссылочных окружностей, а затем обновляете ссылочную заливку, чтобы установить новую заливку.

Вместо того, чтобы хранить ссылки на круги, сохраняйте сами значения заполнения.

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

Ваше исправление работает в первый раз, когда я внес надлежащие изменения. Это в третий раз, когда вы предоставили мне отличный ответ, который включает объяснение с кодом. Проведя часы, пытаясь понять проблему и потерпеть неудачу, ваш ответ делает мой день! БЛАГОДАРЮ. – sgroen