Góc phản chiếu


11

Tôi có trò chơi "Breakeout style" này.

Tôi có một khẩu pháo ở trung tâm, các khối xung quanh khẩu pháo và các miếng đệm xung quanh các khối. Đây là cách trò chơi trông như thế nào:

Một trò chơi Breakout tròn

Tôi đã xoay sở để có được sự va chạm trên mỗi pixel và quả bóng của tôi " phản chiếu " khi tiếp xúc với các khối với phép toán sau:

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

Hình ảnh mô tả một góc tính toán phản chiếu

Trong đó đường màu xanh là hướng bóng và đường màu đen (đường cơ sở) là bề mặt khối.

Hướng là một góc được biểu thị bằng radian (tất nhiên có thể chuyển đổi thành độ).
Bóng được di chuyển bởi:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

Càng xa càng tốt.

Vấn đề của tôi bây giờ, với các miếng đệm (3 khối tối và lớn xung quanh các khối nhỏ màu).

Khi họ quay lại, góc bề mặt thay đổi.
Hơn thế nữa, quả bóng cũng nên đập vào hai bên, vì vậy, làm thế nào tôi có thể đo được hướng đánh và hướng di chuyển mới của quả bóng?

ps : Nếu cần, tôi có thể cung cấp mã và một swf có thể chơi được.


Biên tập

Ok, vấn đề với các góc đã được giải quyết với vectơ , nhưng tôi vẫn gặp vấn đề với va chạm hai bên và lưng.

Tôi sẽ mở một câu hỏi khác cho điều đó và liên kết nó ở đây.


3
Nếu bạn liên kết lại các tài khoản của mình, bạn sẽ nhận được phần thưởng danh tiếng +100. Nó sẽ là một tùy chọn trong tab Tài khoản của bạn. Tuy nhiên, trong lúc này, tôi sẽ đăng những hình ảnh đó cho bạn.
Grace Note

Tôi tập hợp Hướng của bạn là một góc từ 0 đến 360 và để di chuyển quả bóng bạn đang sử dụng lượng giác?
Jonathan Connell

@Grace, Cảm ơn bạn rất nhiều vì những hình ảnh ... @ 3nixios, tôi đã thêm thông tin về góc và chuyển động.
NemoStein

Nếu bạn chỉ lưu trữ một "hướng" cho mỗi khối, có lẽ bạn sẽ mô phỏng lại mỗi khối màu đen thành một nhóm gồm bốn khối riêng lẻ, trong đó mặt "hướng" luôn hướng ra ngoài. Có lẽ sẽ có trường hợp cạnh ở bốn góc.
horatio

Câu trả lời:


8

Tôi không chắc liệu tôi có hiểu đúng vấn đề của bạn không, nhưng tôi cho rằng điều bạn muốn làm là tìm hướng quả bóng của bạn sau một pha va chạm.

Đây là một bản vẽ nhanh trên bảng trắng của tôi cho thấy một giải pháp khả thi cho điều đó:

nhập mô tả hình ảnh ở đây

Mũi tên màu xanh lá cây đại diện cho vận tốc của quả bóng (như một vectơ), các khối màu xanh biểu thị các khối màu đen lớn của bạn và mũi tên màu đỏ là vectơ kết quả.

Trong trường hợp đầu tiên, khối màu xanh có độ nghiêng 30 độ. Một trong những cách để khắc phục sự cố va chạm là đưa mọi thứ trở lại trục ngang. Những gì bạn cần làm là xoay mọi thứ 30 độ (độ nghiêng của khối) (bạn có thể sử dụng ma trận cho điều đó).

Sau đó, bạn kiểm tra xem vụ va chạm từ đâu . Nếu va chạm nằm ngang, đảo ngược thành phần x của vận tốc. Nếu nó là dọc (như trong trường hợp này), thành phần y ( ball.Velocity.Y = -ball.Velocity.Y). Điều này cũng sẽ làm cho quả bóng hoạt động chính xác khi nó chạm vào các góc (nó sẽ đảo ngược cả hai thành phần). Sau đó, bạn chỉ cần xoay trở lại tình huống thực tế (không có trên bản vẽ).

Trong trường hợp thứ hai, đó là điều tương tự, ngoại trừ vận tốc của quả bóng không vuông góc với khối. Bạn xoay 70 độ, kiểm tra xem va chạm từ đâu và đảo ngược các thành phần thích hợp. Sau đó, bạn quay trở lại tình hình thực tế của bạn.

Lưu ý: Tôi nhận thấy rằng bạn đang sử dụng một góc để biểu thị hướng thay vì vectơ. Bạn chỉ có thể tạo một vectơ cho các tính toán này hoặc giữ cùng một ý tưởng chung nhưng làm việc với các góc.

Đây chắc chắn không phải là cách tốt nhất để đi và tôi chắc chắn rằng bạn chỉ có thể tính toán nó theo một cách nào đó nhưng tôi nghĩ đó là một giải pháp khả thi cho vấn đề của bạn.


Cảm ơn ... Yêu bảng của bạn. Tôi sẽ thử trong một phút ... Ahn, và bạn có nghĩ rằng các vectơ có thể tốt hơn để duy trì / làm việc với ??
NemoStein

Haha tha thứ cho kỹ năng vẽ kém của tôi.
Jesse Emond

Rất tiếc, tôi thực sự đã quên một bước quan trọng trong khi vẽ .. Bạn cần xoay ngược lại -block inclination angleđể có phản ứng va chạm thích hợp .. Ngớ ngẩn với tôi.
Jesse Emond

Tôi đoán đó là về sở thích cá nhân, nhưng tôi thích vectơ RẤT NHIỀU. Bạn không cần phải suy nghĩ về toán học đằng sau chúng hầu hết thời gian và nó thường làm cho mã sạch hơn. Vì vậy, bạn có thể giữ một Direction(như một vectơ) và cập nhật vị trí của quả bóng như vậy : ball.Position += ball.Direction * ball.Speed;.
Jesse Emond

@Jlie, tôi đã không thể làm điều này cho đến bây giờ. Tôi hiểu phương pháp của bạn một cách hoàn hảo, nhưng không thể thực hiện nó. Để làm điều này, tôi sẽ cần phải viết lại toàn bộ phần sử dụng các góc radian để sử dụng các vectơ (thực tế điều này không nhiều). Bây giờ tôi sẽ thử các lựa chọn thay thế khác, và nếu bạn có một lựa chọn khác, tôi sẽ vui lòng thử. Cảm ơn.
NemoStein
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.