2012-03-09 41 views
6

Tôi đang cố gắng thực hiện phát hiện xung đột liên tục đơn giản cho trò chơi pong của tôi tuy nhiên tôi không chắc chắn tôi đang thực hiện hoặc hiểu quyền này. AFAIR liên tục phát hiện va chạm được sử dụng cho các đối tượng chuyển động nhanh có thể đi qua một đối tượng khác phá vỡ phát hiện va chạm bình thường. Vì vậy, những gì tôi đã cố gắng là bởi vì đối tượng chuyển động nhanh duy nhất tôi có là một quả bóng, tôi chỉ cần vị trí của quả bóng, tốc độ di chuyển của nó, và vị trí của vật thể mà chúng ta so sánh với. Tôi có thể làm được điều đó. Từ đây tôi đã hình dung rằng tốt nhất là ví dụ nếu tốc độ di chuyển của quả bóng cho biết nó đang di chuyển sang trái, tôi sẽ so sánh nó bị ràng buộc trái nhất với giới hạn bên phải nhất của đối tượng kia. Từ điều này tôi sẽ bước qua bằng cách thêm tốc độ di chuyển đến giới hạn trái nhất của quả bóng và so sánh để chắc chắn rằng nó lớn hơn các đối tượng khác phải ràng buộc. Điều này sẽ cho thấy rằng không có va chạm bên phải trái.Phát hiện va chạm liên tục 2D

Tôi có một số thứ có phần hoạt động, nhưng không may, quả bóng bắt đầu nảy lên bình thường trong một thời gian rồi nó hoạt động như thể nó chạm vào mái chèo khi không có gì ở đó.

Tôi bị mất một chút, mọi trợ giúp sẽ được đánh giá cao!

static bool CheckContinuousCollision(PActor ball, PRect ballRect, PActor other, PRect otherRect) 
{ 
    PVector ballMoveSpeed; 
    int ballXLimit; 
    int ballYLimit; 

    ballMoveSpeed = ball.moveSpeed; 

    // We are moving left 
    if (sgn(ball.moveSpeed.x) < 0) 
    { 
     ballXLimit = std.math.abs(ballMoveSpeed.x)/2; 

     for (int i = 0; i <= ballXLimit; i++) 
     { 

       if (ballRect.Left < otherRect.Right && otherRect.Left < ballRect.Left) 
      { 
       return true; 
      } 

      ballRect.Left -= i; 
     } 
    } 

      //We are moving right 
    if (sgn(ball.moveSpeed.x) > 0) 
    { 
     ballXLimit = std.math.abs(ballMoveSpeed.x)/2; 

     for (int i = 0; i < ballXLimit; i ++) 
     { 

      if (ballRect.Right > otherRect.Left && ballRect.Right < otherRect.Right) 
      { 
       return true; 
      } 

      ballRect.Right += i; 
     } 
    } 
      // we are not moving 
    if (sgn(ball.moveSpeed.x) == 0) 
    { 
     return false; 
    } 
} 

Trả lời

1

Bạn dường như đang kiểm tra sự va chạm của chỉ một thứ nguyên, tức là kích thước X của quả bóng so với khác.

Điều bạn có thể muốn là so sánh xem hai đối tượng có va chạm trong không gian 2ngày hay không. Điều này có thể dễ dàng thực hiện bằng cách điều chỉnh từng đối tượng Bounding Rectangle và kiểm tra xem các hình chữ nhật có chồng lên nhau hay không. Sau đó, trong vòng lặp của bạn, bạn có thể điều chỉnh hình chữ nhật của bạn Bóng phù hợp

+0

Oh bạn đã đúng! Tôi đã làm việc này quá lâu. Tôi quên tác dụng phụ của việc không kiểm tra kích thước Y. – RedShft

Các vấn đề liên quan