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

如何通过for循环结合数组实现p5.js中6个圆点的线性移动

实现目标
  • 完成6个线性移动圆点动画效果:3个沿水平方向往复移动,3个沿垂直方向往复移动
  • 使用数组存储所有圆点的运动参数
  • 通过for循环实现圆点的批量绘制、移动逻辑,替代原有单变量控制所有圆点同步运动的写法
原有代码缺陷
  • 仅用单个位置变量c、单个速度变量cspeed控制全部6个圆点,所有圆点运动状态完全绑定,无法独立运动
  • 逐行硬编码6个圆点的绘制语句,未使用循环做批量处理,不符合实现要求
  • 边界判断未考虑圆点半径,圆点会有一半移出画布边缘才会反向
改造后完整代码

p5.js 逻辑代码

// 水平移动圆点参数数组:每个元素存储固定y坐标、动态x坐标、移动速度
let horizontalDots = [];
// 垂直移动圆点参数数组:每个元素存储固定x坐标、动态y坐标、移动速度
let verticalDots = [];
const dotDiameter = 50; // 圆点直径
const dotRadius = dotDiameter / 2;

function setup() {
  createCanvas(800, 800);
  // 初始化3个水平移动圆点,设置不同速度避免完全同步
  horizontalDots.push(
    { posY: height / 4, posX: 0, speed: 4 },
    { posY: height / 2, posX: 0, speed: 3 },
    { posY: height / 9, posX: 0, speed: 5 }
  );
  // 初始化3个垂直移动圆点,设置不同速度避免完全同步
  verticalDots.push(
    { posX: height / 4, posY: 0, speed: 4 },
    { posX: height / 2, posY: 0, speed: 3.5 },
    { posX: height / 9, posY: 0, speed: 4.5 }
  );
}

function draw() {
  background(220);

  // 循环批量处理所有水平移动圆点
  for (let i = 0; i < horizontalDots.length; i++) {
    const currentDot = horizontalDots[i];
    // 更新位置
    currentDot.posX += currentDot.speed;
    // 碰到左右边界时速度反向
    if (currentDot.posX > width - dotRadius || currentDot.posX < dotRadius) {
      currentDot.speed *= -1;
    }
    // 绘制圆点
    ellipse(currentDot.posX, currentDot.posY, dotDiameter, dotDiameter);
  }

  // 循环批量处理所有垂直移动圆点
  for (let i = 0; i < verticalDots.length; i++) {
    const currentDot = verticalDots[i];
    // 更新位置
    currentDot.posY += currentDot.speed;
    // 碰到上下边界时速度反向
    if (currentDot.posY > height - dotRadius || currentDot.posY < dotRadius) {
      currentDot.speed *= -1;
    }
    // 绘制圆点
    ellipse(currentDot.posX, currentDot.posY, dotDiameter, dotDiameter);
  }
}

页面引入代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>
实现逻辑说明
  • 按移动方向拆分两个数组存储圆点参数,每个圆点的位置、速度独立存储,运动状态互不影响
  • 所有圆点的位置更新、边界检测、绘制操作都通过for循环批量完成,无单个圆点的硬编码逻辑
  • 边界判断时加入圆点半径偏移,圆点碰到画布边缘时刚好贴合边缘就反向,不会出现半块圆点移出画布的问题
  • 给每个圆点设置了差异化的移动速度,避免所有圆点运动完全同步的生硬效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:24:28