Processing点击圆形持续生成新圆形的逻辑实现及递归使用咨询
问题分析
- 你的需求不需要使用递归,递归适用于多层嵌套调用的场景,该功能仅通过交互事件触发状态更新即可实现
- 现有代码的核心问题:
- Processing只会自动调用内置的
mousePressed()函数,你自定义的mousePressed2()完全不会被执行 - 没有存储当前最新圆形的坐标,每次draw函数里生成的随机坐标是临时变量,点击判定逻辑完全错位
- 距离计算逻辑错误,你是用鼠标位置和随机生成的未展示的圆坐标做判定,而非已经展示在画布上的最新圆
background(34,45,323)的第三个颜色参数超过255上限,属于无效参数
- Processing只会自动调用内置的
实现逻辑
- 用两个全局变量存储最新生成的圆形的x、y坐标
- 每次鼠标点击时,计算鼠标位置和当前最新圆形的距离,如果距离小于圆形半径(30),就生成新的随机坐标更新全局变量
- 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
相关产品推荐
相关产品推荐

