Как выполнить функцию только один раз в голосовом режиме draw (); но по-прежнему отображать его для всей анимации - PullRequest
0 голосов
/ 24 апреля 2020

Я борюсь с чем-то здесь.

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

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

Ребята, вы хоть представляете, как я могу это сделать?

Вот код:

int r1,r2,r3 = 0;
int i1, i2,i3;

void setup(){
    size(800,800);
    background(255,0);
    //noLoop();
}

void draw(){
    background(255,0);
    rosace();

    croix();
    sillon1();
    sillon2();
}

void rosace(){
    for (i1 = 0;i1<230; i1++){

        rectMode(CENTER);

        noFill();
        stroke(20);
        strokeWeight(1);


        pushMatrix();
        translate(width/2,height/2);
        translate(400,400);
        rotate(radians(r1));
        rect(0,0,400,400);
        r1 +=1;
        //println(r);

        popMatrix();
        println("rosace ex");
    }
}

void croix(){

    pushMatrix();
    strokeWeight(2);
    stroke(0);
    translate(width/2, height/2);
    rotate(radians(45));
    line(-10,0,10,0);
    line(0,-10,0,10);
    popMatrix();
}

void sillon1(){
    for (i2 =0; i2<360; i2++){
        pushMatrix();

        translate(width/2,height/2);
        strokeWeight(int(random(0,7)));

        rotate(radians(r2));

        point(-330,0);

        popMatrix();
        r2 +=1;
    }
}

void sillon2(){
    for (i2 =0; i2<2000; i2++){
        pushMatrix();

        translate(width/2,height/2);
        strokeWeight(int(random(1,3)));

        rotate(radians(r2));

        point(-360,0+(random(-2,2)));

        popMatrix();
        r2 +=1;
    }
}

Пустота rosace(); - это та, которую я бы хотел не оживить.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Вы не можете просто сохранить часть сцены, когда поверх нее нарисована анимация. Вы должны нарисовать всю сцену в каждом кадре. Убедитесь, что rosace dr aws одинаков в каждом кадре.

Просто установите r1 = 0 в каждом кадре, тогда алгоритм в rosace генерирует одинаковые прямоугольники в каждом кадре:

void rosace(){
    r1 = 0;

    for (i1 = 0;i1<230; i1++){
        // [...]
    }
}
0 голосов
/ 24 апреля 2020

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

Вместо этого сделайте его локальной переменной:

void rosace() {
    int r1 = 0;

    for (i1 = 0; i1<230; i1++) {
        rectMode(CENTER);

        noFill();
        stroke(20);
        strokeWeight(1);

        pushMatrix();
        translate(width/2, height/2);
        translate(400, 400);
        rotate(radians(r1));
        rect(0, 0, 400, 400);
        r1 +=1;

        popMatrix();
        println("rosace ex");
    }
}
...