Phòng thủ tháp 2D - Một viên đạn vào kẻ thù


14

Tôi đang cố gắng tìm một giải pháp tốt để một viên đạn bắn trúng kẻ thù. Trò chơi là tháp phòng thủ 2D, tòa tháp được cho là bắn một viên đạn và bắn trúng kẻ thù được bảo đảm.

Tôi đã thử giải pháp này - http://blog.wolfire.com/2009/07/linear-acheebra-for-game-developers-part-1/

Liên kết được đề cập để trừ đi nguồn gốc của viên đạn và cả kẻ thù (trừ vector). Tôi đã thử điều đó nhưng một viên đạn chỉ theo sau kẻ thù.

float diffX = enemy.position.x - position.x;
float diffY = enemy.position.y - position.y;

velocity.x = diffX;
velocity.y = diffY;

position.add(velocity.x * deltaTime, velocity.y * deltaTime);

Tôi quen thuộc với các vectơ nhưng không chắc chắn các bước (hoạt động toán học vectơ) sẽ được thực hiện để giải pháp này hoạt động.


Câu trả lời:


11

Lý luận của bạn rất hoàn hảo: sử dụng một vectơ để di chuyển từ vị trí của tôi đến mục tiêu của tôi. Đây là mục đích của một vectơ ; bạn chỉ đơn giản là quên tốc độ !

Vận tốc là một vectơ: tốc độ và hướng. Tuy nhiên, nếu bạn quên bình thường hóa vectơ chênh lệch và nhân nó với tốc độ đạn (vô hướng), về cơ bản bạn đang nói rằng nếu bạn ở gần mục tiêu (vectơ chênh lệch nhỏ) thì viên đạn chậm lại ; trong khi nếu bạn ở xa thì tốc độ đạn càng lớn.

Đây là vấn đề cơ bản: bạn cần tính cả hướng độ lớn của vectơ.


Cảm ơn đã giúp đỡ. Tôi đã thử sử dụng vô hướng sau khi tôi tính toán vectơ chênh lệch, có vẻ như nó hoạt động nhưng có vẻ không tốt. Tôi đã cố gắng để xem nếu tôi tính toán vector khác biệt, bình thường hóa, sau đó vô hướng vận tốc. Có vẻ tốt hơn ngay bây giờ. Vâng, tôi nghĩ rằng tôi cần những tên lửa dẫn đường trong trò chơi này sau đó. Cảm ơn một lần nữa.
Tashu

1
Liệu câu trả lời này không có ý nghĩa với bất cứ ai khác?
BlueRaja - Daniel Pflughoeft

@Fxlll: Ok, tôi nghĩ tôi thấy những gì bạn đang cố gắng nói. Có rất nhiều lông tơ không liên quan đến câu trả lời ở đầu / cuối, và tôi cũng bị nhầm lẫn bởi tiếng Anh của bạn (mà tôi nhận ra có lẽ không phải là lỗi của bạn) . Tôi đã gửi đề xuất chỉnh sửa để xóa câu trả lời này.
BlueRaja - Daniel Pflughoeft

@BlueRaja - Daniel Pflughoeft cảm ơn vì nỗ lực của bạn!
FxIII

7

Nếu mục tiêu đang di chuyển theo hướng ổn định với tốc độ ổn định và đường đạn của bạn nằm trên một đường thẳng với tốc độ ổn định, bạn có thể sử dụng phương trình bậc hai để dự đoán vị trí chính xác mà chúng sẽ giao nhau và nhắm súng của bạn vào vị trí đó .

Vì chắc chắn rằng viên đạn sẽ bắn trúng, và bạn có thể tính toán thời gian chính xác mà nó sẽ bắn từ khi bắn đến khi va chạm, không cần phát hiện va chạm, chỉ cần bắn súng, đợi khoảng thời gian tính toán, đăng ký một cú đánh.

Đây là mã giả cho phương trình bậc hai:

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

Cảm ơn mã giả, tôi sẽ kiểm tra nó để xem phương trình bậc hai hoạt động như thế nào với tình huống này. Cảm ơn một lần nữa.
Tashu

Vấn đề là người dùng có thể di chuyển về phía viên đạn và ngay trước khi bắn, anh ta có thể thoát khỏi dấu vết của viên đạn. Trong trường hợp này, giải pháp này có đủ tốt không?
Martin.

Không, như đủ điều kiện trong câu đầu tiên. Điều này không dành cho tất cả các trò chơi mà chỉ dành cho một trò chơi mà mục tiêu chỉ di chuyển với vận tốc không đổi. Vận tốc không đổi có nghĩa là cả hướng và tốc độ. Ví dụ, trò chơi theo phong cách Defense Grid có thể sử dụng phương pháp này.
Steve H

3

Bạn cần 'dự đoán' vị trí của các vật thể vào thời điểm viên đạn sẽ chạm tới nó. Bạn có thể làm điều này bằng cách sử dụng tốc độ / vận tốc của vật thể (hy vọng là không đổi;)) và đó là véc tơ định hướng.

Tôi không chắc công thức chính xác nằm ngoài đỉnh đầu là gì nhưng tôi nghĩ nó giống như thế này:

NewPocation = OldPocation + (Tốc độ * DirectionVector);

Nếu bạn có một đường dẫn được thiết lập, bạn sẽ cần tính toán lại khi đối tượng thay đổi hướng. Sử dụng NewPocation này làm vectơ kẻ thù của bạn và viên đạn sẽ bắn trúng đối tượng mà không có 'hiệu ứng homing'. Homing xảy ra do thực tế đối tượng đã di chuyển kể từ khi vectơ ban đầu được tính toán, nó chỉ có thể bắt kịp khi một đối tượng di chuyển theo một hướng đủ lâu.

Hi vọng điêu nay co ich :)


3
Hoặc bạn có thể gian lận và tự động nhấn, sau đó sử dụng sprite di chuyển làm phản hồi trực quan. Hoặc chỉ bắn đạn của bạn ở tốc độ 50000²mph.
Jonathan Connell

1

Bạn có thể tránh sử dụng căn bậc hai và sức mạnh của 2.

var distX:Float = target.x - x;
var distY:Float = target.y - y;
_velX = distX / timeTravel;
_velY = distY / timeTravel;

// Take out if you want a nice slow down as approaches effect.  
timeTravel -= 1.0; // make sure u have a positive timeTravel.
x += _velX;
y += _velY;

if (distX < 0)
    distX = -distX;

if (distY < 0)
    distY = -distY;

if (_velX < 0)
    _velX = -_velX;

if (_velY < 0)
    _velY = -_velY;

// Should both snap @ the same time.
if (distX < _velX)
x = target.x; // snap & see what happens.

if (distY < _velY)
y = target.y; // snap & see what happens.

// TODO: call your onHitTarget here ...
// Hopefully this shall provide 10x the performance 
// of using Math.sqrt and all the extra multiplications.

Tất cả được viết từ bộ nhớ. Nhân tiện, hãy sử dụng các yếu tố hoạt động - kiểm tra từng dòng nếu bạn là người mới. Số nổi là số trong AS3.

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.