将对象转换为不同的坐标集

时间:2017-05-23 15:59:27

标签: java camera rotation graphics2d

我正在使用对象的树结构来控制我的2D对象世界。根元素或相机包含一个子对象列表,在这种情况下是一个简单的"手"宾语。手对象包含5个卡对象的子对象列表。

现在手形物体旋转90度。卡片对象' x位置正在增加。因此,当您在屏幕上查看时,结果是卡片似乎向下构建(因为手形对象已旋转)

最终我需要一个卡片对象转移到另一个手形对象,我想用平滑动画做到这一点,所以我需要将卡片对象映射到相机的世界,但是它不会#39看起来好像感动了。

例如,让我们说其中一个卡片对象的X位置为100,位置为0.当我将手对象旋转90度时,看起来卡片对象在x中为0尺寸和y位置的100。

如果我只是从手中取出卡片并将其添加到相机中,则卡片会向后旋转并在x位置移动,显示为100,0。

对于所有旋转和位置(和缩放),如何将卡片对象转移到相机对象并保持其在屏幕上的位置?

在下面的代码中,如果' g'按下,我试图从手中取出一张卡并将其添加到相机。我称之为' transformObjectToTheseCoords'但我不认为我的数学是正确的......

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

如果有人有其他技术可以使用,我将不胜感激。

1 个答案:

答案 0 :(得分: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);


                }
            }
        }       
    }