2014-09-07 4 views
1

저는 일종의 게임 엔진을 작성하고 있습니다. 내 모든 개체는 GameObject 클래스에서 확장됩니다. 개체가 다른 개체를 만지고 있는지 여부를 확인할 수 있어야합니다. 내 코드는 이렇게이다 : 나는 이해할 수없는 무엇자바 : 런타임에 클래스를 매개 변수로 전달

public boolean collidesWith(GameObject caller, Class collideType) { 
    for(/* the array of all GameObjects */) { 

     // only check against objects of type collideType 
     // this line says "cannot find symbol: collideType" 
     if(gameObjects[i] instanceof collideType) { 
      // continue doing collision checks 
      // return true in here somewhere 
     } 
     else continue; 
    } 
    return false; 
} 

collidesWith()에 같은 것을 전달하는 방법이다. 이상적으로 나는 collidesWith()의 각 호출에 대한 인스턴스를 생성하고 싶지는 않지만 절대적으로해야한다면 작업 할 수 있습니다.

그것이 내가 할 것인지 instanceof
  • 를 사용하는 것이 적합 여부
    • 난 정말 원하는 여부 클래스
    • 전달 될 : 여기에 질문과 답변의

      톤이 바보 같은 것들로 처리 한 수업을 통과해야합니다

    리플렉션을 사용해야합니까? 수업의 이름을 받아서 equals()과 비교해야합니까? 인스턴스를 만들 필요가 있습니까?

  • +0

    BouncyBall.class – Adi

    +1

    당신은 충돌 감지를 할 필요가있는 경우에, 당신의 알고리즘에 필요한 geome을 줄 것이다 공통 인터페이스를 정의 충돌하는 객체를 검사하는 tric 정보; 모든 충돌 가능한 클래스가 해당 인터페이스를 구현하도록하십시오. 'collidesWith()'는 그 인터페이스를 구현하는 모든 타입의 충돌을 검사 할 수 있습니다. 대신 여러 가지 충돌 유형을 확인하려면 리플렉션을 사용하는 것보다 여러 가지 방법을 만드는 것이 더 나을 것이라고 생각합니다. 이는 게임을위한 것이므로 속도가 중요합니다. – watery

    +0

    GameObjects에서 "collideswith"메소드를 구현하지 않고 "equals"처럼 취급합니다 (부모 구현이 올바르지 않은 경우 각 클래스가 구현해야합니다.) – ErstwhileIII

    답변

    5

    instanceof 연산자는 클래스의 리터럴 이름을 필요로합니다. 예를 들면 :

    if(gameObjects[i] instanceof BouncingBall) { 
    

    당신이 동적으로 원하기 때문에 인수는 메서드가 호출되는 클래스 개체의 인스턴스의 경우, 당신은 확인하는 Class.isInstance() 메소드를 사용해야합니다

    public boolean collidesWith(GameObject caller, Class<? extends GameObject> collideType) { 
        for (/* the array of all GameObjects */) { 
         if(collideType.isInstance(gameObjects[i])) { 
          // continue doing collision checks 
          // return true in here somewhere 
         } 
         else continue; 
        } 
        return false; 
    } 
    

    그리고 당신은 예를 들어, 사용 방법을 부를 것이다 :

    collidesWith(caller, BouncingBall.class) 
    
    +0

    완벽한 응답! 신속한 응답 주셔서 감사합니다 :) – Archmage