我正在使用对象的树结构来控制我的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;
}
如果有人有其他技术可以使用,我将不胜感激。
答案 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);
}
}
}
}