精灵表动画上的像素完美碰撞,XNA

Posted

技术标签:

【中文标题】精灵表动画上的像素完美碰撞,XNA【英文标题】:Pixel perfect collision on spritesheet animation, XNA 【发布时间】:2012-04-28 16:39:49 【问题描述】:

我在 XNA 中使用 spritesheet 动画,我想使用像素完美碰撞。我的问题是像素完美碰撞检查精灵表上的当前像素是否透明,而不是检查我正在使用的精灵表部分。这是我的代码:

blockTextureData = new Color[shot.texture.Width * shot.texture.Height];
shot.texture.GetData(blockTextureData);

personTextureData = new Color[player2.texture.Width * player2.texture.Height];

player2.texture.GetData(personTextureData);

if (IntersectPixels(player2.CollissionBox, personTextureData, shot.CollissionBox, blockTextureData))

我想知道如何选择 spritesheet 的特定部分并检查与它的碰撞。我用this MSDN guide。

编辑: 我设法弄明白了,我用这个代替了

src = new Rectangle(frame, 0, 87, 100);

player.texture.GetData<Color>(0, src, personTextureData,0, 87*100);

框架是你启动它,例如0 用于第一个,87 用于第二个,因为我使用带有 2 张图片的精灵表,宽度为 2*87,高度为 100

编辑2: 现在的问题是,一旦你点击了 pixelperfect 就会停止工作,所以它只适用于 1 次点击。

【问题讨论】:

【参考方案1】:

如果你能详细说明你说它只有效一次的意思,那会有所帮助。

我必须对相同的 IntersectsPixels 函数进行相当多的调整才能与我的项目一起使用。我发现有用的一件事是使用一个非常慢的正方形动画(例如 100x100),填充纯红色,然后在它的唯一其他帧中完全透明。

它对调试与碰撞和动画精灵的像素比较相关的问题有很大帮助。

看看您能否提供更多信息,说明究竟是什么不工作以及它是如何发生故障的。祝您好运解决您的问题。

【讨论】:

我从 spritesheet 的错误部分读取但我修复了它,现在我正在玩虽然我从这行代码中遇到了崩溃: player.texture.GetData(0, src , 人物纹理数据,0, 87*100);说 Microsoft.Xna.Framework.Graphics.dll 中发生了“System.ArgumentException”类型的未处理异常附加信息:矩形对于此资源来说太大或太小。 我也修复了这个错误,我使用的是 frameSize * currentFrame 并检查了它不大于 texture.Width,问题是如果 frameSize * currentFrame 为 500,图片宽度为 512会尝试从 500 读取,然后添加 100 的宽度,所以它得到了 600 至多。

以上是关于精灵表动画上的像素完美碰撞,XNA的主要内容,如果未能解决你的问题,请参考以下文章

动画精灵与碰撞检测

当按下不同的键时如何更改精灵表中的帧。 XNA

使用 javascript 的逐像素动画

Unity精灵动画 2D碰撞

Unity2D像素游戏开发——Aseprite简单人物绘画+动画制作导出精灵表示例

XNA Sprite 帧不一致