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

Processing点击圆形持续生成新圆形的逻辑实现及递归使用咨询

问题分析

  • 你的需求不需要使用递归,递归适用于多层嵌套调用的场景,该功能仅通过交互事件触发状态更新即可实现
  • 现有代码的核心问题:
    • Processing只会自动调用内置的mousePressed()函数,你自定义的mousePressed2()完全不会被执行
    • 没有存储当前最新圆形的坐标,每次draw函数里生成的随机坐标是临时变量,点击判定逻辑完全错位
    • 距离计算逻辑错误,你是用鼠标位置和随机生成的未展示的圆坐标做判定,而非已经展示在画布上的最新圆
    • background(34,45,323)的第三个颜色参数超过255上限,属于无效参数

实现逻辑

  1. 用两个全局变量存储最新生成的圆形的x、y坐标
  2. 每次鼠标点击时,计算鼠标位置和当前最新圆形的距离,如果距离小于圆形半径(30),就生成新的随机坐标更新全局变量
  3. draw函数每次绘制最新的圆形即可,要保留历史生成的圆形就不清空背景,要仅显示最新圆形就每次draw先调用background清空画布

修正后可运行代码

// 存储最新圆形的坐标
float latestX = random(640);
float latestY = random(640);
// 固定圆形半径为30,直径60
final float RADIUS = 30;

void setup(){
  size(640,640);
  background(34,45,200); // 颜色参数取值范围为0-255
}

void draw(){
  // 如果需要保留所有历史生成的圆形,注释掉下面这行background即可
  // background(34,45,200);
  ellipse(latestX, latestY, RADIUS*2, RADIUS*2);
}

void mousePressed() {
  // 计算鼠标点击位置和最新圆形的距离
  float distance = dist(mouseX, mouseY, latestX, latestY);
  // 判定是否点击到了当前最新的圆形
  if (distance < RADIUS) {
    // 生成新的随机坐标,更新为最新圆形,限制范围避免圆形超出画布
    latestX = random(RADIUS, width - RADIUS);
    latestY = random(RADIUS, height - RADIUS);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:15:06