Trước hết, tôi chỉ viết logic trò chơi của riêng mình trong một thời gian ngắn, vì vậy tôi xin lỗi nếu điều này có vẻ thẳng tiến.
Tôi đã đọc rất nhiều về cây bốn lá và phát hiện va chạm dựa trên lưới. Tôi hiểu logic - về cơ bản không kiểm tra va chạm trừ khi các vật thể ở gần về cơ bản. Nhưng nó không bao giờ được đề cập làm thế nào thực sự thực hiện điều này.
Tôi có một vài phương pháp sở hữu trong đầu nhưng không chắc phương pháp nào là tốt nhất
Kiểm tra va chạm chung - không tối ưu hóa
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
lưu trữ hàng xóm (phương pháp 1) Nhưng nếu chúng ta muốn tối ưu hóa các va chạm để chỉ kiểm tra các đối tượng ở gần. Chúng ta vẫn chạy qua tất cả các đối tượng hay chúng ta tạo một mảng với các đối tượng gần để kiểm tra?
var objects:Array = new Array();
var neighbours:Array = new Array();
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
neighbours.push(objectA, objectB);
}
}
}
//somewhere else
for(i:int = 0; i < neighbours.length; i++){
//only check neighbours
for(j:int = i + 1; j < neighbours.length; j++){
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
lặp tất cả các đối tượng nhưng chỉ kiểm tra hàng xóm về va chạm (phương pháp 3) Khả năng khác là chúng ta vẫn lặp qua mọi thứ nhưng kiểm tra xem các đối tượng có ở gần trước khi kiểm tra va chạm không.
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
//they are near - check collision!
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
}
Lưu trữ các đối tượng trong dữ liệu gạch (phương pháp 3) Sử dụng sytem dựa trên gạch cho phép tùy chọn khác; Lưu trữ các đối tượng trên một ô cụ thể trong chính dữ liệu của ô đó. Kiểm tra xem đối tượng nào là ô xung quanh có chứa bất kỳ đối tượng nào có thể va chạm với:
var ObjectA;
for(var i:int = 0; i < 4; i ++){
//check 4 surrounding tiles from object A
if(Object.currentTile + surroundingTile[i] CONTAINS collidable object){
//check collision!
if(objectA.collidesWith(surroundingTile.object){
//handle collision logic
}
}
}
Tôi luôn cố gắng nhìn vào thế giới thực như một ví dụ. Nếu tôi muốn so sánh các mục với cùng một màu, có vẻ không hợp lý để kiểm tra tất cả các mục ngay cả khi chúng không khớp màu (Phương pháp 2, kiểm tra từng mục). Tôi có thể sẽ thu thập các mục có cùng màu (các đối tượng ở gần nhau) và kiểm tra các mục đó (phương pháp 1), thay vì kiểm tra mọi thứ.
Đây không phải là một so sánh thích hợp vì các mục trong kiểm tra va chạm liên tục di chuyển để trật tự bị xáo trộn. Đó là những gì làm tôi bối rối.
Sẽ hiệu quả hơn nếu kiểm tra từng mục, do đó loại bỏ sự căng thẳng của việc tạo ra một loạt các hàng xóm.
Hoặc là hiệu quả hơn để tìm hàng xóm do đó không phải vòng qua quá nhiều đối tượng để kiểm tra va chạm?
Tiếp tục thay đổi dữ liệu trên mỗi ô có vẻ rất chuyên sâu, vì vậy tôi không chắc đó có phải là ý hay không ..
Tôi đã nghĩ về một trò chơi phòng thủ tháp trong đó tòa tháp cần phát hiện các vật thể nếu các vật thể nằm trong phạm vi trước khi nó bắn vào nó. Và có vẻ như thật ngớ ngẩn khi kiểm tra tất cả các mặt hàng trong khi đôi khi sẽ không có bất kỳ vật thể nào ở gần.
Tôi xin lỗi vì bài viết dài, luôn gặp khó khăn để giải thích chính mình!