Hiện tại tôi đang tự mình làm một trò chơi dựa trên gạch (nghĩ Terraria, nhưng ít tưởng tượng hơn (tôi nghĩ đó là một từ? Xin lỗi nếu không phải vậy)).
Dù sao, tôi hiện đang làm việc phát hiện va chạm (đối với các trường hợp góc!) Đó là một bước tiến lớn đối với tôi. Có một cái gì đó cực kỳ hài lòng về việc nhìn thấy một sprite không chạy qua một khối. Nhưng sau đó tôi đã có ý tưởng để điểm chuẩn. Ý kiến tồi.
1.000 hình vuông, không có vấn đề. 10.000 ô vuông, cho 3 ký tự là loại lag. 100.000 ô vuông (bản đồ thực sự rất lớn), cho 3 nhân vật là không thể chơi được.
Tôi gặp vấn đề khi tôi thậm chí không muốn xem xét các khối quá xa người chơi, nhân vật, vật phẩm, v.v., nhưng tôi không muốn tải những thứ đó ra khỏi bộ nhớ liên tục.
Đây là thuật toán của tôi cho đến nay, xin vui lòng chỉ trích.
foreach (Block in level)
{
if (distance from block to player > a specified amount)
ignore this block;
else
{
get the intersection depth between the two bounding boxes
if (depth of intersection != Zero-vector)
{
check y size vs x size
resolve on smallest axis
}
}
}
Như bạn sẽ lưu ý, khi kích thước cấp độ lớn hơn, Thứ tự của thuật toán này sẽ tăng theo khối N. Tôi thậm chí không muốn xem xét các khối thậm chí không ở gần trình phát.
Tôi nghĩ có thể sử dụng một mảng kép (0,0) đến (mapWidth, mapHeight) thay vì danh sách, tính toán vùng nguy hiểm tùy thuộc vào vị trí của người đó, ví dụ: nếu vị trí của người chơi ở (10, 20) nó sẽ nhìn từ (0, 10) đến (20, 30), v.v.
Bất kỳ suy nghĩ và cân nhắc là tuyệt vời, cảm ơn bạn.