우선, 나는 잠시 동안 내 자신의 게임 논리를 쓰고 있었기 때문에 이것이 곧 보일지 사과드립니다.
쿼드 트리와 그리드 기반 충돌 감지에 대해 많이 읽었습니다. 나는 논리를 이해합니다-기본적으로 객체가 기본적으로 가까이 있지 않으면 충돌을 확인하지 않습니다. 그러나 실제로 어떻게 이것을 실행하는지는 언급되지 않았습니다.
머리에 몇 가지 가능한 방법이 있지만 어느 것이 가장 좋은지 잘 모르겠습니다.
일반 충돌 테스트-최적화 없음
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
}
}
이웃 저장 (방법 1) 그러나 충돌을 최적화하여 가까운 객체 만 확인하려면 어떻게해야합니까? 우리는 여전히 모든 객체를 통과합니까, 아니면 검사 할 객체가 가까운 배열을 생성합니까?
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
}
}
}
모든 객체를 반복하지만 이웃에 대해서만 충돌을 검사합니다 (방법 3) 또 다른 가능성은 충돌을 테스트하기 전에 객체가 근처에 있는지 확인하지만 모든 것을 반복합니다.
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
}
}
}
}
타일 데이터에 객체 저장 (방법 3) 타일 기반 시스템을 사용하면 다른 옵션을 사용할 수 있습니다. 타일 데이터 자체에서 특정 타일에있는 객체를 저장합니다. 주변 타일이 어떤 타일인지 확인하고 충돌 할 수있는 객체가 포함되어 있는지 확인하십시오.
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
}
}
}
저는 항상 현실 세계를 예로 들어 봅니다. 같은 색상의 항목을 비교하려면 색상이 일치하지 않더라도 전체 항목을 모두 확인하는 것이 비논리적 인 것 같습니다 (방법 2, 각 항목 확인). 아마도 모든 것을 확인하는 대신 동일한 색상 (서로 가까운 객체)으로 항목을 수집하고 그 방법 (방법 1)을 검사 할 것입니다.
충돌 검사의 항목이 지속적으로 이동하여 주문이 혼합되기 때문에 이것은 적절한 비교가 아닙니다. 그게 저를 혼란스럽게합니다.
각 항목을 확인하는 것이 더 효율적이므로 이웃 배열을 계속 생성하는 부담을 없애줍니다.
아니면 충돌을 확인하기 위해 너무 많은 객체를 반복 할 필요가없는 이웃을 찾는 것이 더 효율적입니까?
각 타일의 데이터를 계속 변경하면 매우 집중적 인 것처럼 보이므로 좋은 아이디어인지 확실하지 않습니다.
나는 물체가 쏘기 전에 물체가 범위 내에 있으면 타워가 물체를 감지 해야하는 타워 방어 게임을 생각했습니다. 그리고 때로는 모든 물건을 확인하는 것이 어리석은 것처럼 보이지만 때로는 근처에 물건이 없을 수도 있습니다.
긴 글에 대해 사과 드리며 항상 설명하는 데 어려움을 겪고 있습니다.