Processing中鼠标点击函数失效问题求助
Processing点击圆形触发背景变色问题解决
问题分析
你的代码存在几个关键问题导致点击函数无法返回true:
- 主类中
if(variable.klicked())的variable是未定义变量,没有遍历数组中的圆形实例检查点击 - Gesicht类初始化时,
height在成员变量阶段还未被赋值(窗口大小在setup()中设置),导致xPos/yPos的随机值不符合预期 - 使用
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
相关产品推荐
相关产品推荐

