簡體   English   中英

Android Canvas。如何計算循環中心之間的差異?

[英]Android Canvas.How to calculate difference between centres in loop?

我是新的android。 試圖實現反彈球。 這樣

我的BouncingBallView類如下所示:

private ArrayList<Ball> balls;

public BouncingBallView(Context context) {
    super(context);
    this.balls = new ArrayList<>();


    for(int i=0; i<2; i++)
        this.balls.add(addBall());
}

public Ball addBall(){

    Ball ball;

    // Init the ball at a random location (inside the box) and moveAngle
    Random rand = new Random();
    int radius = 60;
    int x = rand.nextInt(500 - radius * 2 - 20) + radius + 10;
    int y = rand.nextInt(800- radius * 2 - 20) + radius + 10;
    int speed = 10;
    int angleInDegree = rand.nextInt(360);

    ball = new Ball(x, y, radius, speed, angleInDegree);

    return ball;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    for(int i=0; i < balls.size(); i++)
        balls.get(i).draw(canvas);

    for(int i=0; i < balls.size(); i++){

        balls.get(i).intersect(canvas);
        // Update the ball's state with proper collision response if collided.
        balls.get(i).update();
    }

    for(int i=0; i<balls.size(); i++){
        balls.get(i).collide(balls);

    }


    invalidate();
}

並且Ball類具有方法collide();

public void collide(ArrayList<Ball> balls){
    //Log.d("TEst", "LOG");

    // Calculate difference between centres
    float distX = balls.get(0).getBallX() - balls.get(1).getBallX();
    float distY = balls.get(0).getBallY() - balls.get(1).getBallY();

    // Get distance with Pythagora
    double dist = Math.sqrt((distX * distX) + (distY * distY));

    float r = ballRadius + ballRadius;
    if ((float) dist <= r) {
        Log.d("Collide", "Detected");
        this.ballSpeedX = -this.ballSpeedX;
        this.ballSpeedY = -this.ballSpeedY++;
    }
    /*for(int i=0; i < balls.size(); i++) {

        for(int j=1; j<balls.size(); j++) {
            // Calculate difference between centres
            float distX = balls.get(i).getBallX() - balls.get(j).getBallX();
            float distY = balls.get(i).getBallY() - balls.get(j).getBallY();

            // Get distance with Pythagora
            double dist = Math.sqrt((distX * distX) + (distY * distY));

    *//*double distance = Math.sqrt(((balls.get(0).getBallX() - balls.get(1).getBallX()) * (balls.get(0).getBallX() - balls.get(1).getBallX())) + ((balls.get(0).getBallY()
                - balls.get(1).getBallY()) * (balls.get(0).getBallY() - balls.get(1).getBallY())));*//*

            float r = ballRadius + ballRadius;
            if ((float) dist <= r) {
                 Log.d("Collide", "Detected");
                 this.ballSpeedX = -this.ballSpeedX;
                 this.ballSpeedY = -this.ballSpeedY++;
            }
        }
    }*/

}

在這里,我使用畢達哥拉斯定理a ^ 2 + b ^ 2 = c ^ 2來計算兩個圓心之間的距離。 如果球數> 2,如何計算。我嘗試循環播放,但效果非常差(凍結球)。

您可以找到完整的代碼github

現在像這個視頻一樣工作我的彈跳球視頻

感謝幫助;)

抱歉,英語太差了。

您可以在每個階段都有一個用於球的計數器,當一個球被銷毀時(如果您將其銷毀),您可以更改計數並可以在collide方法中檢查(計數器)。

但是我沒關系,您不需要檢查這種情況,如果發生碰撞,那么可以,否則該方法什么也不會發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM