Как исправить цветное кровотечение изображения в Java (используя Processing)? - PullRequest
0 голосов
/ 04 января 2019

В моем клоне Java (использующем обработку) Terraria (2D-игра на основе плиток) я испытываю довольно сильное цветное кровотечение (думаю, так оно и называется) между блоками поверхности и небом, когда камера движется быстро.

Я уже пытался ограничить fps до 60 и другими значениями, но это совсем не помогает. Я также пытался удалить код для всего, кроме рисования блоков и неба и только смещения камеры вниз с постоянной скоростью, но проблема остается. Я также попытался нарисовать только несколько блоков на экране, которые находятся менее чем в 10 кварталах от камеры, но это не помогло. Я попытался изменить цвет фона с небесно-голубого на красноватый, и заметил, что цвет кровотечения изменился, но он остался с той же интенсивностью. Я также пытался ограничить частоту обновления моего монитора до 60 Гц на тот случай, если проблема была с моим монитором (но, как вы увидите, я записал видео проблемы).

РЕДАКТИРОВАТЬ : Когда я воспроизводлю видео с четверть скорости, оно едва заметно, поэтому это, вероятно, эффект от моего монитора. Уже тогда я хотел бы знать, как справиться с этой проблемой, потому что при запуске игры на полной скорости это ОЧЕНЬ заметно. Я не замечаю такого эффекта, когда играю в другие игры.

/*
The following contains a bit of pseudo code as to not get cluttered up with
Camera movement and choosing which blocks to be rendered, but otherwise
it is the same as my implementation
*/

static PImage dirtImg;
//Right above surface
float camY = SURFACE_HEIGHT + TERRAIN_HEIGHT + 10;
float t0 = 0.0, t1 = 0.0;
float dt = 1.0 / 60.0;

//I am running this once during the setup.
void loadImg() {
    dirtImg = loadImage("data/images/textures/0.png", "png");
}

void drawBlocks() {
    //for each block on screen with pos (x,y)
    image(dirtImg,x,y);
}

void draw() {
    adjustTiming();
    background(127,218,255);
    drawBlocks();
    camY -= 10 * dt;
}

void adjustTiming() {
    if (frameCount == 1) {
        t0 = System.nanoTime();
    }
    else {
        t0 = t1;
        t1 = System.nanoTime();
        dt = (t1 - t0) / 1E9;
    }
}

Прошу прощения за предварительное форматирование кода, это мой первый пост на SO ...

Я ожидаю, что блоки будут выглядеть как их изображение, а небо прямо над ними будет выглядеть как цвет, который я для него установил, но когда камера опускается, наблюдается довольно много цветовых пятен. Я не ожидаю этого, потому что в других играх я могу быстро двигать камеру и не замечать этого эффекта. У меня есть видео здесь цветового кровотечения, которое я испытываю.

РЕДАКТИРОВАТЬ : попробуйте смотреть с 2-кратной скоростью для получения оригинального эффекта, потому что YouTube конвертировал видео в 30 кадров в секунду. В качестве альтернативы здесь - это ссылка для загрузки видео со скоростью 144 кадра в секунду, чтобы увидеть полный нетронутый эффект. Этот является хранилищем git-hub. Я работаю в ветке "на основе времени".

...