Va chạm đột phá: Phát hiện phía va chạm


10

Tôi đang viết một bản sao đột phá (trò chơi đầu tiên của tôi) và hoàn toàn bế tắc về cách tôi tìm ra mặt nào của viên gạch bị bắn trúng.

Tôi có một phương pháp phát hiện va chạm trông như thế này:

DetectCollision(Object a, Object b)

   x = distance(a.x, b.x);
   y = distance(a.y, b.y);

   if (x is smaller than the combined width &  y is smaller is than combined height {
       return true;
   }
return false;  

Điều này hoạt động hoàn toàn tốt, nhưng tôi cần biết khía cạnh của vụ va chạm và vị trí liên quan đến trung tâm để đáp ứng đúng.

Tôi đã dành vài ngày qua rình mò nhưng bị lạc.

Câu trả lời:


13

Tất cả điều này có thể được lượm lặt từ vị trí của quả bóng so với vị trí của viên gạch mà nó va chạm.

Một khi bạn đã phát hiện ra một vụ va chạm:

if(ballPosition.y <= brickPosition.y - (brickHeight/2))
  //Hit was from below the brick

if(ballPosition.y >= brickPosition.y + (brickHeight/2))
  //Hit was from above the brick

if(ballPostion.x < brickPosition.x)
  //Hit was on left

if(ballPostion.x > brickPosition.x)
  //Hit was on right

Hai kiểm tra đầu tiên để xem bóng ở trên hay dưới viên gạch. Nếu không phải nó nằm cạnh viên gạch, vì vậy hãy kiểm tra xem nó nằm ở phía nào. Điều này sẽ cần được xử lý để phù hợp với vị trí bạn đang lấy vị trí, ví dụ: brickPocation là trung tâm của brick hoặc brickPocation là góc trên cùng bên trái.


1
Nhưng làm thế nào bạn sẽ sử dụng điều này để định vị lại người chơi, vì người chơi di chuyển bên trong một viên gạch, nhiều điều kiện sẽ được đáp ứng, và nếu bạn đặt lại x mong muốn vào cạnh tường, ví dụ nếu nó nhấn phím của một viên gạch đặt x mong muốn chính xác bên cạnh bức tường, sau đó nó sẽ không thực sự hoạt động bởi vì khi bạn kiểm tra vị trí lý thuyết của nhân vật để xem nó va chạm từ hướng nào, nhiều điều kiện này sẽ được đáp ứng, vậy bạn sẽ làm thế nào sử dụng điều này để thiết lập lại trình phát, bạn có cần thêm người khác vào cuối mỗi nếu) không?
bluejayke

Theo như tôi biết thì "người chơi" trong một game loại đột phá là mái chèo. Mái chèo không di chuyển bên trong viên gạch, bạn cũng không thay đổi vị trí của mái chèo dựa trên sự tương tác của quả bóng với viên gạch. Nếu đó là những gì bạn đang làm, bạn không cần logic bổ sung, chỉ cần không xử lý vị trí cho đến khi bạn thực hiện tất cả các kiểm tra va chạm. Hoặc trả lại một khi kiểm tra là đúng.
MichaelHouse

8

Bạn có thể sử dụng Vector Math để khám phá các góc giữa chúng!

Đây là một câu trả lời ngắn:

ballToBrick = ballPosition - brickPosition;
ballToBrick.Normalize();
brickFacing = Vector2(0,1).Normalize();


float angle = acos( Dot(ballToBrick, brickFacing) );

Mặt gạch là một vectơ phức tạp, nó là "điểm bắt đầu" của phép tính góc. và nếu bạn muốn vectơ chỉ lên, làm cho nó (0, 1), điểm trái (-1, 0), phải (1, 0), chỉ xuống (0, -1). Giả sử bạn đang ở trục OpenGL, trong đó lên và phải là dương.

Nếu bạn không biết, đây là định nghĩa của từng chức năng được sử dụng:

Vector2.Normalize()
{
    float length = squareroot(x * x + y * y);
    x = x / length;
    y = y / length;
    return this;
}

Dot(Vector2 a, Vector2 b)
{
    return a.x * b.x + a.y * b.y;
}

( https://en.wikipedia.org/wiki/Dot_product )

Tham khảo: http://blog.wolfire.com/2009/07/linear-acheebra-for-game-developers-part-2/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.