河海编程讨论小组演讲讲稿
活动第二期
by EmilMatthew 06/04/21
1 碰砖块小游戏的实现思路
1.1综述:
碰砖块是一个长见的非常好玩又不难编制的小游戏。从结构主义看来,这个游戏的实现关键是要处理好以下几部分:
a)横杆的移动。
b)球与矩形的碰撞检测。
c)输赢的检测。
d)碰撞后球体的运行方式。
对于砖块部分,在考虑选用的数据对象时,用一个二维的BOOL型数组arrBricks即可。用True表示砖块存在,用False表示砖块不存在(被碰掉或该关不需要)
其中a)和c)都相对容易:
a)的实现方式比较灵活,有监听器模型,循环及事件驱动等,具体要视语言及开发环境所视。
c) 赢的条件:看一下BOOL矩阵arrBricks是否全为空即可。
输的条件:小球飞出底线没有被挡板接到。
重点谈一下b)和d) 的实现思路
1.2球与矩形的碰撞检测
谈一下一个我实现时的简单想法:
可以用一个圆球沿矩形块外围运动一周的方法来划定碰撞区域,如下图所示:
这样,在碰撞检测时,实际上可以通过小球的圆心是否落在这个类似跑道的图形中来做。具体在写相应的判定语句时,可以采用一定的技巧来加速判定:
If(r0x>=xBoundLeft&&r0x<=xBoundRight)
{
If(r0x<secLeft)
{
If(r0y>=yTop&&r0y<=yButtom)
{
If(distance(r0Point,leftTopPoint)<=r)
//左上区域
Else if(distance(r0Point,leftButtomPoint)<=r)
//左下区域
Else
//最左区域
}
}
Else if(r0x<secRight)
//略,相信你应该已想出这里的代码了
Else
//略
}
1.3碰撞后球体的运行方式
这里碰撞后球体的运行方式根本没有必要用动能守恒定律,只需要做如下的简单处理即可:
碰前小球速度:vx,vy,碰后小球速度:vx’,vy’
各个角相碰: vx’=-vx ,vy’=-vy
水平线相碰: vx’=vx ,vy’=-vy
垂直线相碰: vx=-vx ,vy=vy
2 RPG游戏中人物的行走思路(Title Based Game)
RPG游戏中的人物的行走是个非常关键的要素,但是,实现它并不是很困难,基本原理简述如下:
注意到在如上图这样的RPG游戏场景,它的背景图实际上是有许多的小方格所组成的。这样,采用对象的形式,则每个方格可以定义成下面的形式:
Class Block
{
Int PicId;
Int PicProperty;
//…
}
比方说,PicId可以做为其加载游戏图片库中的图像的索引号,而PicProperty则可以做为标识该小方格属性的特征值,可以采用下面的形式进行定义:
Int normal=0;//可行走区
Int blocked=1;//非可行走区
Int gate=2 ;//场景切换点,如山洞口等处.
在程序中就可以对应人的行走采用这样的代码来进行控制:
If(Key.isDown(UP))
{
If(mapMatrix[currentRow-1][currentCol]==normal)
{ curretnRow--;
Hero.pos=(currentRow,currentRol,mapMatrix);
}
Else if((mapMatrix[currentRow-1][currentCol]== gate)
{
//other code
}
}
If(Key.isDown(LEFT))
{
//略
}
…….
3一种RTS游戏的中敌人进攻策略的模型
这里简单介绍一种我所知道相对好懂的判定模形,这个模型主要是帮助电脑进行进攻或逃避时的判定的,可以说是一个小小的AI,主要采用的方式是一种简单的效益函数。
假定我们现在关注一个行动单位,不妨设它为hero。
这个hero的基本状态应为不行走或者是由某个positionA到另一个poisitonB,无论它处于何种状态,都可以在其四周框定一个范围,可以是圆形的,或者是方形的。
这时,如果有敌人进来时,那么hero到底是打,还是逃,还是在多个敌人中选择一个较为好打的敌人进攻,都需要做出快速而有效的判定。
如下图所呈现的那样:
实际上,说到底,这个问题可以表述成:当hero遇到敌人时,它选择什么样的策略获得的效益最好。在数学上,这应该是属于一个规划类的问题,不过,游戏中基本不可能对每一个游戏单位都在行动时都进行一次规划求解型的计算,所以,求得一个相对比较好的结果应该就可以满足游戏所需要的要求的。
这里,我们可以简单的采用一种因根据各种素影响权重的大小列出一个线性表达式的形式来处理.
影响的因素有哪些呢:
比如说:双方各自的HP,MP;行动速度;各个被选择对象距离hero的路径的长短。
按照各自的权重,列出类似下面这样的效益函数.
F=a*(myHp-enemy[i].Hp)+b*(myMp-enemy[i].Mp)+c*distance+……
只要在我方对可视范围内的各个敌人的效益函数中选出一个最大的值,如enemy[k],即可对采取进攻姿态。
当然,F函数用myHp/enemy[i].Hp来处理也是可以的,关键就在于是否与用人的直观判定相一致,这时,需要下点力气的是各个系数上,用拟合,回归分析等数学工具可以得到比较好的结果。
显然,这个判定模型是十分粗糙的,比如,没有考虑敌人攻入本方基地时的状况,不过,作为一个有启发意义的思路还是值得一试的。