Làm thế nào để cân nhắc trọng lực khi di chuyển AI


9

Tôi đang làm một trò chơi 2D. Hiện tại có một máy bay trực thăng bay xung quanh, được điều khiển bởi người chơi. Nó được điều khiển bằng các phím mũi tên: LÊN, TRÁI và PHẢI.

Đó là tốc độ dọc theo trục y dyvà tốc độ dọc theo trục x là dx.

Đó là vật lý như sau:

Bất cứ khi nào UP không được nhấn , hãy dytăng tốc liên tục, tăng tốc vô hạn . (Trọng lực). dxvẫn ở giá trị hiện tại của nó.

Khi nhấn UP , dytăng tốc trong gia tốc liên tục từ bất cứ thứ gì hiện tại, lên đến 4 (trở lên, cho đến khi đạt tốc độ 4). dxvẫn ở giá trị hiện tại của nó.

Khi nhấn TRÁI , dxtăng tốc trong gia tốc liên tục, từ mức hiện tại, lên đến -4 .

Khi nhấn RIGHT , dx tăng tốc trong gia tốc liên tục, từ bất cứ thứ gì hiện tại, lên đến 4 .

(Khi nhấn TRÁI hoặc PHẢI và LÊN không được nhấn đồng thời, như tôi đã nói: dyngày càng trở nên nhỏ hơn và nhỏ hơn, vì trọng lực đang ảnh hưởng đến máy bay trực thăng)

Tất cả những điều này làm cho máy bay trực thăng thường theo các vòm trên không, thay vì các đường thẳng.

Điều này tạo ra vật lý có vẻ khá thực tế.

Câu hỏi của tôi là:

Máy bay trực thăng đối thủ, một AI, nên di chuyển bằng hệ thống vật lý tương tự.

Hãy nói rằng AI muốn đi từ nơi hiện tại, đến điểm B.

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

Nếu không có lực hấp dẫn và không tăng tốc dần dần trong trò chơi, nó sẽ dễ dàng. Tôi chỉ đơn giản là vẽ một vectơ từ vị trí của AI đến điểm B và khiến AI đi theo nó.

Nhưng vì lực hấp dẫn và gia tốc dần dần, AI không bao giờ có thể di chuyển theo đường thẳng (gần như). điều gì sẽ là cách tốt nhất để đưa AI đi đến điểm B, càng hiệu quả về thời gian càng tốt?

Làm cách nào để cân nhắc trọng lực khi di chuyển AI tới một đích cụ thể?

(Nếu dễ giải thích hơn, vui lòng xem điểm B ở cùng cấp độ trên trục y với AI và không theo đường chéo với nó.)

Cảm ơn


Bạn có thể vô hiệu hóa vật lý trên AI trong khi nó đang di chuyển không? Nếu vậy, thì bạn có thể vô hiệu hóa nó trong khi nó di chuyển về điểm và kích hoạt khi nó đạt đến nó.
Zhafur

@Zhafur Điều này sẽ làm cho chuyển động của AI có vẻ không thực tế, hoặc ít nhất là khác biệt với cách di chuyển của người chơi dường như. Tôi muốn chuyển động của AI trông giống như chuyển động của người chơi.
dùng3150201

Câu trả lời:


4

tl; dr:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

Tương tự với y. Nhớ tốc độ bị ràng buộc để nó nằm giữa 0 và tốc độ tối đa. Nếu kẻ địch có tốc độ rất chậm tại một số điểm và nó đang cố gắng dừng lại, nó có thể bắt đầu di chuyển theo hướng ngược lại. Không cho phép nó. Dừng lại nếu nó chậm lại và tốc độ của nó dưới 1 * Acc.

Phiên bản dài: Nếu không có chướng ngại vật, chuyển động trên trục y hoàn toàn không liên quan đến (và không ảnh hưởng) đến chuyển động trên trục x. Vì vậy, câu hỏi bạn mô tả có thể được chia thành hai câu hỏi riêng biệt.

  1. Di chuyển đến đó trên trục x
  2. Và di chuyển đến đó trên trục y.

CS.x& CS.ylà tốc độ hiện tại của chúng tôi trên các trục x và y.

TS.x& TS.yLà thời gian bạn sẽ chỉ dừng lại theo chiều dọc hoặc chiều ngang xem xét tốc độ hiện tại của bạn trong trục có liên quan.

D.x& D.ylà khoảng cách trên mỗi trục.

tl; dr: bạn tiếp tục tăng tốc (nếu có thể [trừ khi bạn đạt tốc độ tối đa]) trên trục x cho đến khi bạn đạt đến một điểm trong đó điều kiện sau là đúng:

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

Tương tự với y.


2

Một cách tiếp cận tôi đã sử dụng cho một vấn đề tương tự là trước tiên vẽ một vectơ cho mục tiêu, sau đó so sánh nó với hướng vận tốc hiện tại.

Vì vậy, lấy góc đã ký giữa vectơ vận tốc và vectơ đích và đặt một lực đẩy tương ứng với kích thước của vectơ.

Vì vậy, nếu góc a giữa vectơ vận tốc màu đỏ và vectơ mục tiêu xanh là âm thì áp dụng lực đẩy dương, nếu không thì không áp dụng lực đẩy và để trọng lực phân loại nó ra.nhập mô tả hình ảnh ở đây

Lưu ý rằng bạn sẽ phải đối xử với bốn góc phần tư trong đó mục tiêu có thể khác nhau (như thể mục tiêu nằm ở góc trên bên trái, một góc dương sẽ yêu cầu áp dụng lực đẩy).

Ngoài ra, đảm bảo áp dụng lực đẩy tương ứng với độ lệch so với vận tốc mục tiêu.

Về mặt kỹ thuật, điều này không tính đến trọng lực, nó bù cho trạng thái hiện tại và điều đó có nghĩa là máy bay trực thăng AI có thể không bay theo đường thẳng đến mục tiêu nhưng sẽ chao đảo một chút. Điều này có thể hoặc không thể làm việc cho trò chơi của bạn.


1
Cảm ơn. Một số câu hỏi về điều này: 1- "... áp dụng một lực đẩy tương ứng với kích thước của vectơ " . Ý bạn là, "kích thước của góc " ? 2- Theo 'góc ký', ý bạn là tích cực hay tiêu cực - đúng không? Nếu vậy, hơn một góc là dương nếu nó nằm trên đường màu nâu và âm tính nếu nó nằm dưới đường màu nâu. Đúng? 3- Nếu tôi hiểu chính xác, ý của bạn là: Mọi khung hình, hãy lấy góc giữa vectơ vận tốc hiện tại và vectơ hiện tại đến mục tiêu. Sau đó cộng / trừ từ dx và dy tương ứng. Điều này có đúng không?
dùng3150201

@ user3150201 Có về câu hỏi góc. Có trong câu hỏi đã ký / chưa ký, atan2 có thể cung cấp cho bạn góc đã ký giữa hai vectơ. Có vẻ như bạn hiểu quan điểm của tôi, xin lỗi nếu tôi không rõ ràng.
sinh

1

Bạn chỉ có thể tính toán lại chuyển động của từng khung X. Giả sử bạn không đặt quá nhiều khung hình giữa, nhưng đủ để nó không ảnh hưởng đến hiệu suất, lực hấp dẫn trên một chiếc trực thăng không đủ mạnh để thực sự thấy quỹ đạo thay đổi. Thêm vào đó, tôi nghĩ rằng một người chơi có thể có thể di chuyển theo cùng một cách, thích nghi với trọng lực trong khi di chuyển và không có kế hoạch.

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.