Добавление нового шара в arraylist вызывает смещение всех последующих позиций шара - PullRequest
1 голос
/ 27 октября 2019

Мне нужно реализовать прыгающие шарики, которые можно добавлять в том положении, когда мышь нажимается и отскакивает от стен. Однако прямо сейчас я могу заставить работать первый шар, но все последующие шары появляются вне позиции мыши и имеют странное обнаружение столкновения со стеной.

Я подозреваю, что это из-за цикла 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();
    }
}  

Я не знаю, что я должен сделать, чтобы исправить это, поэтому любая помощь приветствуется.

1 Ответ

1 голос
/ 28 октября 2019

Проблема в том, чтобы позвонить на translate(). Эта функция не только определяет матрицу перевода, она определяет матрицу и объединяет (умножает) матрицу с текущей матрицей. Это приводит к тому, что первый шар правильный, но каждый следующий шар находится вне ожидаемой позиции.
Используйте pushMatrix() нажмите (сохраните) текущую матрицу, прежде чем будет установлена ​​отдельная матрица перевода для шара,Используйте popMatrix(), чтобы вытолкнуть (восстановить) текущую матрицу после того, как мяч нарисован. Например:

class Ball {

    // [...]

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

...