2017-02-04 5 views
3

저는 물리 경험 엔진을 학습 경험으로 구축하고 있으며, 다른 충돌 및 해결 함수의 견고한 구현에 관해서는 약간 고생했습니다. 그것을위한 수학은 문제가 아니라, 그것을 점검하는 방법입니다.두 값을 기반으로 호출 할 함수를 결정하십시오.

상자, 타원, 선 등의 개체가 모두 부모 '물리 엔터티'개체에서 확장되지만 모양과 같은 자체 속성이 있습니다. 다소이 같은 두 물체가 나는 그들이 실제로 충돌하는 경우 확인,하지만 난 모양의 각 조합에 대해 약간 다르게 몇 가지를 계산하기 위해 필요하고 싶지 서로 가까운

이제
function PhysicsEntity(x, y) { 
    this.x = x || 0; 
    this.y = y || 0; 
    this.velocity = { 
     x: 0, 
     y: 0 
    } 
} 

function Box(x, y, width, height) { 
    PhysicsEntity.apply(this, [x, y]); 

    this.width = width || 150; 
    this.height = height || 50; 
    this.shape = 'box'; 
} 

, (상자 & 상자, 상자 & 타원, 타원 등 & 선) 내 접근 방식의

하나는 그냥 CONCAT, 알파벳 순으로 정렬 그것을 배열에 두 개의 모양을 넣어 가득한 객체에 대한 키로 것을 사용하는 것이 었습니다 기능 :

var collisions = { 
    'box_ellipse': function() { 
     // Collision check 
    } 
} 

isColliding(Entity1, Entity2) { 
    var shapes = [Entity1, Entity2]; 

    if(Entity1.shape.localCompare(Entity2.shape) > 0) { 
     entities.reverse(); 
    } 

    collisions[entities[0] + '_' + entities[1]](); 
} 

그래도 작동하지만 은 실제로 해킹 및 깨지기 쉬운 것으로 느낍니다.

간단히 말해서, 스위치 코드라면 스파게티 12 라인을 포함하지 않는 2 개의 임의로 정렬되고 알려지지 않은 값을 기반으로 한 함수 또는 뭔가 simmilar를 호출하는 우아한 방법을 기본적으로 찾고 있습니다.

+0

아마도 충돌을 확인하고 싶을 지 모르지만'fn = [Entity1.shape, entity2.shape] .sort(). ('_')','충돌 [fn] (...) [fn] *가 먼저 존재합니다. – RobG

+0

조금 깔끔하게 보이고 진행되는 것을 더 쉽게 이해할 수 있지만, 함수를 호출하기 위해 객체의 키로 연결된 문자열을 사용한다는 아이디어 자체가 마음에 들지 않습니다. – Indigo

답변

0
var collisions = { 
    'box_ellipse': function(box, ellipse) { 
     // Collision check 
    } 
    // other combos here 
} 

isColliding(Entity1, Entity2) { 
    var s1 = Entity1.shape; 
    var s2 = Entity2.shape; 

    if(collisions[s1 + '_' + s2] !== undefined) // the collision function exists 
     collisions[s1 + '_' + s2](Entity1, Entity2); // call it on the entities in order 
    else // they must be reversed 
     collisions[s2 + '_' + s1](Entity2, Entity1); 

} 

참고 : 모든 콤보 collisions 객체에 정의되어야한다 (순서를 무시). 가능한 형상 인 경우 : "box""circle", "triangle" 다음 collisions 객체는 6 번 키를 포함한다 :

  1. box_triangle 또는 triangle_box
  2. box_circle 또는 circle_box
  3. circle_triangle 또는 triangle_circle
  4. box_box
  5. circle_cirlce
  6. 다음 두 엔티티의 충돌을 검사 순으로 shapeA 중 하나 shapeB의 또 다른 :
  7. triangle_triangle

shapeA_shapeB하는 기능입니다는 매개 변수로 두 개의 실체를 받아 들일 것입니다.