可能不是很描述性的标题,但我会尽力。这是我第一次在StackOverflow上发布问题,我对使用C#编程还相对较新(一年前开始使用Unity,几天前决定升级到XNA)。话虽如此,请对我友善。
我正在规划一个2D游戏的机制,虽然在XNA中玩了一段时间后,大部分内容似乎都很简单,但有一个问题一直困扰着我,而且至今没有令人满意的答案。该问题涉及将精灵层叠成复合/复杂精灵。例如,游戏中的一个角色可能持有任意数量的武器之一或两者皆有。我进行了一些关于此主题的研究,并发现有人建议使用RenderTarget类将一系列精灵绘制为一个精灵,有人则建议在Draw()期间简单地将精灵放在彼此之上。然而,这些主题主要集中在游戏中只有单个角色的相对简单情况。
在我的情况下,游戏将具有许多基于精灵的角色,这些角色具有完全不同的姿势/动画。现在大约有10个角色,开发后可能会添加更多。同样会有许多武器(可能会有20支开始)组合到角色上。我对此感到很自在。然而,问题是每个角色都需要在每个动画帧中以不同的位置和不同的旋转方式绘制武器精灵。
我考虑了几种方法来解决这个问题,但它们都有非常大的缺点。
第一种方法只是为每个角色的每个武器绘制一个精灵表,该表的大小与相应的角色相同。这种方法的好处是轻松添加调用以在基础角色之上绘制其他精灵,而无需进行任何计算。缺点是将创建过多的额外精灵表(10个角色x 20个武器= 200个额外的表)。
第二步是创建一个用于处理武器精灵的类,WeaponSprite类将附加到每个武器的单个纹理上,然后根据其所附加到的角色来存储有关绘制时使用的偏移/旋转信息。但是,按每帧基础组织偏移/旋转会非常繁琐,我无法想到任何轻松的方法来获取所需的帧相关信息(我的想法是创建一个AnimationFrame类来跟踪每个角色的动画名称、方向和帧编号,然后在武器类中使用字典根据当前帧的名称加载正确的数据,但这个想法似乎很不明智)。该方法还具有需要相对较大的内存来实现的缺点(假设Vector2为8字节且float为4字节,在当前使用的帧数下,有10个角色和20个武器需要192KB的内存,随着添加更多武器,这个数字只会变得越来越大)。我有一个类似的想法(我从其他帖子中窃取了一些关于同一主题的内容),即使用保留的alpha值像素来链接偏移和每个武器的“起点”,在运行时计算位置,然后只需在前述的字典中存储旋转浮点数。由于我对XNA(还有C#)不是很熟悉,所以我想发帖让专家们参与。我的方法是否正确,或者我是否忽略了一些非常简单的东西?非常感谢您的帮助,并请告诉我如果需要任何其他信息。
我正在规划一个2D游戏的机制,虽然在XNA中玩了一段时间后,大部分内容似乎都很简单,但有一个问题一直困扰着我,而且至今没有令人满意的答案。该问题涉及将精灵层叠成复合/复杂精灵。例如,游戏中的一个角色可能持有任意数量的武器之一或两者皆有。我进行了一些关于此主题的研究,并发现有人建议使用RenderTarget类将一系列精灵绘制为一个精灵,有人则建议在Draw()期间简单地将精灵放在彼此之上。然而,这些主题主要集中在游戏中只有单个角色的相对简单情况。
在我的情况下,游戏将具有许多基于精灵的角色,这些角色具有完全不同的姿势/动画。现在大约有10个角色,开发后可能会添加更多。同样会有许多武器(可能会有20支开始)组合到角色上。我对此感到很自在。然而,问题是每个角色都需要在每个动画帧中以不同的位置和不同的旋转方式绘制武器精灵。
我考虑了几种方法来解决这个问题,但它们都有非常大的缺点。
第一种方法只是为每个角色的每个武器绘制一个精灵表,该表的大小与相应的角色相同。这种方法的好处是轻松添加调用以在基础角色之上绘制其他精灵,而无需进行任何计算。缺点是将创建过多的额外精灵表(10个角色x 20个武器= 200个额外的表)。
第二步是创建一个用于处理武器精灵的类,WeaponSprite类将附加到每个武器的单个纹理上,然后根据其所附加到的角色来存储有关绘制时使用的偏移/旋转信息。但是,按每帧基础组织偏移/旋转会非常繁琐,我无法想到任何轻松的方法来获取所需的帧相关信息(我的想法是创建一个AnimationFrame类来跟踪每个角色的动画名称、方向和帧编号,然后在武器类中使用字典根据当前帧的名称加载正确的数据,但这个想法似乎很不明智)。该方法还具有需要相对较大的内存来实现的缺点(假设Vector2为8字节且float为4字节,在当前使用的帧数下,有10个角色和20个武器需要192KB的内存,随着添加更多武器,这个数字只会变得越来越大)。我有一个类似的想法(我从其他帖子中窃取了一些关于同一主题的内容),即使用保留的alpha值像素来链接偏移和每个武器的“起点”,在运行时计算位置,然后只需在前述的字典中存储旋转浮点数。由于我对XNA(还有C#)不是很熟悉,所以我想发帖让专家们参与。我的方法是否正确,或者我是否忽略了一些非常简单的东西?非常感谢您的帮助,并请告诉我如果需要任何其他信息。