2017-05-23 9 views
0

오브젝트의 트리 구조를 사용하여 오브젝트의 2D 세계를 제어하고 있습니다. 루트 요소 또는 카메라에는 하위 개체 목록 (이 경우 간단한 "손"개체)이 포함되어 있습니다. 손 개체는 5 개의 카드 개체 인 하위 개체의 목록을 포함합니다.다른 좌표 세트로 오브젝트 변환

이제 손 개체가 90도 회전됩니다. Card 객체의 x 위치가 증가하고 있습니다. 따라서 화면에서 볼 때 결과는 카드가 아래쪽으로 쌓이게되는 것입니다 (손 모양의 물체가 회전하기 때문에)

결국 다른 손으로 물건을 옮기려면 카드 객체가 필요합니다. 부드러운 애니메이션으로 카드 객체를 카메라 세계에 매핑해야하지만 움직이지 않는 것처럼 보입니다.

예를 들어, 카드 오브젝트 중 X 위치가 100이고 위치가 0 인 경우를 가정 해 봅니다. 손 모양 오브젝트를 90도 회전하면 카드 오브젝트가 x 치수에 0, y 위치에.

손에서 카드를 제거하고 카메라에 카드를 추가하면 카드가 뒤로 굴러 100.0에 나타나는 x 위치로 이동합니다.

모든 회전 및 위치 (및 비율 조정)의 경우 카드 객체를 카메라 객체로 전송하고 화면의 위치를 ​​유지하려면 어떻게해야합니까?

아래의 코드에서 'g'를 누르면 손에서 카드를 제거하고 카메라에 추가하려고 시도합니다. 나는


사람이 사용하는 또 다른 방법이있는 경우


public void transformObjectToTheseCoords(GameObject o) 
    { 
     o.xPos += xPos; 
     o.yPos += yPos; 
     o.rPos += rPos; 
    } 
public void update(LinkedList<Object> messages) 
    { 
     super.update(messages); 

     if(messages.size() > 0 && messages.get(0) instanceof KeyEvent) 
     { 
      KeyEvent ke = (KeyEvent)messages.get(0); 

      if(ke.getKeyChar() == 'g') 
      { 
       if(super.getSubObjects().size() > 0) 
       { 
        GameObject o = super.getSubObjects().remove(0); 

        GameObject parent = o.getParentObject(); 

        while(parent != camera) 
        { 
         parent.transformObjectToTheseCoords(o); 
         parent = parent.getParentObject(); 
        } 
        camera.addSubObject(o); 
       } 
      } 
     }  
    } 

, 나는 그것을 감사하겠습니다 ... 방법은 'transformObjectToTheseCoords'라고하지만 난 내 수학 잘 생각하지 않습니다 호출합니다.

답변

0

해결 방법은 AffineTransform 행렬로 작업하는 것이 었습니다 ... 이것은 다른 좌표 세트 간의 x 및 y 변환을 적절하게 처리합니다.

@Override 
    public void update(LinkedList<Object> messages) 
    { 
     super.update(messages); 

     if(messages.size() > 0 && messages.get(0) instanceof KeyEvent) 
     { 
      KeyEvent ke = (KeyEvent)messages.get(0); 

      if(ke.getKeyChar() == 'g') 
      { 
       if(super.getSubObjects().size() > 0) 
       { 
        GameObject o = super.getSubObjects().remove(0);     

        //We are inside the position layout, so first let's transform the object to these coordinates... 
        o.setRotationPosition(this.rPos); 
        //It's x,y position are relative to this already, so don't need to change that... 
        //Now the next layer up is the camera, so let's calculate the new X and Y 

        float x = (float) ((Math.cos(this.rPos)*o.getXPosition())-(Math.sin(this.rPos)*o.getYPosition())+this.xPos); 
        float y = (float) ((Math.sin(this.rPos)*o.getXPosition())+(Math.cos(this.rPos)*o.getYPosition())+this.yPos); 

        o.setPosition(x, y); 
        camera.addSubObject(o); 


       } 
      } 
     }  
    }