You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Processing中鼠标点击函数失效问题求助

Processing点击圆形触发背景变色问题解决

问题分析

你的代码存在几个关键问题导致点击函数无法返回true:

  1. 主类中if(variable.klicked())的variable是未定义变量,没有遍历数组中的圆形实例检查点击
  2. Gesicht类初始化时,height在成员变量阶段还未被赋值(窗口大小在setup()中设置),导致xPos/yPos的随机值不符合预期
  3. 使用mousePressed会导致按住鼠标时持续触发,应该用点击事件来判断单次点击

修正方案

1. 修正Gesicht类

将坐标随机生成移到构造函数中,确保使用正确的窗口尺寸;同时调整点击判断逻辑:

class Gesicht {
  boolean fail = false;
  float whEllipse = 200;
  float yPos;
  float xPos;
  float xSpeed = 1;
  float P = 1;

  // 构造函数
  Gesicht() {
    // 在构造函数中初始化坐标,此时width/height已生效
    yPos = random(-whEllipse, height);
    xPos = random(-whEllipse, width); // 修正为width,原代码误用height
  }

  void move() {
    xPos += xSpeed;
    yPos += (P*sin(radians(xPos)) + 1);
    if (xPos >= width + whEllipse/2) {
      xPos = -whEllipse/2;
    }
    if (yPos >= height + whEllipse/2) {
      yPos = random(-whEllipse, height/2);
      xPos = random(-200, whEllipse/2);
    }
  }

  // 判断鼠标是否点击当前圆形
  boolean isClicked() {
    // 计算圆形的边界范围
    float left = xPos - whEllipse/2;
    float right = xPos + whEllipse/2;
    float top = yPos - whEllipse/2;
    float bottom = yPos + whEllipse/2;
    // 检查鼠标是否在圆形范围内
    return mouseX > left && mouseX < right && mouseY > top && mouseY < bottom;
  }

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

2. 修正主类代码

使用Processing的mouseClicked()事件处理点击,遍历数组检查每个圆形的点击状态:

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);
  // 绘制所有圆形
  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();
  }
}

// 处理鼠标点击事件
void mouseClicked() {
  // 遍历绿色圆形数组,检查是否有被点击
  for (int i = 0; i < grün.length; i++) {
    if (grün[i].isClicked()) {
      farbe = color(150, 0, 0); // 改变背景色
      return; // 触发后直接退出,避免重复判断
    }
  }
  // 若需要点击其他颜色圆形也触发,可添加对应数组的遍历逻辑
}

关键说明

  • 改用mouseClicked()事件:仅在鼠标点击释放时触发一次,避免mousePressed持续触发的问题
  • 坐标初始化时机:在构造函数中生成随机坐标,此时窗口的width和height已通过settings()设置,确保随机值在正确范围内
  • 遍历数组检查点击:必须逐个检查数组中的每个Gesicht实例,才能判断是否有圆形被点击

内容的提问来源于stack exchange,提问作者Florens Kosicek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:25:35