C# & XNA - 2D 引擎 - 来自汽车的 Group Sprites

标签 c# xna 2d grouping sprite

我正在开始使用 XNA,我想构建一个基本的基于 2D 图 block 的引擎。

到目前为止,我已经完成了一些汽车转向数学和处理,但还没有发生碰撞。

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

picture

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

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

到目前为止,我有一个简单的 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;

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

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

感谢您的帮助!

最佳答案

如果您使用的是 SpriteBatch,那么处理此问题的方法是小心地将 origin 参数设置为 Draw 方法(MSDN ).在这个答案中,我说“sprite”的地方是对 Draw 的一次调用 - 因此您的汽车将由多个 sprite 组成。

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

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

因此 - 您应该维护构成汽车不同部分的 9 个纹理(或 9 个源矩形,如果您使用的是 sprite 表)的列表。并且,还为每个部分存储一个原点位置。

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

Car part example

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

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

不需要乱用矩阵或任何东西:)

关于C# & XNA - 2D 引擎 - 来自汽车的 Group Sprites,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11951531/

相关文章:

c# - 北风数据集

c# - HTMLControl Style.Add

javascript - 将对象内的对象集合从 js 传递到 C#

c# - 如何使用 XNA 删除 XBOX 上的 "Please Reconnect Controller"对话框?

c# - Farseer物理质量/重量问题

java - 打开时网格不会加载

java - Java中2个数字的二维数组

c# - A*(A 星)算法帮助

c++ - 使用现有 C++ 代码库支持 XNA WP7 和闪存 - 管道、工具和方法

unity-game-engine - OncollisionEnter2D 不工作,但 OnTriggerEnter2D 工作正常