XNA 2D – 如何在碰撞时切换到新的精灵并删除自己

假设我有一艘在移动的岩石上射击的2D飞船。 如果一颗子弹与其中一个岩石边界框相交,那么这个岩石就会根据一个新的子图片生成并自行移除。

我的问题是这样的:我怎样才能加载新的animation摇滚(拆分)在屏幕上碰撞与子弹?

tl; dr:你会想要使用一个精灵表,并创建一个带委托 的animation精灵 ,以在animation完成时通知所有者。

让我们分解这些步骤并devise出来。

用户故事

当一颗子弹与小行星碰撞时,小行星就会爆炸并消失。

function细分

  1. 检测BulletAsteroid之间的碰撞
  2. Asteroid的精灵上玩破坏animation。
  3. 去除Asteroid

课堂细分

  • AnimatedSprite :以给定的速度在屏幕上给定的位置显示一个animation的Sprite
  • Hitbox :定义一个对象的可撞击区域,可以用来判断两个hitbox是否碰撞
  • Bullet :包含SpriteHitbox的玩家所投射的投射物
  • Asteroid :包含AnimatedSpriteHitbox的玩家的Hitbox

演练

我假设你已经解决了1. Detect collision between Bullet and Asteroid ,所以让我们跳到步骤2。

有一篇关于 MSDN上Spriteanimation的相当全面的文章 ,你应该在继续开发之前阅读,但是我会在这里总结一下。

我们将要使用一个精灵表来处理小行星的animation。 这里的推理是,精灵表的内存开销要比离散图片less得多(由于graphics卡的实现和其他你不需要担心的例子)。

基本的前提是创建一个矩形,只渲染图像的一部分。 您可以将其视为胶片卷轴:创建animation有许多单独的帧,但您只能一次看到一个。 每个更新循环, AnimatedSprite一个定时器将会增加,一旦它达到所需的帧速率,我们将把矩形移动到animation的下一部分。

我们将要修改上面的示例代码,添加一个函数Play()和一个委托 AnimationComplete 。 另外,我们只想播放一次animation,停止animation,然后调用AnimationComplete 。 然后,在Asteroid中,我们需要传递一个函数Destroy()给我们在AnimatedSprite创建的委托。 这意味着,一旦animation完成, AnimatedSprite将在小行星上调用Destroy() (这就是我们正在尝试做的)。

概要

这是任务细目:

  • 检测BulletAsteroid之间的碰撞
  • 创建一个AnimatedSprite类来处理我们的animation
    • 应该从第一帧开始暂停
    • 应该可以通过函数调用开始播放
    • 一旦animation完成,应该调用委托
  • 创建一个允许Asteroid毁灭自己的函数

我认为最简单的解决scheme是加载你需要的所有图像(并将其存储在一个数组中) – 除了animation存储为大量图像。 所有的时间(而不是碰撞),你正在绘制第一个图像。

当它碰撞时,你只是开始使用其他精灵(你可以画一个新的精灵每帧)。 当你到达数组的末尾,爆炸(animation)完成,你将停止绘制这个岩石。