2

我开始使用 XNA,我想构建一个基本的基于 2D 瓦片的引擎。

到目前为止,我已经做了一些汽车转向数学和操控,但还没有碰撞。

现在我决定让汽车可以破坏,所以当我撞到墙时,汽车的区域会被碰撞。

图片

车的中心部分保持不变,但是当另一辆车从左侧撞到玩家车时,我想用左侧的“碰撞”图像替换左侧的“正常”图像。

我的问题是,我什至现在都不知道如何对汽车的所有部件进行分组(还会添加前后灯),所以当我开车时,所有部件都在跟随。

到目前为止,我有一个简单的CarCarParts类,如下所示:

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;

我怎样才能让那些孩子和主车一起移动?

°编辑:还是有其他方法可以做到这一点?

感谢你的帮助 !

4

3 回答 3

3

如果您正在使用SpriteBatch,则处理此问题的方法是仔细设置方法的origin参数DrawMSDN)。在这个我说“精灵”的答案中,我的意思是一次调用Draw- 所以你的车将由多个精灵组成。

origin 参数设置精灵的位置、缩放和旋转发生的原点。您可以将原点设置为精灵边界之外的位置。

原点位置被解释为相对于精灵源矩形的左上角。(如果不指定源矩形,则假定源矩形覆盖整个纹理)。原点以与源纹理中的像素匹配的单位指定。

所以 - 你应该维护组成汽车不同部分的 9 个纹理(或 9 个源矩形,如果你使用精灵表)的列表。并且,对于每个部分,也存储一个原点位置。

您为每个精灵设置的原点位置将是(centre of car) - (top left of sprite).

汽车零件示例

所以对于汽车的中心精灵,它将大约在矩形的中心。对于汽车的左上角,它在两个轴上都是正值,但超出了精灵的边界。对于右下角,原点在两个轴上都是负的,因此在精灵边界之外。其他部分依此类推。

然后,简单地绘制构成汽车的所有 9 个精灵,每个精灵都有不同的源矩形/纹理和原点。但每一个都有相同的位置、比例和旋转。

无需弄乱矩阵或任何东西:)

于 2012-08-14T13:29:05.963 回答
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)。

如果您不熟悉矩阵和向量数学,我建议您先复习一下。

于 2012-08-14T11:56:27.993 回答
0

您可以使用描述汽车位置和方向的矩阵。您可以将其应用于 spritebatch 并仅使用局部坐标 (RelativePosition) 进行绘制。

否则,您可以在矩阵中描述每个部分的转换,并将其与汽车的矩阵进行多重播放。然后,您可以将每个部分的方向和位置与转换矩阵相乘,以将其转换为屏幕位置。

于 2012-08-14T11:53:32.877 回答