检测冲突
现在,让我们看看一个子图形和另一个子图形冲突的情况。 你可能忽视了两个子图形之间的冲突,而只是使用我们前面讨论的技术分别的去更新子图形的变动部分。
但是出于游戏应答的目的,你经常需要去检测子图形的冲突。 举例来说在一个射击游戏中,当一发子弹击中靶子,你可能会想要出现爆炸等可视的反应。
在本文中,我将不详细地讨论不同的可用的检测冲突的技术。但是,我会突出介绍它们中的几种。
让我们回想一下,大多数的子图形都是不规则形状的,但是描述它们的位图都是矩形的。很难把一个子图形的边界显示为自由的区域,所以我们求助于通过封装矩形来显示它。
当游戏者观察屏幕上的子图形的时候,他实际上只是注意看子图形区域而对非子图形区域并不十分注意。 因此,子图形之间的任何冲突检测必须只在它们各自的子图形区域内发生,而不应该包括非子图形区域。
对于较小的子图形,当我们计算冲突并在视觉上消除它的时候通常使用整个子图形边界。 因为如果对象很小并且移动迅速,肉眼是注意不到那些错觉的。 这两个子图形边界的简单矩形相交就足够了。
现在,让我们看看一个子图形和另一个子图形冲突的情况。 你可能忽视了两个子图形之间的冲突,而只是使用我们前面讨论的技术分别的去更新子图形的变动部分。
但是出于游戏应答的目的,你经常需要去检测子图形的冲突。 举例来说在一个射击游戏中,当一发子弹击中靶子,你可能会想要出现爆炸等可视的反应。
在本文中,我将不详细地讨论不同的可用的检测冲突的技术。但是,我会突出介绍它们中的几种。
让我们回想一下,大多数的子图形都是不规则形状的,但是描述它们的位图都是矩形的。很难把一个子图形的边界显示为自由的区域,所以我们求助于通过封装矩形来显示它。
当游戏者观察屏幕上的子图形的时候,他实际上只是注意看子图形区域而对非子图形区域并不十分注意。 因此,子图形之间的任何冲突检测必须只在它们各自的子图形区域内发生,而不应该包括非子图形区域。
对于较小的子图形,当我们计算冲突并在视觉上消除它的时候通常使用整个子图形边界。 因为如果对象很小并且移动迅速,肉眼是注意不到那些错觉的。 这两个子图形边界的简单矩形相交就足够了。
| Rectangle.Intersect(sprite1.Bounds, sprite2.Bounds); |
如果子图形是圆形的,那么我们可以计算圆心之间的距离然后减去它们的半径;如果结果大于零那么我们就会探测到一个冲突。
| For pixel-by-pixel hit detection, you can use the Rectangle.Contains method: if (sprite.Bounds.Contains(x,y) DoHit(); |
快速边界插入技术应当首先应用到检测子图形的边界冲突上。如果发生冲突,那么我们可以使用一个更精确的方法,比如冲突位图掩盖技术来识别重叠像素。
如果我们不在乎像素水平的间隔度,那么我们可以使用前面在变动区域计算部分提到的计算冲突区域的方法。不同于处理一个子图形的新旧边界,我们现在将处理两个冲突子图形的边界。
具体的冲突检测技术应该由具体的情况决定。选择某种特定的技术取决于各种各样的因素,比如子图形的大小与形状,游戏的特性等等。 在单个游戏中,使用这些技术并不罕见。
子图形速度
帧速率经常会被误解为子图形移动速度。我们不能只依靠帧速率,还要调节子图形每帧移动的距离来取得所要的净速度。
让我们研究一下下面这个例子,这个例子里我们想要子图形在1秒时间内垂直移动100像素单位。现在我们可以固定帧速率为10 fps,然后每帧移动子图形10像素单位达到那个净速度;或者我们可以增加帧速率为20fps,并把子图形每帧垂直移动量降为5像素。
这两种获得相同净速度的方法,区别是在前面的一种情况下,子图形的移动可能在视觉上有一些跳动,因为它在比后者更少的刷新循环中移动的距离更大。但是在后面这种情况下,我们的游戏是20fps,所以在决定使用哪一种方法之前,我们需要绝对确保硬件、系统和.NET CF的性能。保留:: http://www.qqread.com/dotnet/u292184000.html
更多内容请看游戏开发、网络游戏攻略、.NET Framework新手入门专题,或进入讨论组讨论。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- 游戏开发 (2107篇文章)
- 网络游戏攻略 (4329篇文章)
- .NET Framework新手入门 (132篇文章)
- .NET移动与嵌入式技术 (5950篇文章)
- .NET开发手册 (5652篇文章)
- 电信运营商专栏 (4024篇文章)
- Wlan组网----家庭专题 (4184篇文章)
- 网络游戏开发 (141篇文章)
- 游戏策划 (287篇文章)
- 程序设计 (226篇文章)
- vb.net入门——ToolBar 控件的使用 (267次浏览)
- vb.net入门——OpenFileDialog 组件的使用 (75次浏览)
- vb.net入门——FontDialog 组件的使用 (52次浏览)
- vb.net用Graphics画一个五角星 (46次浏览)
- vb.net入门——FolderBrowserDialog 组件的使 (45次浏览)
- vb.net绘制干扰点 (44次浏览)
- vb.net入门——ColorDialog 组件的使用 (41次浏览)
- vb.net巧用ToolTip控件获取鼠标坐标 (39次浏览)
- 用vb.net创建一个鼠标绘图程序 (39次浏览)
- vb.net入门——SaveFileDialog 组件的使用 (38次浏览)



