gpt4 book ai didi

java - 将新球添加到 arraylist 会导致所有后续球位置发生移动

转载 作者:行者123 更新时间:2023-11-30 05:26:03 24 4
gpt4 key购买 nike

我需要实现弹跳球,可以将其添加到按下鼠标的位置并从墙壁弹起。然而现在我可以让第一个球工作,但所有后续的球都出现在鼠标位置之外,并且具有奇怪的墙壁碰撞检测。

我怀疑这是由于我的 for 循环造成的,因为当我向后迭代列表时,球出现在正确的位置,但当我添加新球时,所有球位置都会重置。

ArrayList<Ball> balls;

void setup() {
size (640 , 480, P3D);
noSmooth();
// Create an empty ArrayList (will store Ball objects)
balls = new ArrayList<Ball>();
}

void draw() {
background(1);

// Frame
stroke(255);
line(0, 0, -500, width, 0, -500);
line(0, 0, -500, 0, height, -500);
line(0, height, -500, width, height, -500);
line(width, height, -500, width, 0, -500);
line(0, 0, -500, 0, 0, 0);
line(width, 0, -500, width, 0, 0);
line(0, height, -500, 0, height, 0);
line(width, height, -500, width, height, 0);

//for (int i = balls.size()-1; i >= 0; i--) {
for (int i= 0; i<balls.size(); i ++){
Ball ball = balls.get(i);
ball.move();
ball.display();
}
}

void mousePressed() {
// A new ball object is added to the ArrayList (by default to the end)
balls.add(new Ball(mouseX, mouseY, random(-5.0,5),random(-5.0,5)));
}

// Simple bouncing ball class
class Ball {
PVector pos;
PVector vel;
float grav = 0.1;

Ball(float posX, float posY, float velX, float velY){
pos = new PVector(posX, posY, 1);
vel = new PVector(velX, velY, 1);
}

void move() {
// Add gravity to speed
//vel.y += grav;
// Add speed to y location
pos.add(vel);

if (pos.x>width-50) {
vel.x*=-1;
}
if (pos.y>height-50) {
vel.y*=-1;
}
if (pos.z>500) {
vel.z*=-1;
}
if (pos.x<50) {
vel.x*=-1;
}
if (pos.y<50) {
vel.y*=-1;
}
if (pos.z<0) {
vel.z*=-1;
}
}

void display() {
translate(pos.x,pos.y, -pos.z);
sphere(50);
noFill();
}
}

我不知道我应该做什么来修复它,因此感谢您的帮助。

最佳答案

问题是对 translate() 的调用。此函数不仅定义平移矩阵,它还定义一个矩阵并将该矩阵连接(乘以)到当前矩阵。这会导致第一个球是正确的,但随后的每个球都偏离了预期位置。
使用pushMatrix()在设置球的单独平移矩阵之前推送(存储)当前矩阵。使用popMatrix()在球被绘制后弹出(恢复)当前矩阵。例如:

class Ball {

// [...]

void display() {
pushMatrix();
translate(pos.x, pos.y, -pos.z);
sphere(size);
noFill();
popMatrix();
}
}

关于java - 将新球添加到 arraylist 会导致所有后续球位置发生移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58582913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com