#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;
, и, к сожалению, это ничего не меняет.