我正在尝试在Kinect检测到矩形区域中的对象时播放音频样本。问题是我目前正在设置它以便它播放一次样本,然后如果我移出该区域,则更改该区域以不播放另一个样本。
如何在每次移动区域时播放它并在我再次移动后重置它?
我尝试使用单独的布尔函数,如:
else if (region1 = true){
region1 = false;
}
但这似乎不起作用。我认为我需要在该函数中工作,而不是创建一个新函数将其重置为false。
这是我到目前为止所得到的:
boolean region1 = false;
if (blob.getRect().intersects(screenRects.get(0)) && !region1){
println("region1-"+millis());
String filename = dataPath("sample.wav");
SamplePlayer sp = new SamplePlayer(ac, SampleManager.sample(filename));
ac.out.addInput(sp);
region1 = true;
}
假设您在评论中实现了建议,您的代码现在看起来像这样:
if (blob.getRect().intersects(screenRects.get(0)) && !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
-variable表示“对象已进入区域”,只有在区域中没有对象时才应重置。试试这个:
boolean isObjectInRegion;
isObjectInRegion= blob.getRect().intersects(screenRects.get(0));
if (isObjectInRegion && !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 && region1 == true){
region1 = false;
}
含义:如果该区域中有一个对象,但不再存在,则重置region1
。然后,当对象重新进入该区域时,它将触发音频。
将else if(region1 = true)
改为else if(region1 == true)
。 =是赋值运算符。
可能因为多线程而发生了这一切吗?如果您所做的更改和查询发生在两个不同的主题中,则必须采取更多预防措施。例如,将您检查的布尔值定义为volatile
。