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

2023-05-16

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

 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语句最大的好处就是代码很清晰,很容易看明白,缺点是重复代码。用数组后代码很简洁,但是语义不是那么清晰,有时过会自己就会混淆,囧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • C语言 打地鼠游戏 超级详解,各个函数与算法,设计思路与流程

    基于easyx的打地鼠游戏 C 版本请点击此链接 一 游戏简介 游戏简介 疯狂打地鼠 是一款经典的单机休闲益智类小游戏 调皮的小地鼠们又出来活动了 你需要做的就是将他们砸回洞中去 机械风 复古风的游戏画面 不一样的体验 趣味性十足 眼手并用
  • Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animator动画 创建动画控制器 添加需要播放的
  • 【unity3D】TimeLine(详细图解)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇关于unity的TimeLine TimeLine 介绍 打开TimeLine面板的方式 创建TimeLine 创建Track的两种方式 Track的详解 Ti
  • XboxOne的kinect在Unity上的开发——开始界面

    好的 欢迎大家来看这个系列的第二部分的内容 这一次呢 我们就直接进入主题 开发切水果游戏本身 这次的切水果的demo呢 我们选择使用ugui来制作 因为ugui相对于NGUI的各种优势 让我们选择了ugui 关于这些呢 大家可以参考我的另一
  • 游戏开发unity杂项知识系列:抗锯齿处理

    游戏中需要进行抗锯齿处理的地方非常多 这里先写两点 一个是通过使用unity自带的抗锯齿设置 QualitySettings 可以参考下面的连接 QualitySettings也可以通过代码去设置 unity图片抗锯齿设置 LCHUIHUI
  • Unity normalized的坑

    注意 向量太小会返回0 所以要考虑等于000的情况 我们的项目恰恰会用到 normalized返回的值传给 Quaternion LookRotation 结果造成000错误 切记要考虑到 normalized 为0 的情况
  • Niagara官方示例笔记 - 盘点自带重要模块

    Emitter State life cycle生命周期控制 发射器选择system 所有发射器都在system的state里设置生命周期 选择self 发射器独立控制 可以给发射器创建不同类型变量 使用set parameter模块计算
  • 想用好虚幻4引擎做游戏,你需要避免这些扰人的坑(备忘)

    在手游品质越发上扬的如今 已经有不少厂商开始使用一些性能更好的引擎 去尝试游戏制作了 而虚幻4引擎 以下简称UE4 就是其中之一 在这款引擎中已经诞生了诸如 铁拳7 地狱之刃 帕拉贡 等一系列大作 对玩家而言 这些作品都是不折不扣的视觉盛宴
  • cocosCreator2.3.x渲染流程深入剖析笔记(三)

    渲染批次合并之顶点 根据前面说过的render flow流程接下来就是重头戏了render流程 其中包括了 检查两个渲染节点是否可以合并 同时把renderData的数据填充到modelBatch里的buffer中去 所有需要渲染的节点都有
  • Unity3D跑酷游戏开发-游戏结束分数排名当前高能显示 (原创教程)

    一般游戏结束后都会有个分数排名板 接下来让分析这功能 1 游戏结束后显示高分排列 当前玩家分数高能显示 如果能进入排名板 2 数据必须持久化 切换场景 关闭开启游戏都要能用 流程 游戏结束后 调出排名板 1 取得上次的所有排名数据保存到li
  • Visuial Studio 打开 Unity 新建脚本时,新脚本继承MonoBehaviour暂时失效为白色的解决方法

    点击 文件 gt 最近使用的项目和解决方案 gt 点击当前项目 即可瞬间重载当前项目 这个时候 白色的MonoBehaviour会变成绿色 就可以了 当然最传统的方法就是关掉VS再打开 不过挺浪费时间的
  • C++ 游戏开发 打地鼠详解 (含.h文件和.cpp文件)

    基于easyx的打地鼠游戏 期末大作业 C语言版本请见 C语言 打地鼠游戏 超级详解 各个函数与算法 设计思路与流程 一 游戏简介 游戏简介 疯狂打地鼠 是一款经典的单机休闲益智类小游戏 调皮的小地鼠们又出来活动了 你需要做的就是将他们砸回
  • unity3D期末作业捕鱼游戏,适合初学者学习使用,包含源程序所有文件

    虚拟现实期末作业捕鱼游戏 免积分下载 点我下载资源 有按钮 背景音乐 可以发射炮弹捕鱼 可以选择难度 可以调节音乐声音大小 有游戏加载进度条 详细情况请看如下动态图 点我下载资源
  • Python 设计真实反弹球算法及原理分析 (使用物理定律)

    文章简单地使用物理定律 编写程序模拟真实世界中的碰撞 在开始正式讲解之前 先看这两个代码 把球掉头 ball speed 0 ball speed 0 ball speed 1 ball speed 1 可以看到 这个代码直接把球的速度反了
  • unity期末个人作品-落笔洞寻宝探险之旅(寻宝游戏)

    落笔洞寻宝探险之旅 unity寻宝游戏 下载链接在文章下方 为了增添生活的乐趣开发的这款落笔洞寻宝游戏 主要内容为人物在落笔山脉寻找金币 右上角有金币计数器 找到所有金币则获胜 山中有障碍物 触碰会掉血50 人物生命值为100 血量为0则游
  • Unreal Engine4蓝图编程学习(一)

    学习内容主要介绍了蓝图进行对象交互 升级玩家技能 升级AI敌人 跟踪游戏状态完成游戏体验等内容 内容来源于 Unreal Engine4蓝图可视化编程 书籍为2017年 与现在版本有一定区别 一 制作移动标靶 1 1 首先 我们想先创建一个
  • CocosCreator之KUOKUO带你做小小赛车-摄像机跟随

    本次引擎2 0 5 编辑工具VSCode 目标 小小赛车 先亮素材 很简单 就两个 爱给网中的赛道 以及一个小车 好了 让我们新建工程然后把赛道放进去 调整方向与大小 然后把小车拖上去 这样 我是把赛道放大了2倍 旋转了90度 拖一拖位置
  • Unity3d Terrain地形制作系列(一)

    游戏简单地形 地形制作 地形制作 第一步在场景里加载一个地形对象 第二步 我们在属性面板里找到绘制地形 然后选择Set Height 绘制高度 应该我们要制作低凹的效果 所有先让他有个高度 不然是不能实现低凹的效果 如图 我们然后选择绘制地
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • mac下搭建cocos2d-x3.2开发环境

    1 软件 Xcode Ant apache ant 1 9 4 bin tar gz Jdk jdk 8u45 macosx x64 dmg 有的mac系统上没有自带 Ndk android ndk r10d darwin x86 64 b

随机推荐