游戏开发基础:判断碰撞

本文转摘自Silvery NightSilverlight C# 游戏开发:Flyer05与什么什么进行搏斗

在游戏开发中,对于碰撞的检测有很多,3D一般用射线判定法(Vector),而2D游戏就不需要那么复杂,虽然使用向量能作出最准确的判定,但是在一个平面中有更加简便的解决方案,当然,这取决于开发者是否严格要求最准确的碰撞判定。

      我简单介绍两种2D游戏中最准确的判定方法:射线判定和色值判定

      第一,射线判定来自于一个数学判断一个点是否在任意一个封闭形状内的方法:一个点向任意一个方向发出射线如果这条线经过线的数量是奇数,那么这个点就在这个形状内。

很显然这种方法不但复杂还很麻烦,需要计算经过线的数量还要对很多个点进行判断,我相信大多数人都不会对这个方法感兴趣。

      第二,色值判定,这个原理通过对比两张图像的色值看看是否有重合点判断是否碰撞,使用数组保存所有的色值,然后进行“与”运算,如果这个数组中出现了“true”,那么就可以判断是有重合点,这个判定方法非常准确,但是准确的代价是效率的降低,当游戏中有n个图片对象,进行的对比判定将是一个n的几何数字,进行如此之海量的判定,玩家的机器和不会买单。

      上面介绍的是两种最准确的方法,但是很显然在实现上还是在效率上都不是我们所期望的解决方案,所以,伟大的游戏开发者先驱们在更加伟大的数学面前,找出了更为简单及更为有效率的方案——圆形判定和矩形判定,具体请参看图片。 

      圆形判定方法来自一个经典的数学导论,两个圆的中心点的距离如果小于两个圆的半径之和,那么它们两个必然重合,具体做法也是很简单,首先求出两个点之间的向量,然后求出长度即可,这方面没学好的朋友可以研究一下勾股定理,中国人早就明白如何取得弦的长度。

      矩形判定更加容易,只需要对四个点进行逐次判断,取得两个矩形是否重合。

      为什么游戏开发者比较普遍用后面的两种法,因为第一在游戏中对于碰撞的检测并非那么非常严格,而是达到目的即可,第二游戏中也不太可能设计非常复杂的奇怪形状,第三使用图形进行判断(注意是图形而不是图像)较为好控制,而且效率也高。

以上属于转摘。

下面是我自己做的一个判断两个矩形是否相交的程序,直接贴代码

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;


namespace SilverlightApplication5
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);

}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
Rect rect1 = new Rect(new Point(0, 0), new Point(3, 3));
Rect rect2 = new Rect(new Point(4, 4), new Point(10, 10));
bool isBool = IsCross(rect1, rect2);
}
//判断两个矩形是否相交
private bool IsCross(Rect rect1,Rect rect2)
{
bool isCross = false;
//查找当前 Rect 所表示的矩形和指定 Rect 所表示的矩形的交集,并将结果存储为当前 Rect。
//如果不存在任何交集,则当前 Rect 将变为 Rect.Empty。
rect1.Intersect(rect2);
if (rect1.IsEmpty)
{
isCross = false;
}
else
{
isCross = true;
}
return isCross;
}
}
}
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值