Как вызвать разные события через разные промежутки времени в обработке? - PullRequest
0 голосов
/ 12 октября 2019

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

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

Сначала я тестировал только текст. Это то, что у меня есть до сих пор:

int per = 0;
int time;

String headband = "Clip band around your head to begin";
String access = "Welcome to Brain Frame -- an intersection between the mind and the virtual. Please press the blue button to proceed a neural link. Press the red button to exit.";
String Y ="Establishing pre-cursory neural link. Do not remove headband."; 
String N ="Shutting Down. Do not remove headband until prompted - may result in memory distortion otherwise.";

boolean yes = false;
boolean no = false;
boolean head = false;


void setup() {
  size(1080, 720); 
  time = millis();
}

void draw () {
    background(0);

    fill(0,255,255);
    text (headband, 540, 360);
    textSize(30);
    textAlign(CENTER);

    if(head) {
        background(0);
        text(access, 540, 360);
    }

    if(yes)  { 
        background(0);
        text(Y + "\n" + per + "%", 540, 360);

        if (per < 100) {
            per +=1;
        } else {
            per = 100;
            background(0);

            if (millis() - time >= 5000) {
                text("Link created", 540, 360);
                time = millis(); 


                if (millis() - time >= 3000) {
                    background(0);
                    text("think about your childhood", 540, 360);
                    time = millis();
                }
            } 

            if (no) {
                background(0);
                text(N, 540, 360);
            }
        }
    }
}

void keyPressed(){

     if (key == 'j' || key == 'J'){
         head = true;
     }

     if (key == 'y' || key == 'Y'){
         yes = true;
     }

     if (key == 'n' || key == 'N'){
         no = true;
     }
}

Однако это не работает и в конечном итоге показывает, что «Ссылка создана» мигает на экране каждые 5 секунд.

1 Ответ

0 голосов
/ 12 октября 2019

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

Для более сложной цели я бы предложил вам узнать о шаблоне проектирования с именем"государство" . Тем не менее, для этой анимации мы проходим через нее ниндзя способом, который будет близок к тому, что вы уже сделали, но лучше для ваших целей.

Мы будем использовать простой switch, слогика, подобная состоянию.

Переключатель - это простое утверждение, которое сравнивает переменную с последовательностью возможных значений. Как только он достигает значения, которое он распознает, он «входит» в этот случай и делает все, что там написано.

Вы можете представить его как более элементарное утверждение If ... Else If ... Else. Это не совсем то же самое, что можно прочитать только один case внутри коммутатора, так как вам нужно «разбить» случай, чтобы избежать запуска других, но в конце концов он довольно похож, но часто проще для чтения.

Мы будем использовать switch, потому что он прост в использовании и потому что вам будет легко читать и понимать.

«Состояние» - это способ определения того, чтов настоящее время происходит с определенным объектом (который является целой анимацией в данном случае).

Нам понадобится новая переменная для хранения текущего состояния. Мы назовем это «состояние», я думаю. Это будет строка. Думаю, это может быть что угодно, но вам будет легко читать строку, и как однажды сказал мудрый человек: код для людей и как побочный эффект компьютеры смогут его читать.

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

Кроме того, еще одна вещь: чтобы упростить задачу, я даю вам этот класс: задержка. Это то, что я закодировал как студент, и я все еще время от времени использую это. Он действует как таймер. Этот класс позволит вам установить количество времени и проверить, истек ли он.

class Delay {
  protected int limit;

  public Delay() {limit = millis();}
  public Delay (int l) {
    limit = millis() + l;
  }

  public boolean expired () {
    if (millis() > limit) { return true; }

    return false;
  }
}

А вот модифицированный код (включая класс Delay):

int per = 0;
String state = "beginning";
String currentText = "";
Delay delay;

String headband = "Clip band around your head to begin";
String access = "Welcome to Brain Frame -- an intersection between the mind and the virtual. Please press the blue button to proceed a neural link. Press the red button to exit.";
String Y ="Establishing pre-cursory neural link. Do not remove headband."; 
String N ="Shutting Down. Do not remove headband until prompted - may result in memory distortion otherwise.";

boolean yes = false;
boolean no = false;
boolean head = false;

class Delay {
  protected int limit;

  public Delay() {limit = millis();}
  public Delay (int l) {
    limit = millis() + l;
  }

  public boolean expired () {
    if (millis() > limit) { return true; }

    return false;
  }
}

void setup() {
  size(1080, 720); 
  delay = new Delay();
}

void draw () {
  SetText();


  background(0);

  fill(0,255,255);
  text (currentText, 540, 360);
  textSize(30);
  textAlign(CENTER);
}

void SetText() {
  // This method will check what text you should display and set it. The draw() method will... well, just "draw" everything.

  // The switch "choose" what to do by checking what you set the "state" variable to.
  switch(state) {
    case "beginning":
      currentText = headband;
      if (head) {
        state = "head";
      }
      break;
    case "head":
      currentText = access;
      if (yes) {
        state = "yes";
      } else if (no) {
        state = "no"; 
      }
      break;
    case "yes":
      currentText = Y + "\n" + per + "%";
      if (per < 100) {
        if (delay.expired()) {
          // the delay timer will expire every 100 milliseconds until the 'per' variable is 100, kinda like you did but with a timer
          per += 1;
          delay = new Delay(100);
        }
      } else {
        state = "childhood";
        delay = new Delay(3000);
      }
      break;
    case "no":
      currentText = N;
      break;
    case "childhood":
      currentText = "Think about your childhood";
      if (delay.expired()) {
        state = "link";
        delay = new Delay(3000);
      }
      break;
    case "link":
      currentText = "Link created";
      break;
  }
}

void keyPressed(){
   if (key == 'j' || key == 'J'){
       head = true;
   }

   if (key == 'y' || key == 'Y'){
       yes = true;
   }

   if (key == 'n' || key == 'N'){
       no = true;
   }
}

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

Веселитесь!

...