Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5417088
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2009-12-18 19:11:59

lineGirl游戏是一类画线游戏,游戏方法是在一幅图上画线"圈地",如果画线未封闭之前被怪碰到则回到起点并失去生命一次.目标是在生命全部失去前圈够足够百分比的"地".闪客帝国上有朋友做过此游戏,点击进入游戏"天蚕变之希望篇"
这里仅就其中怪物碰撞到已划定的"地"反弹回来的算法简单讨论一下.
怪物碰到"地"被反弹,如果将"地"看作一封闭曲线,那么问题转变为判断怪是否进入封闭曲线,如果进入则被反弹(弹出曲线外).再进一步抽象,把怪看作一个质点(事实上应该把怪的四边看作四个质点,任一个进入封闭曲线后即被反弹,但这里不影响核心算法),那么问题转变为如何判断某点是否在封闭曲线内.
明确了核心算法后就可以开始用数学方法讨论了,不过别担心,我不会写公式的:)
首先看看一般情况,请看下图(见图一):
按此在新窗口打开图片
图一:一般情况判断某点是否在封闭曲线内.
如图所示,A点在曲线S内,那么可以证明,由A点作任一方向的射线,该射线与曲线边的交点有奇数个.而相反如果在曲线S外,如点B,则交点有偶数个.这个定理很好理解,这里不作多述.
好了,明确了这条定理后我们就有方向了,考虑一下lineGirl类型的游戏中所画的封闭曲线并不是任意的,而是只有直角的,线条只有水平和竖直两种,那么我们可以把射线方向确定一下,比如限定为水平方向,如下图所示(见图二):
按此在新窗口打开图片
图二:直角多边形(曲线)中判断某点是否在其内.
如上图,问题关键是:如何判断某点(比如A点,它在S内)是否在曲线S内呢?这里我们必段假定曲线是已知的,也就是曲线上各顶点坐标已知,且各点连接顺序已知,我们观察一下S的特点可以发现,如果A点纵坐标在某一段竖直线段两个端点坐标纵坐标之间,比如CD线段,那么与该线段必有一个交点(即交点1).否则则没有交点,比如线段AB.根据顶点顺序可以顺次查找符合条件的线段(两端点必为相邻顶点),如果总线段数为奇数,则该点在S内.
另外,对于点是否在线上可以单列出来首先判断,虽然可以把在线上作为一种在曲线内的特殊情况,但是单列出来也不会太麻烦,而且代码可能更清晰.这都不是问题.
有了以上两种一般情况的铺垫,下面我们可以很容易地解决lineGirl中的实际问题了.这是因为在实际制作游戏过程中我们可以使用二维数组.
稍微解释一下如何使用二维数组来构造游戏:
我们控制人物移动和怪物移动的最小单位为某一定值,这样就可以以该值为最单位将场景分为若干小块,每一小块都是二维数组中的一个元素."圈地"就抽象为在二维数组中作标记,标记越多"地"也图得越多.而且计算"圈地"的百分比也较容易.
在数组下讨论判断就更容易了,如下图(见图三):
按此在新窗口打开图片
图三:数组情况下对于封闭曲线的判断.
点A在曲线内,每一方格代表一个数组元素,人物移动的最小长度就是方格的边长.以A为端点作水平射线也就是取出A点所代表的数组元素中的同行脚码比A小的元素,如图所示,一共有三个交点.观察一下这三个交点可以发现这样的判断规律:交点左右一边是未圈中地(即在曲线外),另一边是圈中地(即在曲线内),由于不存在"曲线上",所以我们只要数清楚这样的前一元素是未圈中地/圈中地,后一元素是圈中地/未圈中地的个数就可以了,更进一步,圈中地和未圈中地把射线分为了若干段,比如A的射线分为了两段属于圈中地,两段属于未圈中地,如果未圈中地的段数为偶数段,则点A在曲线内(圈中地内),反之如果为奇数则在圈中地外.
以上判断算法可纯算作个人笔记,因为我还没有去做一个DEMO,有朋友正在做,所以只是一点儿意见而已.不对之处希听指正.
阅读(3559) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~