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

Processing中实现4个独立方块垂直移动碰壁转向的无重复循环方法

嘿,我来帮你解决这个问题!既然已经能搞定单个方块的垂直移动+边缘反弹,那扩展到4个完全不需要写4遍重复代码——核心思路就是用数组来管理所有方块的状态,再配合循环统一处理更新和绘制逻辑就行。下面给你两种实用的实现方式,按需选择:

方式一:用类封装(推荐,易维护)

这种方式把每个方块的属性和行为都封装成一个类,后续要加更多方块或者扩展功能(比如改变颜色、大小)都超级方便。

1. 定义方块类

先写一个Box类,把每个方块需要的位置、速度、大小,还有更新、绘制的方法都放进去:

class Box {
  float x; // 水平位置
  float y; // 垂直位置
  float speed; // 垂直移动速度
  float size; // 方块尺寸

  // 构造函数:初始化方块的初始状态
  Box(float startX, float startY, float startSpeed, float boxSize) {
    x = startX;
    y = startY;
    speed = startSpeed;
    size = boxSize;
  }

  // 更新位置+边缘反弹逻辑
  void update() {
    y += speed;
    // 碰到窗口顶部或底部时反转速度
    if (y <= 0 || y + size >= height) {
      speed *= -1;
    }
  }

  // 绘制方块
  void display() {
    rect(x, y, size, size);
  }
}

2. 初始化方块数组

在主代码里声明一个Box类型的数组,然后在setup()里创建4个不同的方块实例(可以给它们设不同的水平位置、初始速度,让移动效果更丰富):

Box[] boxes; // 存储所有方块的数组

void setup() {
  size(400, 400);
  boxes = new Box[4]; // 数组长度设为4,对应4个方块
  
  // 逐个初始化方块,参数分别是:x位置、y初始位置、移动速度、尺寸
  boxes[0] = new Box(50, 100, 2, 40);
  boxes[1] = new Box(150, 50, -3, 35);
  boxes[2] = new Box(250, 200, 1.5f, 45);
  boxes[3] = new Box(320, 300, -2.5f, 30);
}

3. 循环处理所有方块

在draw()里只需要一个循环,遍历数组里的每个方块,调用它们的update()和display()方法就搞定了,完全没有重复代码:

void draw() {
  background(220); // 每次刷新画布
  
  // 遍历所有方块,统一更新+绘制
  for (int i = 0; i < boxes.length; i++) {
    boxes[i].update();
    boxes[i].display();
  }
}

方式二:平行数组(适合刚入门,不用类)

如果还没接触过Processing的类,也可以用多个平行数组来分别存储每个方块的位置、速度、尺寸,同样能实现无重复代码:

// 定义4个数组,分别存储每个方块的x位置、y位置、速度、尺寸
float[] xPositions;
float[] yPositions;
float[] speeds;
float[] sizes;

void setup() {
  size(400, 400);
  // 初始化4个方块的各项属性
  xPositions = new float[]{50, 150, 250, 320};
  yPositions = new float[]{100, 50, 200, 300};
  speeds = new float[]{2, -3, 1.5f, -2.5f};
  sizes = new float[]{40, 35, 45, 30};
}

void draw() {
  background(220);
  
  // 循环处理每个方块
  for (int i = 0; i < 4; i++) {
    // 更新垂直位置
    yPositions[i] += speeds[i];
    // 边缘检测+反弹
    if (yPositions[i] <= 0 || yPositions[i] + sizes[i] >= height) {
      speeds[i] *= -1;
    }
    // 绘制方块
    rect(xPositions[i], yPositions[i], sizes[i], sizes[i]);
  }
}

两种方式都能完美实现你要的效果:4个独立方块垂直移动,碰到边缘自动转向,而且完全没有重复的代码。个人更推荐第一种类封装的方式,后续扩展功能会省心很多~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:07:55