Làm thế nào để tôi làm cho các đối tượng di chuyển dọc theo một con đường?


7

Tôi đang cố gắng để có được một cái gì đó như hình ảnh dưới đây. Như bạn có thể thấy, có một đường cao tốc và bên trong nó, sẽ có một số vật thể chuyển động (mili giây). Tôi đoán hành vi đường phố giống như một đường ống dẫn. Khi đường cao tốc tải một vật thể, nó sẽ xuất hiện ở đầu và nó sẽ di chuyển qua đường cao tốc cho đến khi nó đến cực khác của đường cao tốc.

Vấn đề chính của tôi là, làm thế nào tôi có thể di chuyển một số vật thể chỉ bên trong đường cao tốc?

chụp màn hình từ bloons td4 cấp 1

Câu trả lời:


17

Điều đó phụ thuộc: bạn muốn họ di chuyển như thế nào?

Tùy chọn không tự nhiên

Xác định một đường dẫn đặt sẵn với một loạt các đỉnh và để bóng bay theo đường dẫn một cách nghiêm ngặt.

Một lựa chọn tự nhiên hơn

Làm cho bóng bay sôi sục và thực hiện hành vi đám đông theo hành vi , điều này sẽ khiến chúng đi theo đường dẫn (và không đi quá xa nó) trong khi tránh va chạm với nhau. Cả hai trang này đều chứa các ví dụ về applet Java.

Tác giả của những trang đó lưu ý rằng anh ta không thể phân phối mã nguồn của các ví dụ, tuy nhiên OpenSteer cung cấp triển khai C ++ cho các thuật toán đó.

(Tôi không biết về bất kỳ thư viện nào của C #, hoặc bất kỳ hướng dẫn tử tế nào - điều tốt nhất tôi đã làm chỉ là làm theo các ví dụ mã)


+1 cho câu trả lời hay. Tôi nghĩ rằng việc đi theo con đường đơn giản là điều duy nhất cần thiết để mô phỏng hành vi được mô tả. Các hành vi chỉ đạo sẽ có ích, khi con đường đột nhiên rộng hơn hoặc chướng ngại vật xuất hiện nơi các "boids" sẽ xếp hàng.
bummzack

Tôi nghĩ rằng lựa chọn đầu tiên sẽ dễ dàng hơn. Có thể bạn có thể chỉ cho tôi một ví dụ?
oscar.fimbres

@ oscar.fimbres: Điều đó khá đơn giản. Chỉ cần tạo một danh sách các tọa độ điểm (ví dụ: một mảng), lấy tọa độ đầu tiên làm mục tiêu và di chuyển tác nhân của bạn theo hướng đó. Khi tác nhân đạt đến điểm tham chiếu, hãy lấy mục tiêu tiếp theo làm mục tiêu. Nếu tác nhân di chuyển với vận tốc không đổi, bạn cũng có thể dễ dàng ánh xạ bất kỳ phần vượt quá nào đến mục tiêu tiếp theo.
bummzack

Vâng, tôi có thể tưởng tượng .. Tôi đang kiểm tra trang web: enchantedage.com/node/78 Mặc dù, tôi có thể di chuyển sprite của mình trong đường dẫn đó
oscar.fimbres

IMO, boids là quá mức cho một vấn đề đơn giản như vậy. Chuyển động tại bất kỳ thời điểm nào về cơ bản là 1D và không chịu sự đảo ngược của hướng. Bất kỳ hành vi lái nào có thể sẽ cực kỳ đơn giản và không thực sự đảm bảo loại hệ thống đó. Bên cạnh đó, những quả bóng bay sẽ không hoạt động như một bầy, chúng hoạt động tự chủ cho thấy không có nỗ lực thực sự nào để duy trì "đàn chiên" - chúng chỉ bị mắc kẹt trên một con đường và tất cả đều đi cùng một hướng. Đó là sự trùng hợp ngẫu nhiên, không phải là một hành vi được lập trình rõ ràng. Đối xử với họ như một bầy không thực sự có ý nghĩa gì ngay cả trong bối cảnh lái xe. Bạn có theo dõi mọi người không?
PatrickB

4

Bạn cần một danh sách các điểm và một danh sách các bong bóng

class Path 
{
   List<Vector2> Points;
   float[] Lengths;
   Vector2[] Directions;

   void Build()
   {
       Lengths = new float[Points.Count-1];
       Directions = new float[Points.Count-1];
       for (int i=0; i<Points.Count-1;i++)
       {
            Directions[i] = Points[i+1] - Points[i];
            Lengths[i] = Directions[i].Length();
            Directions[i].Normalize();
       }  
   }
}

class Balloon
{
     Vector2 Position;
     float StagePos;
     int StageIndex;
     Path Path;
     float Speed;

     void Update(float Seconds)
     {
         if (StageIndex!=Path.Points.Count-1)
         {
             StagePos += Speed * Seconds;
             while (StagePos>Path.Lengths[StageIndex])
             {
                 StagePos -= Path.Lengths[StageIndex]; 
                 StageIndex++;              
                 if (StageIndex == Path.Points.Count-1) 
                 {
                     Position = Path.Points[StageIndex];
                     return;
                 }
             }
             Position = Path.Points[StageIndex] + Directions[StageIndex] * StagePos;
         }
     }    
}

3

Nếu bạn có một con đường được tạo thành từ các viên gạch với một con đường duy nhất ("đường ống" như bạn đã gọi), thì bạn không cần boids, tránh, AI, hoặc thực sự bất cứ điều gì siêu đặc biệt. Chỉ cần có mỗi quả bóng di chuyển theo hướng tự nhiên của gạch đường. Ví dụ: được cung cấp một ô bắt đầu chỉ có một ô không cát để chạm vào, bạn có thể tìm ra hướng di chuyển - đó là hướng "không ở đây, không phải nơi tôi ở và không phải cát". Vì đường của bạn chỉ có hai hướng lưu lượng có thể, nên một khi hướng ban đầu và lát được thiết lập, thuật toán sẽ giải quyết vấn đề.

Những quả bóng bay sẽ xuất hiện để theo nhau chỉ đơn giản vì không có nơi nào khác để đi. Nếu tất cả chúng đều di chuyển với tốc độ không đổi, thì không thể va chạm được. Ngay cả khi chúng không di chuyển với tốc độ không đổi, "không phải ở đây, không phải nơi tôi ở và không phải cát" có thể có "và đảm bảo có đủ không gian cho tôi".

Bạn có thể khái quát một chút và sử dụng hình ảnh của ô như một phương pháp trích xuất hướng. Ví dụ: dải đường hình chữ L có nghĩa là "nếu bạn đang đi về phía nam, sau đó quay về hướng đông" hoặc "nếu bạn đang đi về phía tây, hãy quay về hướng bắc".

Hệ thống này bị hỏng khi bạn đưa ra quyết định, nghĩa là nhiều hơn một con đường có thể được thực hiện, nhưng từ ảnh chụp màn hình và mô tả vấn đề của bạn, điều đó dường như không phải là vấn đề. Nếu đó là một yêu cầu cho ứng dụng của bạn, thì chắc chắn đầu tư vào một cách tiếp cận tập trung vào AI hơn.

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.