2017-05-23 7 views
0

オブジェクトのツリー構造を使用して、オブジェクトの2Dワールドを制御しています。ルート要素またはカメラには、サブオブジェクトのリストが含まれています。この場合、単純な「手」オブジェクトです。ハンドオブジェクトは、5つのカードオブジェクトであるサブオブジェクトのリストを含む。オブジェクトの異なる座標セットへの変換

ここで手のオブジェクトは90度回転しています。 Cardオブジェクトのx位置が増加しています。その結果、画面上で見ると、カードが下に向かっているように見えます(手オブジェクトが回転しているため)

最終的に別の手オブジェクトに転送するにはカードオブジェクトが必要になります。滑らかなアニメーションでは、カードオブジェクトをカメラの世界にマッピングする必要がありますが、移動したようには見えません。

たとえば、カードオブジェクトのX位置が100で、位置が0であるとします。手オブジェクトを90度回転させると、カードオブジェクトがxディメンションで0、 yの位置にある。

カードを手から取り出してカメラに追加すると、カードが元の位置に戻って100.0のx位置に移動します。

カードオブジェクトをカメラオブジェクトに転送して画面上の位置を保持するにはどうすればよいですか?

「g」を押すと、手札からカードを取り出してカメラに追加しようとしています。誰でも使用する別の技術を持っている場合、私はそれを感謝

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); 
       } 
      } 
     }  
    } 

public void transformObjectToTheseCoords(GameObject o) 
    { 
     o.xPos += xPos; 
     o.yPos += yPos; 
     o.rPos += rPos; 
    } 

...私は「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); 


       } 
      } 
     }  
    } 
関連する問題