本系列文章由七十一雾央编写,转载请注明出处。

 http://blog.csdn.net/u011371356/article/details/11621337

作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5&mod=personinfo

最近一直在忙着写一个游戏,其中融入了RPG元素,有人物的行走与障碍物判定。

一般而言,当人物行走时碰到障碍物时应该停止不动,就像下面这样

这样的实现非常简单,每次移动前判断人物的矩形是否和障碍物相交即可,如果只以向右的方向为例,代码大概可以写成这样

if(行走)
{
switch(方向)
{
case 右:如果当前位置的右边位置是障碍物,则不动,否则将人物移到右边位置
break;
}
}

这看起来非常合理,我一开始也是按照这个思路写的,但是当人物处于下面这种情况时,即人物只有一部分碰撞到障碍物的时候

如果仍然像上面那样,障碍物和人物矩形仍然是相交的,所以人物仍然是行走不了的,这在游戏中可以接受,但是看起来总是有一种违和感,为什么我们的人物不能智能一点,在拐角处可以绕过障碍物呢?

下面是自己的想法和实现,希望可以给新手朋友们参考,也希望路过的高手可以指导下,毕竟自己对游戏了解的不太多。

在上图的情况中,我们看到人物(就是那只可爱的小狗)向右行走的时候下半部分碰撞到了障碍物,而上半部分没有碰撞到,那么我们希望出现的情况就是小狗先向上行走一点,使得下半部分不再与障碍物碰撞,然后向右行走。如果是上半部分碰撞到障碍物,而下半部分没有碰撞到障碍物,那么小狗应该向下行走一点,再向右行走。

另外,当处于下面这样的情况时

如果小狗向右下方向行走时,那么按照之前的判断,小狗仍然是不会运动的。但是我们想要的效果是小狗向下移动。

那么,我们怎么样实现这个效果呢?

事实上是非常简单的。

实现的思路有两点关键:

1.将运动方向分解,单独进行x方向和y方向的判断和运动。

2.障碍判断使用人物矩形的四个顶点进行。

在游戏中我使用了摇杆,那么当是右上方向时,就分解为向右运动和向上运动。在运动分解之后,第二种情况即小狗沿墙向右下方向的移动就自然解决了,此时小狗运动方向被分解为右方向和下方向,有方向上遇到障碍物无法行走,但是下方向是畅通的,那么就会出现小狗向下面移动的效果了。

再回到我们初始提出的问题,现在解决起来就很容易了。

我们可以很容易的得到小狗矩形的四个顶点,在不同的方向判断中使用不同的点。

例如:当向右运动时,我们得到右上顶点和右下顶点。

判断右上顶点和右下顶点是否遇到障碍物,会出现四种情况

1.右上顶点和右下顶点均是障碍物

这显示就是不可走的情况

2.右上顶点和右下顶点均不是障碍物

这就是可通行的情况

3.右上顶点是障碍物,右下顶点不是障碍物

此时人物应该向下运动,然后再向右运动,绕过障碍物

4.右上顶点不是障碍物,右下顶点是障碍物

人物应该向上运动,然后向右运动,绕过障碍物

事实上如果我们分解处理xy方向之后,对于3,4种情况下,只需要处理前面一部分运动就可以,即只向上下运动即可,因为游戏中是在不断接受玩家的按键信息,不断的处理位置变化,当玩家按着右键的时候,在y方向上处理了上下运动经过障碍物后,在x方向的处理上自然处于可以运动的状态了,也就形成了绕过障碍物的效果。

有了思路,实现可以向下面这样

switch(方向)
{
case 右:if(情况1)
不作处理
else(情况2)
到达该位置,即x增加
else(情况3)
向下运动,即y增加
else(情况4)
向上运动,即y减少
break;
case
……
}

实现中可以用switch –case处理方向。但是写完后就会发现大量的代码都是一样的,所以我是使用了数组,分xy方向分解,依次进行xy方向判断,将上下左右分别添加了另外分解的一个方向,设为不可通行,通过数组下标处理不同的情况,看起来代码就不累赘了。用switch-case语句最大的好处就是代码很清晰,很容易看明白,缺点是重复代码。用数组后代码很简洁,但是语义不是那么清晰,有时过会自己就会混淆,囧。

《C++游戏开发》十八 角色在障碍物中智能行走的实现的更多相关文章

  1. unity3D游戏开发十八之NGUI动画

    我们先来看下帧动画,顾名思义,就是一帧帧的图片组成的动画,我们须要用到UISprite Animation组件,它的属性例如以下: Framerate:播放速率,也就是每秒钟播放的帧数 Name Pr ...

  2. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  3. Egret入门学习日记 --- 第十八篇(书中 8.5~8.7 节 内容)

    第十八篇(书中 8.5~8.7 节 内容) 其实语法篇,我感觉没必要写录入到日记里. 我也犹豫了好久,到底要不要录入. 这样,我先读一遍语法篇的所有内容,我觉得值得留下的,我就录入日记里. 不然像昨天 ...

  4. Unity3D 游戏开发构架篇 ——角色类的设计与持久化

    在游戏开发中,游戏角色占了很大的篇幅,可以说游戏中所有的内容都是由主角所带动.这里就介绍一下角色类的设计和持久化. 一.角色类应用场景和设计思想 游戏中的角色类型不一而足,有不同的技能,有不同的属性等 ...

  5. python运维开发(十八)----Django(二)

    内容目录 路由系统 模版 Ajax model数据库操作,ORM 路由系统 django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对 ...

  6. [转]Angular开发(十八)-路由的基本认识

    angular router https://angular.io/guide/router 本文转自:https://blog.csdn.net/kuangshp128/article/detail ...

  7. PuTsangTo-单撸游戏开发04 给角色添加基本动画

    一. 跳跃与移动的优化与完善 先给上一次的内容做一次补救,也就是上一次中还留存的,由于键盘按键事件的第一次回调与后续回调之间会间隔个小半秒带来的跳跃落地后动作延迟的情况. 最终的键盘按下回调的处理代码 ...

  8. cocos2d-x游戏开发 跑酷(八) 对象管理 碰撞检測

    对象管理类的原理是这种: ObjectManager类是一个单例类,全局仅仅有一个对象实例存在.初始化的时候创建两个数组CCArray来保存金币和岩石.为什么要保存,由于在地图重载的时候.要销毁看不见 ...

  9. 【转】cocos2d-x游戏开发(十四)用shader使图片背景透明

    转自:http://blog.csdn.net/dawn_moon/article/details/8631783 好吧,终于抽时间写这篇文章了. 手头上有很多人物行走图,技能特效图等,但这些图都有个 ...

随机推荐

  1. [IOI1996] USACO Section 5.3 Network of Schools(强连通分量)

    nocow上的题解很好. http://www.nocow.cn/index.php/USACO/schlnet 如何求强连通分量呢?对于此题,可以直接先用floyd,然后再判断. --------- ...

  2. 关于$.ajax的请求格式

    1 $.ajax({ 2 url: "http://localhost:5311/UserService.asmx/GetLoginId",//请求的URL 3 type: &qu ...

  3. Yii2.0中文开发向导——删除数据

    直接 model 删除 $model = User::find($id); $model->delete(); 带有条件的删除 $connection ->createCommand() ...

  4. 国内外主流BI厂商对比

    BI(Business Intelligence),即商业智能或者商务智能,它是一套完整的解决方案,用来将企业中现有的数据进行有效的整合,快速准确的提供报表并提出决策依据,帮助企业做出明智的业务经营决 ...

  5. 转: sublime text常用插件和快捷键

    Sublime Text 2是一个轻量.简洁.高效.跨平台的编辑器.博主之前一直用notepdd++写前端代码,用得也挺顺手了,早就听说sublime的大名,一直也懒得去试试看,认为都是工具用着顺手就 ...

  6. flexjson 的使用

    日期转换             JSONSerializer serializer = new JSONSerializer();         serializer.exclude(new St ...

  7. uva 10651 - Pebble Solitaire(记忆化搜索)

    题目链接:10651 - Pebble Solitaire 题目大意:给出一个12格的棋盘,‘o'代表摆放棋子,’-‘代表没有棋子, 当满足’-oo'时, 最右边的棋子可以跳到最左边的位子,而中间的棋 ...

  8. B - 楼下水题(扩展欧几里德)

    B - 楼下水题 Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  9. c#Winform程序的toolStripButton自己定义背景应用演示样例源代码

    C# Winform程序的toolStrip中toolStripButton的背景是蓝色的,怎样改变背景及边框的颜色和样式呢? 实现此功能须要重写toolStripButton的Paint方法 这里仅 ...

  10. 百度前端技术学院Html&CSS学习资源

    Web相关名词通俗解释 https://www.zhihu.com/question/22689579 MDN HTML入门 https://developer.mozilla.org/zh-CN/d ...