Processing OOP实现多屏保实例失败:实例合并且速度异常
问题分析与解决方案
你遇到的问题核心是类的状态变量未做实例专属处理,导致所有实例共享同一组属性,叠加执行逻辑后出现"合并为一个"且速度异常的现象。以下是具体修正方案:
关键修正要点
- 确保类属性为实例专属:类中的位置、速度、大小等核心变量不能是全局变量或静态变量,必须是每个实例独立拥有的副本。
- 构造函数初始化独立状态:每个实例创建时,通过构造函数传入或生成独立的初始位置、速度等参数,避免所有实例从同一状态启动。
- 独立调用实例逻辑:在
draw()循环中,分别调用每个实例的更新和绘制方法,保证每个实例的逻辑独立执行。
修正后的完整代码示例
1. 正确的screenSavers类实现
class screenSavers { // CS:类专属实例变量,每个实例拥有独立副本 float x, y; // 当前位置 float vx, vy; // 移动速度 float size; // 图形大小 color objColor; // 图形颜色 // 构造函数:为每个实例初始化独立属性 screenSavers(float startX, float startY, float speedX, float speedY, float objSize) { x = startX; y = startY; vx = speedX; vy = speedY; size = objSize; objColor = color(random(255), random(255), random(255)); // 随机生成颜色 } // 更新实例状态:处理边界弹跳逻辑 void update() { // 更新位置 x += vx; y += vy; // 左右边界检测与弹跳 if (x < size/2 || x > width - size/2) { vx *= -1; } // 上下边界检测与弹跳 if (y < size/2 || y > height - size/2) { vy *= -1; } } // 绘制当前实例 void display() { fill(objColor); noStroke(); ellipse(x, y, size, size); } }
2. 主程序逻辑
// 声明三个独立的实例变量 screenSavers instance1, instance2, instance3; void setup() { size(800, 600); // 为每个实例传入随机初始参数,保证状态独立 instance1 = new screenSavers(random(width), random(height), random(-3, 3), random(-3, 3), random(20, 50)); instance2 = new screenSavers(random(width), random(height), random(-3, 3), random(-3, 3), random(20, 50)); instance3 = new screenSavers(random(width), random(height), random(-3, 3), random(-3, 3), random(20, 50)); } void draw() { background(0); // 分别调用每个实例的更新与绘制方法 instance1.update(); instance1.display(); instance2.update(); instance2.display(); instance3.update(); instance3.display(); }
内容的提问来源于stack exchange,提问作者Aarnav Sharma
相关产品推荐
相关产品推荐

