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

基于MousePressed与mouseReleased实现多Ball对象创建及独立定位的技术咨询

解决多Ball对象的拖拽独立问题

嘿,这个问题其实是因为你没给每个Ball对象区分“是否正在被拖拽”的状态,也没真正利用ArrayList来管理它们的生命周期。我来给你梳理下解决方案,附上修改后的代码:

问题分析

你现在的代码直接操作单个ball1对象,每次鼠标按下都会修改它的位置——这就导致旧的Ball(其实你根本没创建多个,只是重复改同一个)会被新的鼠标操作影响。我们需要让每个Ball自己知道“我是不是正在被拖拽”,只有刚创建的那个Ball才会跟随鼠标,已经放下的Ball保持不动。

解决方案步骤

  • 给Ball类添加一个isDragging布尔变量,标记这个球是否处于被拖拽状态。
  • 用ArrayList统一管理所有Ball对象,不再单独定义ball1、ball2。
  • 鼠标按下时,创建新的Ball对象,添加到列表,并将它的isDragging设为true。
  • 鼠标松开时,找到当前正在拖拽的Ball,把它的isDragging设为false,让它停止跟随鼠标。
  • 在draw()里遍历所有Ball:只有处于拖拽状态的Ball才会更新位置为鼠标坐标,然后绘制所有Ball。

修改后的完整代码

class Ball { 
  float xPos, yPos; 
  boolean isDragging; // 新增:标记是否正在被拖拽

  Ball(float xPos, float yPos) { 
    this.xPos = xPos; 
    this.yPos = yPos; 
    this.isDragging = false; // 默认初始状态为不拖拽
  } 

  void drawBall() { 
    ellipse(xPos, yPos, 50, 50); 
  } 

  // 可选:封装更新位置的方法,让代码更清晰
  void updatePosition(float newX, float newY) {
    this.xPos = newX;
    this.yPos = newY;
  }
} 

ArrayList<Ball> ballList = new ArrayList<Ball>(); 

void setup() { 
  size(600, 600); 
} 

void draw() { 
  background(150); 

  // 遍历所有Ball,处理拖拽并绘制
  for (Ball ball : ballList) {
    // 只有正在拖拽的Ball才跟随鼠标
    if (ball.isDragging) {
      ball.updatePosition(mouseX, mouseY);
    }
    ball.drawBall();
  }
}

void mousePressed() {
  // 创建新Ball,初始位置就是鼠标位置,并且标记为正在拖拽
  Ball newBall = new Ball(mouseX, mouseY);
  newBall.isDragging = true;
  ballList.add(newBall);
}

void mouseReleased() {
  // 找到最后一个添加的Ball(也就是当前正在拖拽的那个),停止拖拽
  if (!ballList.isEmpty()) {
    Ball currentBall = ballList.get(ballList.size() - 1);
    currentBall.isDragging = false;
  }
}

关键细节解释

  • isDragging状态:每个Ball独立维护自己的拖拽状态,旧Ball因为状态是false,所以不会再被鼠标位置修改。
  • ArrayList管理:所有Ball都存在列表里,每次鼠标按下新增一个,完全避免了单独变量带来的混乱。
  • mouseReleased处理:因为每次新创建的Ball才会被拖拽,所以直接取列表最后一个来停止拖拽就足够了(如果需要支持拖拽任意已存在的Ball,逻辑可以再调整,但你的需求是每次按鼠标创建新的,这个逻辑完全满足)。

这样修改后,你每次按下鼠标都会生成新的Ball,按住时跟随鼠标,松开后停在原地,之前创建的Ball完全不会被后续操作影响啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:43:18