【问题标题】:Return a true statement back to false in Processing在处理中将 true 语句返回为 false
【发布时间】:2019-04-11 05:05:13
【问题描述】:

我正在尝试在 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;
       } 

【问题讨论】:

  • region1 = true 是一个作业。它必须是 if (region1 == true) 而不是 if (region1 = true)
  • 更改else if(region1 == true)= 是一个赋值运算符。
  • 在条件中添加 == true 是没有实际意义的。只需使用 if (region1) ...

标签: java boolean processing kinect


【解决方案1】:

假设您在 cmets 中实施了建议并且您的代码现在如下所示:

   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-变量表示“对象已进入区域”,只有在该区域中不存在对象时才应重置。试试这个:

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。当对象重新进入该区域时,它将触发音频。

【讨论】:

  • 有效!谢谢你,我无法解释我需要做什么。我有 5 个其他区域与之相邻,我会看看我能把它推到多远,以及它是否会破裂。
【解决方案2】:

else if(region1 = true) 更改为 else if(region1 == true) 。 = 是一个赋值运算符。

【讨论】:

  • 它似乎一直在播放样本,除非我移出该区域,因为它不断重置。有没有办法让它在我搬进来的时候播放一次,然后在我搬回来的时候再播放一次?
【解决方案3】:

难道这一切都是因为多线程而发生的吗?如果您所做的更改和查询发生在两个不同的线程中,您将不得不采取更多的预防措施。例如,将您检查的布尔值定义为volatile

【讨论】:

  • 这可能是问题所在。我想我需要找到一种方法,如果它仍在某个区域内,它不会切换为 false。我刚刚尝试了volatile boolean region1 = false;,不幸的是它并没有改变任何东西。
猜你喜欢
  • 2013-11-10
  • 2017-08-10
  • 2020-08-08
  • 2020-04-25
  • 2019-10-03
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 2020-08-20
相关资源
最近更新 更多