Возвращает оператор true обратно в false при обработке

#java #boolean #processing #kinect

#java #логическое значение #обработка #kinect

Вопрос:

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

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

Я пытался использовать отдельные логические функции, такие как:

 else if (region1 = true){ 
region1 = false;
}
  

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

Вот что у меня есть до сих пор:

 boolean region1 = false;

       if (blob.getRect().intersects(screenRects.get(0)) amp;amp; !region1){
         println("region1-" millis());
           String filename = dataPath("sample.wav");
               SamplePlayer sp = new SamplePlayer(ac, SampleManager.sample(filename));
               ac.out.addInput(sp);
         region1 = true;
       } 
  

Комментарии:

1. region1 = true является присваиванием. Это должно быть if (region1 == true) , а не if (region1 = true)

2. Изменение else if(region1 == true) . = является оператором присваивания.

3. добавление == true в условие является спорным. просто используйте if (region1) …

Ответ №1:

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

    if (blob.getRect().intersects(screenRects.get(0)) amp;amp; !region1){
     println("region1-" millis());
       String filename = dataPath("sample.wav");
           SamplePlayer sp = new SamplePlayer(ac, SampleManager.sample(filename));
           ac.out.addInput(sp);
     region1 = true;
   } 
   else if (region1 == true){ 
     region1 = false;
   }
  

Что происходит, так это то, что при обнаружении объекта в регионе воспроизводится звук и region1 устанавливается значение true. В самом следующем кадре else if выполняется и region1 снова устанавливается значение false. Это означает, что кадр после этого, если объект все еще присутствует, звук воспроизводится снова.
Переменная region1 -означает «объект вошел в регион» и должна быть сброшена только в том случае, если в регионе нет объекта. Попробуйте это:

 boolean isObjectInRegion;

   isObjectInRegion= blob.getRect().intersects(screenRects.get(0));
   if (isObjectInRegion amp;amp; !region1){
     println("region1-" millis());
       String filename = dataPath("sample.wav");
           SamplePlayer sp = new SamplePlayer(ac, SampleManager.sample(filename));
           ac.out.addInput(sp);
     region1 = true;
   } 
   else if (!isObjectInRegion amp;amp; region1 == true){ 
     region1 = false;
   }
  

Значение: если в регионе был объект, но его больше нет, затем сбросьте region1 . Затем он запустит звук, когда объект снова войдет в область.

Комментарии:

1. Это работает! Спасибо вам за это, у меня возникли проблемы, пытаясь объяснить, что мне нужно было сделать. У меня есть 5 других областей, прилегающих к нему, и я посмотрю, как далеко я смогу это продвинуть, и если это сломается.

Ответ №2:

Изменить else if(region1 = true) на else if(region1 == true) . = — это оператор присваивания.

Комментарии:

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

Ответ №3:

Может быть, все это происходит из-за многопоточности? Если внесенные вами изменения и запросы выполняются в двух разных потоках, вам придется принять дополнительные меры предосторожности. например, определите логическое значение, которое вы проверяете как volatile .

Комментарии:

1. Это может быть проблемой. Я думаю, мне нужно найти способ заставить его не переключаться на false, если он все еще находится внутри региона. Я только что попробовал volatile boolean region1 = false; , и, к сожалению, это ничего не меняет.