Запуск таймера в определенной точке кода

Недавно я работал над игрой. На данный момент я пытаюсь создать главное меню, которое будет сосуществовать и работать вместе с моей игрой. К сожалению, я столкнулся с проблемой. Я сделал таймер «задержки», который удаляет здоровье у игрока-пользователя, и таймер для босса, с которым вы сражаетесь, чтобы босс мог прыгать по полю битвы после определенной задержки / таймера. это работало нормально, пока я не попытался реализовать главное меню. Когда я вставил меню, я сделал так, что если вы нажмете «p», он перенесет вас в игру и запустит часть функции «draw», в которой есть игра, и только тогда она должна запустить задержку / таймер, состоящий из 5000 мс. Проблема возникает, когда я пытаюсь поместить «задержку» внутрь части, в которой находится игра, задержка не сработает, но если я верну ее туда, где она была у меня сначала, то есть в части «Настройка», она работает только то, что вместо этого он запускает таймер, как только запускается программа, а не сама игра. вот мой код:

void Startmeny() {
 textSize(70);
 text("Jackan Heroes!", 300, 300);
 fill(255, 255, 0);
 textSize(40);
 text("Start", 350, 400);
 fill(255, 255, 0);
 textSize(40);
 text("Creatorer", 350, 500);
 fill(255, 255, 0);
 if (keyPressed) {
  if (key == 'p' || key == 'P') {
   start = true;
  }
 }
}


void draw() {

  textSize(70);
  text("Jackan Heroes!", 200, 300);
  fill(255, 255, 0);
  textSize(40);
  text("Start - press 'P' ", 250, 400);
  fill(255, 255, 0);
  textSize(40);
  text("Creatorer - press 'O' ", 250, 500);
  fill(255, 255, 0);
  if (keyPressed) {
   if (key == 'p' || key == 'P') {
    start = true;
   }
  }
  if (start == true) {

   background(100);

   int rT = 255;

   _delay = new Delay(5000);

   g.display();
   g.checkEdges();
   g.BarsDisplay();
   g.HealthDisplay();
   g.XpDisplay();


   f.detect();
   f.Enemy();
   f.HealthDisplay();
   f.dead();



   if (g.intersects(D)) {
    D.transport();
   }

   if (f.HP > 0) {
    if (g.intersects(f) /*|| g.Intersects(f)*/ ) {

     if (_delay.expired()) {

      g.RemoveHealth();
      _delay = new Delay(1200);
     }

     //g.knockback();
     //f.chase();
    }
   }

   if (g.intersect(f)) {

    if (!g.alreadypressed) {
     f.damage();
     textSize(32);
     text("-8 ", f.x2 + 50, f.y2 - 40);
     fill(0, 102, 153);
    }
    g.alreadypressed = true;
   }




   if (_delay.expired()) {
    if (f.yes == true) {

     float R = random(100, 700);
     f.x2 = R;
     f.xd = f.x2 + 50;
     float R2 = random(100, 700);
     f.y2 = R2;
     f.yd = f.y2 + 50;
     _delay = new Delay(3000);
    }
   }

некоторые из кодовых названий на шведском языке, так что я плохо переведу важное. startmeny = «меню», если есть еще какие-то, которые вы не понимаете, переведите их. :)


person TheBigChung    schedule 08.01.2020    source источник
comment
В методе draw() вы сбрасываете таймер с помощью _delay = new Delay(5000);. Метод draw() повторяется несколько раз в секунду. Ваш таймер может работать, но он никогда не истечет, так как он всегда сбрасывается. Вот почему его инициализация в методе setup() сработала правильно: этот метод запускается только один раз.   -  person laancelot    schedule 08.01.2020
comment
ооооооооооооооооооооооооооооооооооооооооооооооооооооооооо Есть ли способ заставить функцию внутри Draw запускаться только один раз, как только Draw был активирован в первый раз?   -  person TheBigChung    schedule 08.01.2020
comment
Конечно, я уже писал вам простую идею, чтобы сделать именно это. Надеюсь, поможет.   -  person laancelot    schedule 08.01.2020


Ответы (1)


Не изменяя большую часть кода, вы можете исправить первоначальную проблему следующим образом:

  if (keyPressed) {
   if (!start && (key == 'p' || key == 'P')) {
    start = true;
    _delay = new Delay(5000); //of course, remove this line from where I took it
   }
  }

При этом вы инициализируете _delay в нескольких местах кода. Являются ли эти задержки разными таймерами? Если это так, их нужно будет инициализировать как разные переменные. Каждый раз, когда вы повторно инициализируете _delay, вы «забываете» старую задержку и просто запускаете новую. Мне кажется, что первоначальная задержка в 5 секунд была единственной проблемой, но я думаю, что вы все равно захотите это узнать.

Веселиться!

person laancelot    schedule 08.01.2020