2012-12-15 25 views
5

Tôi đang làm việc trên một trò chơi đua xe cho một dự án trường học. Sử dụng Visual studio 10 pro và Irrlicht. Xin lỗi vì ngữ pháp xấu>.> Và câu hỏi đầu tiên của tôi là không chắc chắn nếu nó được thực hiện đúng.Làm cách nào để tìm một đối tượng trước hoặc sau điểm tham chiếu?

Cách tôi muốn nó hoạt động là tôi tạo điểm tham chiếu tại các điểm khác nhau trên đường ray, và sau đó tôi chạy kiểm tra điểm tham chiếu để xem xe có vượt quá điểm tiếp theo hay không (tiếp theo "cần" để đi qua), nếu có thì nó cập nhật điểm tham chiếu tiếp theo, không có gì khác.

Cách tôi hy vọng điều này sẽ hiệu quả, tôi tạo một vectơ từ n đến n + 1, sau đó tìm vectơ vuông góc với vectơ đầu tiên tại n. Sau đó, tôi thấy nếu đối tượng ở phía trước hoặc phía sau vector đó. Tôi tìm thấy một Gamedev.net forumpost đã giúp tôi thực hiện chức năng này:

void Engine::checkWaypoint(Vehicle* vehicle) 
{ 
    btVector3 vector = waypoints[vehicle->nextWaypoint]; 
    // n 
    btVector3 nextVector = waypoints[vehicle->nextWaypoint + 1]; 
    // n+1 
    vector = nextVector - vector; 
    // First vector 
    btVector3 pos = btVector3(vehicle->position.X,vehicle->position.Y,vehicle->position.Z); 

    float product = vector.dot(pos - waypoints[vehicle->nextWaypoint]); 
    // positiv = before, negative = behind 

    if(product < 0) 
    vehicle->nextWaypoint += 1; 
} 

lỗi hiện tại với điều này là:

  1. cập nhật các nextwaypoint hơn sau đó những người mà không đi qua một điểm mới.

  2. Khi kết thúc và đặt lại, nó dừng kích hoạt trên các điểm tham chiếu đầu tiên.

Vì vậy, câu hỏi của tôi:

Đây có phải là một cách tốt để làm điều này?

Tôi đã làm đúng chưa?

+0

Bạn nên [chấp nhận câu trả lời] (http://stackoverflow.com/faq#howtoask) hoặc nhận xét các câu trả lời được đưa ra nếu không có câu nào thuyết phục bạn, để có được câu trả lời tốt hơn. – Synxis

Trả lời

0

Phát hiện ra rằng mã ban đầu của tôi đang hoạt động, vấn đề với điểm tham chiếu.

Làm cho các điểm tham chiếu dễ nhìn thấy và tất cả chúng đều quá gần nhau, vì vậy kode đã tự lặp lại rất nhiều lần tại cùng một điểm.

Vì vậy, tạo khoảng cách giữa các điểm tham chiếu dài hơn và biến chúng thành một bản nhạc và mọi thứ bắt đầu hoạt động như tôi cũng muốn nó.

1

Thông thường, trong trò chơi đua xe, bạn phải ở điểm kiểm tra để được xác thực: bạn chỉ cần kiểm tra xem chiếc xe có đủ gần điểm kiểm tra không. Vì vậy, tôi nghĩ rằng pseudo-code sau đây sẽ có giá trị:

if(car is_near current_checkpoint) 
    current_checkpoint = current_checkpoint->next_checkpoint; 

is_near: return distance(car, current_checkpoint) < some value 

Các xét nghiệm khoảng cách, bạn có thể sử dụng một hình tròn đơn giản (như trong pseudo-code), hoặc bạn có thể kiểm tra xem xe truy cập vào hộp giới hạn của trạm kiểm soát (hoặc một hộp được đặt bên trong điểm kiểm tra), nó phụ thuộc vào cách các điểm kiểm tra của bạn được thực hiện. Nếu không, bạn có thể có một đường cong được thực hiện bởi tất cả các dòng từ trạm kiểm soát đến người theo dõi của họ, và sau đó tìm đường gần nhất trên đó nó là trên nó, từ đó bạn có thể tìm thấy các trạm kiểm soát tiếp theo. Ví dụ:

     o--o 
        / \ 
    o-----------------o  \ 
/      \ <-- your track: S = start 
/       o     E = end 
/  o---o  X /    o = checkpoint 
S  / \  . /     X = car 
     /  o------.----o 
    /    ^
    E--o     | 
       closest road from the car 

Không thuận tiện: kết quả có thể thay đổi tùy theo độ cong của đường. Tôi khuyên bạn nên sử dụng phương pháp đầu tiên tôi mô tả.

+0

Mã của bạn không trợ giúp với vấn đề hiện tại, nhưng nó đã giúp tôi với một vấn đề khác tôi đã có một số người khác là mã của tôi. Cảm ơn vì điều đó –

1

Mã của bạn đo khoảng cách dọc theo vectơ từ điểm tiếp cận hiện tại đến điểm tiếp theo, trình phát. Tuy nhiên, nếu các vectơ cho hai đoạn liên tiếp là (ví dụ) ở các góc vuông, thì thuật toán có thể bỏ qua nhiều điểm tại một thời điểm. (tức là nếu bạn vẽ đường ngang qua điểm tiếp theo, nó có thể kéo dài ngay giữa đường, có nghĩa là người chơi có thể quay lại và tiến lên trên nó, trong khi lái xe về phía điểm đó).

Một số loại khối lượng giới hạn có thể hoạt động, khoảng cách tới điểm tham chiếu (kiểm tra xem nó có nhỏ hơn 2x chiều rộng của đường) hay khoảng cách tới vector bạn đã tính toán giữa các điểm.

(hoặc bạn có thể nhận được ngay với chỉ bổ sung thêm waypoints)

Là tại sao nó không hoạt động khi bạn lap, có vẻ như bạn chỉ cần thêm một đến điểm tham chiếu để tìm ra kế tiếp. Bạn cần thực hiện phép tính đó modulo tổng số:

next_waypoint = (vehicle->nextWaypoint + 1) % num_waypoints; 
+0

Ahh Mod kiểm tra, biết tôi đã quên một cái gì đó. Cảm ơn vì điều đó. –

Các vấn đề liên quan