C# C&XNA-2D引擎-来自汽车的组精灵

C# C&XNA-2D引擎-来自汽车的组精灵,c#,xna,2d,grouping,sprite,C#,Xna,2d,Grouping,Sprite,我开始学习XNA,我想构建一个基本的基于2D瓷砖的引擎 到目前为止,我已经做好了一些汽车转向数学和处理,但还没有碰撞 现在我已经决定让汽车可以毁坏,所以当我撞到墙上时,汽车的区域会被撞坏 汽车的中心部分保持不变,但当另一辆汽车从左侧撞到玩家的汽车时,我想用左侧的碰撞图像替换左侧的正常图像 我的问题是,我甚至现在都不知道如何对汽车的所有部件进行分组,也会增加前后灯,所以当我驾驶时,所有部件都会跟随 到目前为止,我有一个简单的汽车和汽车零件课程,如下所示: public Car() { Ve

我开始学习XNA,我想构建一个基本的基于2D瓷砖的引擎

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

现在我已经决定让汽车可以毁坏,所以当我撞到墙上时,汽车的区域会被撞坏

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

我的问题是,我甚至现在都不知道如何对汽车的所有部件进行分组,也会增加前后灯,所以当我驾驶时,所有部件都会跟随

到目前为止,我有一个简单的汽车和汽车零件课程,如下所示:

public Car() {
    Vector2D Position;
    float Rotation;
    Vector2D Direction;
    Texture2D BaseTexture;
    List<CarParts> Parts;
}

public CarParts() {
    Vector2D RelativePosition;
    Texture2D Testure;
}

我怎样才能让那些孩子用主车移动呢

°编辑:或者有其他方法实现这一点吗


谢谢你的帮助

你可以使用一个矩阵来描述汽车的位置和方向。您可以将其应用于spritebatch,只需使用局部坐标RelativePosition进行绘制


否则,在矩阵中描述每个零件的变换,并将其与汽车矩阵相乘。然后,您可以将每个零件的方向和位置与变换矩阵相乘,将其转换为屏幕位置。

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


否则,在矩阵中描述每个零件的变换,并将其与汽车矩阵相乘。然后,您可以将每个零件的方向和位置与变换矩阵相乘,以将其转换为屏幕位置。

移动汽车时,仅更新汽车的位置。零件的偏移量应保持不变。绘制精灵时,将汽车的位置与零件的相对位置相结合。例如:

var partPosition = List[0].RelativePosition;
var position = Position + partPosition;
然后可以使用矩形将其绘制到位

var rectangle = new Rectangle(position.X, position.Y, partWidth, partHeight);
若要应用任何旋转,需要将旋转矩阵应用于位置/矩形。XNA在Matrix类上有帮助器方法来帮助您完成此任务,请参见


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

当你移动汽车时,只更新汽车的位置。零件的偏移量应保持不变。绘制精灵时,将汽车的位置与零件的相对位置相结合。例如:

var partPosition = List[0].RelativePosition;
var position = Position + partPosition;
然后可以使用矩形将其绘制到位

var rectangle = new Rectangle(position.X, position.Y, partWidth, partHeight);
若要应用任何旋转,需要将旋转矩阵应用于位置/矩形。XNA在Matrix类上有帮助器方法来帮助您完成此任务,请参见

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

如果您使用的是SpriteBatch,那么处理此问题的方法是将原点参数仔细设置为Draw方法。在这个回答中,我说的“精灵”是指一个单独的绘图调用,因此您的汽车将由多个精灵组成

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

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

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

您为每个精灵设置的原点位置将是汽车的中心-精灵的左上角

因此,对于汽车中的中心精灵,它大约位于矩形的中心。对于汽车的左上角,它在两个轴上都为正值,但超出精灵的边界。对于右下角,原点在两个轴上均为负值,因此位于精灵边界之外。其他部分也是如此

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

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

如果您使用的是SpriteBatch,则处理此问题的方法是将原点参数小心地设置为Draw方法。在这个回答中,我说的“精灵”是指一个单独的绘图调用,因此您的汽车将由多个精灵组成

“原点”参数设置精灵位置、缩放和旋转的原点。可以将原点设置为bou外部的位置 一个精灵的名字

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

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

您为每个精灵设置的原点位置将是汽车的中心-精灵的左上角

因此,对于汽车中的中心精灵,它大约位于矩形的中心。对于汽车的左上角,它在两个轴上都为正值,但超出精灵的边界。对于右下角,原点在两个轴上均为负值,因此位于精灵边界之外。其他部分也是如此

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


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

您可以将您的汽车作为具有前、后、左、,对,这将是一种纹理类型,当碰撞发生时,只需更改纹理,主纹理将是透明的,因此您将只移动那些主纹理,其余部分将嵌套在该透明图像中。我如何使这些孩子与主车一起移动?-更详细地解释这个问题模式详细信息:如何使明细表中定义的子零件在我驾驶时与主车一起移动。因此,CarParts中每个单个CarPart的位置/旋转与Car中定义的主位置和旋转相对?你可以把你的车做成一个物体,有前面,后面,左边,对,这将是一种纹理类型,当碰撞发生时,只需更改纹理,主纹理将是透明的,因此您将只移动那些主纹理,其余部分将嵌套在该透明图像中。我如何使这些孩子与主车一起移动?-更详细地解释这个问题模式详细信息:如何使明细表中定义的子零件在我驾驶时与主车一起移动。因此,CarParts中每个单个CarPart的位置/旋转与Car中定义的主位置和旋转相对?嗯,我已经考虑过使用矩阵了,但实际上我不知道矩阵是如何工作的,你有任何参考/代码片段给我吗?嗯,我已经考虑过使用矩阵了,但实际上我不知道矩阵是如何工作的,你有任何参考/代码片段给我吗?我可以简单地将两个向量2D相加吗?在这种情况下,旋转是什么?它将取决于您的绘图代码的其余部分。通常使用XNA时,您会有一个矩形来绘制精灵。使用上面计算的位置,将其用于矩形的X和Y,并且宽度和高度将与精灵的宽度和高度相匹配。要旋转,需要某种形式的矩阵变换。请看我的编辑。谢谢。我知道数学,但我想了解矩阵的旋转和定位是如何工作的,所以首先我会搜索一些教程或其他东西。但这正是我一直在寻找的我能把两个向量求和吗?在这种情况下,旋转是什么?它将取决于您的绘图代码的其余部分。通常使用XNA时,您会有一个矩形来绘制精灵。使用上面计算的位置,将其用于矩形的X和Y,并且宽度和高度将与精灵的宽度和高度相匹配。要旋转,需要某种形式的矩阵变换。请看我的编辑。谢谢。我知道数学,但我想了解矩阵的旋转和定位是如何工作的,所以首先我会搜索一些教程或其他东西。但这正是我一直在寻找的看起来很简单,我来试试。谢谢你对图片的修改,你回答。这看起来很简单,我来试试。谢谢你对图片的改造,你回答。