【问题标题】:How to load sprite sheets that clamp to the sprite, excluding the background?如何加载夹在精灵上的精灵表,不包括背景?
【发布时间】:2013-03-28 01:13:46
【问题描述】:

我在谷歌上搜索时遇到了很多麻烦,因为我真的不知道它的术语。不过,这必须是一个普遍的问题。我想遍历一个精灵表,但我希望它忽略精灵周围的透明背景,而不是将其作为显示内容的一部分。

例如,如果我有几帧,我想遍历每一帧并加载该图像。然后,在那个框架中,我想通过在图像本身周围绘制一个矩形来缩小它,而不是额外的“背景”。这可能会通过找到不透明像素的精灵角来完成(不确定这部分是如何工作的)。

这有意义吗?再说一次,不确定在这里使用哪些词...如果不清楚,请告诉我。

这里的目标是加载与其他帧完全一致的精灵,这样它们就不会意外摆动或反弹。

非常感谢!!

【问题讨论】:

  • 对于它的价值,我通常发现最好在游戏中使用精灵表之前进行这种“调整”。这样,游戏代码就保持尽可能简单,并且不需要通过“修复”来延迟用户。至于修复本身,我的经验是自动查找给定精灵的来源很少成功。例如行走的角色可能会将他的手臂伸到其中一个精灵上,这意味着精灵的“原点”会错误地离一侧太远。
  • 很高兴知道。谢谢。我以前从未做过动画,但我的假设是,如果我有一个精灵表,其中的帧彼此不是“方形”的,那么它在动画时看起来就不正确。就像你说的那样,起源太远了。我认为程序化修复会更容易......也许不是:)
  • @PlanetLotus 一个 spriteset 应该 a) 是正交的(所有 sprite 都已经在正确的位置)或 b) 具有某种为您定义位置的描述记录。众所周知,对帧和偏移进行像素级检测是不可靠的。
  • 有趣。我对此很陌生,所以我非常感谢你的洞察力。我想这是我让精灵正确的问题......主要问题是这个精灵“表”不是为编程而设计的(它们的间距不相等)所以我不得不重做它,现在我不是确定我是否在每一帧中都得到了正确的起源。

标签: c# xna


【解决方案1】:

我也在开发我的第一款游戏,我的精灵周围的透明区域也遇到了类似的问题,在这种情况下是碰撞。

我所做的是设置它,使每个精灵都有一个位置、一个高度、一个宽度和 X 和 Y 的填充。

Vector2 position = new Vector2(100,100);
int frameHeight = 48;
int frameWidth = 48;
int paddingX = 4;
int paddingY = 3;

通过这些信息,您可以获得所需的信息,例如代表我可以使用的精灵周围的边界框的矩形:

boundingRectangle = new Rectangle(
  (int)position.X + paddingX, 
  (int)position.Y + paddingY, 
  frameWidth - (paddingX * 2), 
  frameHeight - (paddingY * 2));

我在 Kurt Jaegers 的 XNA 4.0 Game Development by Example 中读到了这篇文章(这对我有很大帮助)

【讨论】:

  • 感谢您的回复。我不明白...你如何确定透明填充的大小?您是否为每一帧找到了独特的填充?如果是这样的话,仅仅定义精灵在工作表上的位置而不需要遍历精灵行不是更容易吗?
  • 在我的情况下,我将它用于碰撞,并且目前对每一帧使用相同的填充(它是一个侧面射击游戏,所以你的船在动画时不会改变太多)我仍然需要填充因为感觉就像你会被擦伤或通过发动机排气管击中。我也可以将填充更改为 4 个值而不是 2,因此后填充可以大于前面。我通过检查编辑器中的图形来确定填充的大小,但最终在我处理它时让它变得更大一些,因为使用额外的一两个像素的填充感觉更好。
  • 哦,明白了。我不确定这对我有用,因为我遇到的问题是,例如,“向右行走”框架之一在水平方向上比“静止”框架长。因此,我的通用框架比某些精灵大得多,但精灵的大小各不相同。这就是为什么我想根据透明度以编程方式剪辑到精灵的大小。
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 2013-10-18
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
相关资源
最近更新 更多