我在处理过程中遇到鼠标点击功能的问题

问题描述 投票:0回答:1

在我的主课中,我创建了一个数组来生成一些绿色圆圈。当我用布尔值单击其中一个时,我试图让背景发生变化,当在圆圈上单击时,应该会实现...我对整个编程很陌生,我不太确定如何解决这个问题..我真的不知道绿色圆圈的x和y位置的数据显示在哪里以及klicked函数应该如何找到它们,因为它们都是在随机位置和其他类中创建的。这是到目前为止我的代码:

class Gesicht {

  //Eigenschaften
  boolean fail = false;
  float whEllipse= 200;
  float yPos = random(-whEllipse, height);
  float  xPos = random(-whEllipse, height);
  float xSpeed = 1;
  float P = 1;

  //Constructor
  Gesicht() {
    // this.yPos = yPos;
    // this.xPos = xPos;
  }

  //Methoden/Funktionen
  void move() {
    //paint();
    xPos += xSpeed;
    yPos += (P*sin(radians(xPos))+1); //+1 macht dass sich das Gesicht langsam runter bewegt.
    if (xPos>= width+whEllipse/2) {

      // P = P+1; Maybe falls ich größere Amplitude will

      xPos = -whEllipse/2;
    }
    if (yPos >= height+whEllipse/2) {
      yPos = random(-whEllipse, height/2);
      xPos = random(-200, whEllipse/2);
    }
  }

  boolean klicked() {
    if (mouseX > xPos-whEllipse/2 && mouseX < xPos+whEllipse/2
      && mouseY > yPos-whEllipse/2 && mouseY < yPos+whEllipse/2
      && mousePressed) {
     
      return true;
    
      }
    return false;
  }
  
  void klick() {
    if (klicked()) {
      fail = true;
    }
  }
  
  void spawn() {
    move();
    fill(0, 255, 0);
    circle(xPos, yPos, whEllipse);
  }
}

这是我尝试放置功能的类。

int farbe = 255;
Gesicht[] grün;
Gesichter[] rot;
Gesichterer[] blau;

void settings() {
  size(700, 700);
}


void setup() {
  rot = new Gesichter[10];
  for ( int i = 0; i< rot.length; i++) {
    rot[i]= new Gesichter();
  }
  grün = new Gesicht[15];
  for ( int i = 0; i< grün.length; i++) {
    grün[i]= new Gesicht();
  }
  blau = new Gesichterer[20];
  for ( int i = 0; i< blau.length; i++) {
    blau[i]= new Gesichterer();
  }
}

void draw() {
  background(farbe);
if(variable.klicked()){
  background(150,0,0);
}
  for ( int i = 0; i< grün.length; i++) {
    grün[i].spawn();
  }
    for ( int i = 0; i< rot.length; i++) {
      rot[i].spawn();
    }
    for (int i = 0; i< blau.length; i++) {
      blau[i].spawn();
    }
  }
  

这是我的主课。

功能目前永远不会实现...我希望有人可以帮助我:// 将非常感激。

java function class processing
1个回答
0
投票

您可能会在不清理代码的情况下努力尝试,这从长远来看会导致更多麻烦。

我这样说是基于以下几点:

  • 你有一个
    klicked()
    ,但也有一个
    klick()
    方法,但作用不大:
    klick()
    应该足够了
  • 您只定义了一个
    Gesicht
    类,但是您另外尝试实例化
    Gesichter
    Gesichterer
    ,它们不存在(至少在您发布的代码中不存在)
  • if(variable.klicked()){ background(150,0,0); }
    指的是一个名为
    variable
    的不可用变量(也许是占位符?)。即使该变量存在,红色背景也只会在
    klicked()
    为 true 时短暂闪烁。

不过你已经很接近了:

  • klicked()
    方法可以满足你的需求
  • farbe
    已存储背景颜色

你可以这样做:

class Gesicht {

  //Eigenschaften
  boolean fail = false;
  float whEllipse= 200;
  float yPos = random(-whEllipse, height);
  float  xPos = random(-whEllipse, height);
  float xSpeed = 1;
  float P = 1;

  //Constructor
  Gesicht() {
    // this.yPos = yPos;
    // this.xPos = xPos;
  }

  //Methoden/Funktionen
  void move() {
    //paint();
    xPos += xSpeed;
    yPos += (P*sin(radians(xPos))+1); //+1 macht dass sich das Gesicht langsam runter bewegt.
    if (xPos>= width+whEllipse/2) {

      // P = P+1; Maybe falls ich größere Amplitude will

      xPos = -whEllipse/2;
    }
    if (yPos >= height+whEllipse/2) {
      yPos = random(-whEllipse, height/2);
      xPos = random(-200, whEllipse/2);
    }
  }

  boolean klicked() {
    if (mouseX > xPos-whEllipse/2 && mouseX < xPos+whEllipse/2
      && mouseY > yPos-whEllipse/2 && mouseY < yPos+whEllipse/2
      && mousePressed) {

      return true;
    }
    return false;
  }

  void klick() {
    if (klicked()) {
      fail = true;
    }
  }

  void spawn() {
    move();
    fill(0, 255, 0);
    circle(xPos, yPos, whEllipse);
  }
}

int farbe = 255;
Gesicht[] green;
Gesicht[] rot;
Gesicht[] blau;

void settings() {
  size(700, 700);
}


void setup() {
  //rot = new Gesicht[10];
  //for ( int i = 0; i< rot.length; i++) {
  //  rot[i]= new Gesicht();
  //}
  //green = new Gesicht[15];
  //for ( int i = 0; i< green.length; i++) {
  //  green[i]= new Gesicht();
  //}
  blau = new Gesicht[20];
  for ( int i = 0; i< blau.length; i++) {
    blau[i]= new Gesicht();
  }
}

void draw() {
  background(farbe);
  //if (variable.klicked()) {
  //  background(150, 0, 0);
  //}
  //for ( int i = 0; i< green.length; i++) {
  //  if(green[i].klicked()){
  //    farbe = color(red(farbe), random(255), blue(farbe));
  //  }
  //  green[i].spawn();
  //}
  //for ( int i = 0; i< rot.length; i++) {
  //  rot[i].spawn();
  //}
  for (int i = 0; i< blau.length; i++) {
    if(blau[i].klicked()){
      farbe = color(red(farbe), green(farbe), random(255));
    }
    blau[i].spawn();
  }
}

(为了简单/易于测试,仅取消注释一组圆圈。请根据需要随意调整)

如果您希望背景仅在单击时更改一次(而不是在按下鼠标时连续更改),则可以添加的最后一项操作是去抖动。这个想法是使用状态/变量来跟踪之前是否按下了按钮,或者在状态再次改变之前只改变背景一次。 (您可以在类中使用额外的布尔变量来实现这一点,或者可能更简单,使用 mouseClicked() 回调来迭代数组,只是为了检查哪个实例已

klicked()
相应地更改背景)。

© www.soinside.com 2019 - 2024. All rights reserved.