Как сделать пользовательскую функцию задержки с Java при обработке 3.4? - PullRequest
0 голосов
/ 30 сентября 2018
float x = 0;

void setup() {
    size(200,200);
    frameRate(60);
    background(255);
}

int v = (int)random(0,width);
int b = (int)random(0,height);

void draw() {
    drawCar(v,b,50,0);
    secondDelay(5);
    v = (int)random(0,width);
    b = (int)random(0,height);
}

void drawCar(int x, int y, int thesize, int col) {
    int offset = thesize/4;

    //draw main car body
    rectMode (CENTER);
    stroke(200);
    fill(col);
    rect(x,y,thesize, thesize/2);

    //draw wheel relative to car body center
    fill(0);
    rect(x-offset,y-offset,offset,offset/2);
    rect(x+offset,y-offset,offset,offset/2);
    rect(x+offset,y+offset,offset,offset/2);
    rect(x-offset,y+offset,offset,offset/2);
}

void secondDelay(int aSecond){
    int aS;
    aS = aSecond * 60;
    while(aS > 0) {
        aS--;
    }
}

я пытаюсь заставить функцию secondDelay() работать как способ задержки функции draw (которая является циклом, который обновляет каждый кадр).также сама frameRate равна 60, так что draw() работает на 60 кадрах в секунду.Это сделано, давая количество секунд, которое я хочу в качестве аргумента secondDelay(amountofseconds).затем внутри этой функции secondDelay() она умножает количество секунд на количество кадров в секунду, которое составляет 60. Теперь у меня есть количество кадров, которое мне нужно ждать, которое я помещаю в переменную с именем aS.То, что я делаю затем внутри функции secondDelay(), это создаю цикл while, который запускается каждый раз, когда он видит, что переменная aS больше 0. Затем я просто вычитаю 1 из aS каждый раз, когда она повторяется, пока она не станет больше, чем0. Это когда количество секунд, которое вы хотели отложить, было отложено, а затем он снова выполняет весь цикл draw().

Вот как я объясняю код, который я сделал, но он не работает,Вместо этого он просто действует так, будто secondDelay(5); не существует, поэтому он просто создает новые машины в каждом кадре.Как мне исправить это?

1 Ответ

0 голосов
/ 30 сентября 2018

Для того, что вы хотите сделать, вы должны считать кадры.Если количество кадров превышает число, равное промежутку времени задержки, вам нужно нарисовать новую машину.
Вам не нужна функция, которая задерживает, ждет или спит какое-то время, но вам нужнафункция, которая сообщает и сигнализирует о том, что период времени прошел.

Создайте глобальный счетчик кадров (frame_count) и подсчитайте количество кадров в функции secondDelay.Если счетчик превышает 60*aSecond, то функция сбрасывает счетчик на 0. Если счетчик равен 0, то это сигнализируется возвращением значения boolean true.

int frame_count = 0; 
boolean secondDelay(int aSecond){

    boolean signal = frame_count==0;

    if ( frame_count >= 60*aSecond ) {
        frame_count = 0;
    } else { 
        frame_count ++;
    }
    return signal;
}

Каждый раз, когда secondDelay возвращает значение true и дает вам сигнал, вы должны нарисовать новый автомобиль в функции draw:

void draw() {

    if ( secondDelay(5) ) {
        drawCar(v,b,50,0);
        v = (int)random(0,width);
        b = (int)random(0,height);
    }
}
...