如何在碰撞时只运行一次函数?

时间:2018-02-26 20:05:24

标签: java function events audio processing

如果我检查圆圈之间的碰撞,例如

int x2 = 100;
int y2 = 100;  
int r2 = 10;
int count = 0;

boolean checkOnce = false;

void setup() {
  size(200, 200);
}

void draw() {
  background(0);

  int x1 = mouseX;
  int y1 = mouseY;
  int r1 = 10;


  if (!checkOnce){
  checkCollision(x1, y1, r1);
  }


  drawCircle(x1, y1, r1);
  drawCircle(x2, y2, r2);

  textSize(32);
  textAlign(CENTER, CENTER);
  text(count, width/2, height/2-30);
}

void checkCollision(int x, int y, int r) {


  if (dist(x, y, x2, y2) < (r + r2)) {
    checkOnce = true; 
    count++;
    //do something once;
  } else {
    count--;

  }


}

void drawCircle(int x, int y, int r) {
  ellipse(x, y, r*2, r*2);
}

当两个节点重叠时,每个帧都会触发此事件。我该怎么做一次 - 例如播放正弦波,然后一旦它们不再重叠就停止播放符号波?

编辑:我尝试实现建议的方法,但在第一次正面后它停止检查碰撞。如果我有布尔值重置它只是不断循环,好像根本没有布尔值。

2 个答案:

答案 0 :(得分:0)

您可以使用新变量。例如。 boolean isAlreadyChecked = false,并在checkCollision

之前使用它
if(!isAlreadyChecked) checkCollision(x1,y1,r1);

方法

void checkCollision(int x1, int y1, int r1){
    isAlreadyChecked = true;
    if (dist(x1, y1, x2, y2) < (r1 + r2)){
    //do something once;
}

答案 1 :(得分:0)

我终于能够找到解决方案,虽然很乱。

它需要两个布尔值。将布尔值设置为相同的状态,然后在碰撞时修改它们。如果两个布尔值不再匹配,则运行代码,然后将它们设置为匹配。这将在每次更改时运行代码,但仍允许每帧调用该函数。 &GT;:)

为了您的观赏乐趣:

int x2 = 100;
int y2 = 100;  
int r2 = 10;
int count = 0;

boolean checkOnce = false;
boolean toggle = false;

void setup() {
  size(200, 200);
}

void draw() {
  background(0);

  int x1 = mouseX;
  int y1 = mouseY;
  int r1 = 10;



  checkCollision(x1, y1, r1);


  println("bool", checkOnce);

  drawCircle(x1, y1, r1);
  drawCircle(x2, y2, r2);

  textSize(32);
  textAlign(CENTER, CENTER);
  text(count, width/2, height/2-30);
}

void checkCollision(int x, int y, int r) {


  if (checkOnce != toggle) {
    Counter(checkOnce);
    toggle = checkOnce;
  }


  if (dist(x, y, x2, y2) < (r + r2)) {
    checkOnce = true;
    //do something once;
  } else {
    checkOnce = false;
  }
}

void drawCircle(int x, int y, int r) {
  ellipse(x, y, r*2, r*2);
}

void Counter(boolean Contact) {
  if (Contact) {

    count ++;
  } else {
    count --;
  }
}