我开始使用XNA,我想构建一个基于2D磁贴的基本引擎。
到目前为止,我已经完成了一些汽车转向数学和处理,但还没有碰撞。
现在我决定让汽车可以破坏,所以当我撞到墙壁时,汽车的区域会被碰撞。
汽车的中间部分保持不变,但当另一辆车从左侧撞到玩家车时,我想用左侧的“碰撞”图像替换左侧的“正常”图像
我的问题是,我现在甚至不怎么对车的所有部分进行组合(还会添加前后灯)所以当我开车时所有部件都在跟随。
到目前为止,我有一个简单的 Car 和 CarParts 这样的课程:
public Car() {
Vector2D Position;
float Rotation;
Vector2D Direction;
Texture2D BaseTexture;
List<CarParts> Parts;
}
public CarParts() {
Vector2D RelativePosition;
Texture2D Testure;
}
其中:
List[0] = FrontPart;
List[1] = FrontLeftPart;
List[2] = FrontRightPart;
List[3] = LeftPart;
List[4] = RightPart;
List[5] = RearLeftPart;
List[6] = RearRightPart;
List[7] = ReartPart;
如何让这些CHILDS与主车一起移动?
°编辑:还是有另一种方法可以实现这一目标吗?
感谢您的帮助!
答案 0 :(得分:3)
如果您使用的是SpriteBatch
,那么处理此问题的方法是将{strong> origin 参数设置为Draw
方法(MSDN)。在这个答案中,我说“精灵”是指对Draw
的一次调用 - 所以你的汽车将由多个精灵组成。
原点参数设置从精灵的位置,缩放和旋转发生的位置。 您可以将原点设置为精灵边界的外位置。
原点位置被解释为相对于精灵的源矩形的左上角。 (如果未指定源矩形,则假定覆盖整个纹理的源矩形)。原点以与源纹理中的像素匹配的单位指定。
所以 - 你应该保留9个纹理的列表(或9个源矩形,如果你使用的是精灵表),它们构成了汽车的不同部分。而且,对于每个部分,都存储原点位置。
您为每个精灵设置的原点位置将为 (centre of car) - (top left of sprite)
。
因此,对于汽车中的中心精灵,它将大致位于矩形的中心。对于汽车的左上角,它在两个轴上都是正的但超出了精灵的边界。对于右下角,原点在两个轴上都是负的,因此在精灵边界之外。等等其他部分。
然后,只需绘制构成汽车的所有9个精灵,每个精灵都有不同的源 - 矩形/纹理和原点。但每个人都有相同的位置,比例和旋转。
无需乱搞矩阵或任何东西:)
答案 1 :(得分:1)
当您移动汽车时,只更新汽车的位置。零件的偏移量应保持不变。绘制精灵时,您可以将汽车的位置与零件的相对位置相结合。例如:
var partPosition = List[0].RelativePosition;
var position = Position + partPosition;
然后您可以使用矩形将其绘制到位
var rectangle = new Rectangle(position.X, position.Y, partWidth, partHeight);
要应用任何旋转,您需要一个旋转矩阵应用于位置/矩形。 XNA在Matrix类上有Helper方法来帮助您(参见http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.matrix_members.aspx)。
如果你不熟悉矩阵和矢量数学,我建议先刷一下。
答案 2 :(得分:0)
您可以使用描述汽车位置和方向的矩阵。您可以将其应用于spritebatch,只需使用本地坐标(RelativePosition)进行绘制。
否则,您将描述矩阵中每个部分的变换,并使用汽车矩阵对其进行多重播放。然后,您可以将每个零件的方向和位置与变换矩阵相乘,以将其转换为屏幕位置。