《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++游戏开发》十八 角色在障碍物中智能行走的实现 的相关文章

  • CocosCreator之KUOKUO带你入门3D小游戏-躲避方块

    本次引擎2 1 0 编辑工具VSCode 目标 3D小游戏躲避方块 2 1 0版本已经出来好几天了 虽然有些地方还不够完善 但是毕竟是能写3D游戏了 简单的来写一个 嘻嘻 console log 滑稽 准备好了吗 GO 新建个工程 然后把画
  • 体积着色器(Volume Shader)

    控制体积材质 如灯光雾 的颜色 透明度和蒙版不透明度 通过该着色器 可以直接将其他属性和效果与材质的颜色 透明度和蒙版不透明度相连 体积着色器 Volume Shader 可用于 聚光灯 Spot Light 点光源 Point Light
  • unity按钮点击无响应的处理方法

    在程序中给Button控件添加了点击事件后无反应 可能由于下列原因导致 按钮的interactable false或者enable false 父节点如果有CanvasGroup组件 还必须把CanvasGroup组件上的interacta
  • 游戏开发unity杂项知识系列:抗锯齿处理

    游戏中需要进行抗锯齿处理的地方非常多 这里先写两点 一个是通过使用unity自带的抗锯齿设置 QualitySettings 可以参考下面的连接 QualitySettings也可以通过代码去设置 unity图片抗锯齿设置 LCHUIHUI
  • UnityEditor-批处理Texture,spriteEditor,代码设置Pivot失效问题

    需求起因 最近制作角色2D八方向的动画 美术提供的序列帧图片资源 角色不同动作不同方向的图片大小和角色实际的中心点是不一致的 如图所示 攻击和溃败的序列帧图片尺寸和角色在图片中心位置是不一样的 这样会导致一个问题 在动画状态切换的时候 犹豫
  • Unity的C#编程教程_47_函数和方法

    C Functions and Methods Overview 1 Functions vs Methods 函数和方法其实就是一个东西 在 C 中通常称之为方法 方法 就是一块打包的代码 比如我们最常见的 就是在 Unity 中初始化
  • 计算机图形学GAMES101(十五)光线追踪(蒙特卡洛积分与路径追踪)

    本节涉及内容 蒙特卡罗积分 路径追踪 蒙特卡罗积分 蒙特卡罗积分的核心思想还是求一个不规则图形的面积 它的做法是 首先在a和b之间找一个值xi然后求f x 接着以f x 为高 ab为宽求矩形的面积 最后将所有的值求平均 当采样数量xi趋于无
  • 在Unity中 改变地形(Terrain),并加上水面、树、草地、材质(地板上色)

    在Unity中 如何使用地形 Terrain 并加上水面 树 草地 材质 地板上色 目录 在Unity中 如何使用地形 Terrain 并加上水面 树 草地 材质 地板上色 一 水面素材包 导入 二 地形 Terrain 地貌设置 地形上升
  • web开发编码_编码和游戏开发

    web开发编码 As a game enthusiast and a beginner programmer I always wonder what it would be like to develop a game 作为游戏发烧友和初
  • Unity游戏开发-Assetbundle打包

    本篇主要是分享unity Assetbundle的打包处理 目录 打包接口 整体设计 打包AssetBundle 压缩资源到StreamingAssets 输出资源清单文件 清单文件结构 AssetFile AssetVersion 处理
  • Unity的C#编程教程_52_类 Class 详解及应用练习(一)

    文章目录 C Classes for Behaviours Custom Classes 1 Custom Classes 2 Serialized Custom Class RPG Item Database Example 3 When
  • unity3D期末作业捕鱼游戏,适合初学者学习使用,包含源程序所有文件

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

    文章简单地使用物理定律 编写程序模拟真实世界中的碰撞 在开始正式讲解之前 先看这两个代码 把球掉头 ball speed 0 ball speed 0 ball speed 1 ball speed 1 可以看到 这个代码直接把球的速度反了
  • Adroid游戏开发实例讲解(四)-电子白板附源码

    Adroid游戏开发实例讲解 四 电子白板附源码 程序之美 电子白板 在很多Android设备中经常会用到 比如说Android电视 触摸屏用上手写笔 轻松在上面写字 比如视频教学Android设备 有很多培训教学机构 都放有Android
  • 六边形地图生成(1)——基础地形

    看了大佬的六边形地图教程 跟着原教程敲了一遍代码 使用的引擎是unity 想把六边形地形的生成思路记录下来 1 基础六边形网格 基础网格很容易绘制 六个边缘点 一个中心点 如何在引擎中绘制动态网格网上一搜一大把 这里就不介绍了 2 边缘扰动
  • Unreal Engine4蓝图编程学习(一)

    学习内容主要介绍了蓝图进行对象交互 升级玩家技能 升级AI敌人 跟踪游戏状态完成游戏体验等内容 内容来源于 Unreal Engine4蓝图可视化编程 书籍为2017年 与现在版本有一定区别 一 制作移动标靶 1 1 首先 我们想先创建一个
  • 【unity3D】创建TextMeshPro(TMP)中文字体(解决输入中文乱码问题)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇是unity的TMP中文输入显示乱码的解决方式 创建 TextMeshPro 中文字体 遇到的问题描述 解决方式 Font Asset Creator 面板扩展
  • GBA编程和汉化常用软件汇总

    内容来自GBA吧中的痴狂小黑 本人只是做个汇总和搬运 1 简易图片导入导出套装 PicSimpleImEx AutoPicRock Ver1 0 这两个软件是用C 写的 想要用 先装dotNetFx40 Full x86 x64 exe 然
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 微信游戏如何开发

    中懿游游戏软件开发 微信游戏开发通常涉及使用微信小游戏平台进行开发 微信小游戏是一种在微信平台上运行的轻量级游戏 用户可以在微信中直接体验 无需下载安装 以下是在微信平台上开发小游戏的一般步骤 1 注册微信开发者账号 访问 微信开放平台 注

随机推荐