最近被策划要求,实现平滑行走的炸弹人移动。

参考:http://www.7k7k.com/swf/129418.htm

我不是给这厮做广告,也不觉得这东西好玩,只是研究这算法还算好玩。一开始我做的时候,走进了一个误区,要炸弹人走到离中心线很近的距离,才可以转弯,然后做位置矫正,结果移动不平滑,很生硬。

后来看了人家游戏怎么做的(小策划一直不肯给我看这个,是不是怕被我知道山寨目标呢?嘿嘿嘿)

发现原来还有更好的解决方案,那就是,当人物未达到中点,但是已经迈到下一个格子的时候,做操作补正,如图所示。

旧的思路是只有玩家在接近中线时才可以转弯,这明显很难做到,参考了人家游戏的做法之后,我开始了反向工程(山寨算法),花了大约一天时间,研究明白了其中的道理。

如图,当玩家中点在路1的时候,肯定是不能右转的,因为灰色障碍挡住了玩家的路线,而当玩家中点在路2时候,允许转弯,但是明显,不能让玩家脑袋

插在墙里移动,因此必须先修正方向,让玩家的中点对准路2的中线之后,才允许他转弯。

这里不给代码了,只是说一下思路和要点:

【1】能否移动到目标方向(操作方向)指向的格子,完全取决于master_stand_on

是的,做炸弹人这种游戏的时候,除了在格子正中央时,炸弹人总是踩在两个格子上的,并且,炸弹波及两个格子时,都会记录伤害。因此,

我用两个引用指向这两个格子,其中炸弹人的中心所在的格子,是其父节点,也就是master_stand_on

【2】只有在严格中点上,slave_stand_on为空

【3】当离开严格中点时,必须立刻计算slave_stand_on

【4】当slave的中心距小于master的中心距时,必须立刻交换master与slave,并且更改Transform.parent
【5】当master在操作方向上,允许移动,而slave在操作方向上,不能移动时,需要计算修正方向。

这个比较难解释,直接给段代码吧

public EDirection GetAdjustDirection( EDirection op_direction ) 
        {
            //如果恰好在中点,纠正方向,就是原始方向
            if (is_on_center ) 
            {
                return op_direction;
            }

if (slave_stand_on.y == master_stand_on.y && (op_direction == EDirection.UP || op_direction == EDirection.Down) )
            {
                if (slave_stand_on.GetNeibhouor(op_direction).CanMoveIn(this) == false)
                {
                    if (master_stand_on.x < slave_stand_on.x)
                    {
                        return EDirection.Left;
                    }
                    else
                    {
                        return EDirection.Right;
                    }
                }
            }

if (slave_stand_on.x == master_stand_on.x && (op_direction == EDirection.Left || op_direction == EDirection.Right))
            {
                if (slave_stand_on.GetNeibhouor(op_direction).CanMoveIn(this) == false)
                {
                    if (master_stand_on.y < slave_stand_on.y)
                    {
                        return EDirection.Down;
                    }
                    else
                    {
                        return EDirection.UP;
                    }
                }
            }

return op_direction;
        }
【6】不过中点时,物件移动方向,取决于修正方向。而不是操作方向。除非他们一致。
【7】任何经过中心点的移动,都必须被拆分成两个移动,哪怕方向不改变,移动到中心点,
必须触发进入中心点事件,以保证离开中心点时触发离开中心点事件,这是整套算法的核心。

这个是所有算法最重要的核心:

表面上看,只要预测 当前LocalPosition的xy值和预测下一帧LocalPosition的xy值符号是否发生变化即可,然而实质上,光是这样还不够的,最好同时判断上一帧的xy符号值和这一帧的符号值,取或,才能得到正确结果。

【8】回到中心点事件中,必须将slave_stand_on设置为空。
【9】如果经过中心点并转向,前半部分移动,方向取决于纠正方向,而后半部分,取决于操作方向

照着这个思路,实现一个炸弹人行走的流畅算法,应该很容易了,具体怎么做自己思考一下才有意思,就不上全部代码了。

Unity 实现类似 QQ泡泡堂一样平滑行走的 基于Tile的移动算法相关推荐

  1. 泡泡堂、QQ堂游戏通信架构分析 zz

    http://blog.csdn.net/sodme 之前,我分析过QQ游戏(特指QQ休闲平台,并非QQ堂,下同)的通信架构(http://blog.csdn.net/sodme/archive/20 ...

  2. Unity UGUI简单的音频播放+读歌词(实现类似 QQ音乐,网易云音乐歌词滚动)

    Unity UGUI简单的音频播放+读歌词(实现类似 QQ音乐,网易云音乐歌词滚动) 效果图 (demo下载地址 demo下载地址) 简单代码 /// <summary> /// 解析数据 ...

  3. 泡泡堂网络游戏的设计与实现

    泡泡堂网络游戏的设计与实现 摘  要 网络游戏开发是一项很大的工程,需要很多综合性的知识.这对于刚刚入门的开发者来说很难理解.本论文从研究开发一个模仿泡泡堂网络游戏的例子出发,讲述网络游戏开发中用到的 ...

  4. 基于Java-SWing的泡泡堂网络游戏设计与实现

    目 录 论文总页数:21页 1 引言 1 1.1 课题背景 1 1.2 泡泡堂游戏简介 1 1.3 本课题研究的意义 1 2 开发的环境及相关技术的介绍 2 2.1 开发环境 2 2.2 Java语言 ...

  5. JAVA泡泡堂网络游戏的设计与实现免费源代码+LW

    1 需求分析 本设计主要是实现一个类似于"泡泡堂"功能的网络游戏.其操作流程及其主要功能如下介绍 1.1游戏的操作流程 游戏的操作类似于网络游戏QQ堂.其操作流程如图1所示. 1. ...

  6. 回忆杀,pythonQ版泡泡堂

    导语: 哈喽,要说起小时候玩过的经典游戏,QQ堂和泡泡堂是不能被忽略的.双堂作为小时候​炸弹人网络游戏的典范,承载了一代人的童年回忆,下面看看小编用python做的Q版泡泡堂吧! pythonQ版泡泡 ...

  7. C/C++项目:编译最爱的童年回忆泡泡堂小游戏教程

    <Q版泡泡堂>,是一款经典的flash小游戏,主要以多吃道具,躲避危险,放泡泡把别的人物炸死,才能获得胜利作为游戏目标. 今天我就用C语言带大家一步步去完成好玩有趣学会没网也能玩的属于自己 ...

  8. XNA游戏——泡泡堂

    首先声明,这个游戏原本是中国XNA开发网(http://www.xnadev.cn/) 上的.原作就是一个很精彩的游戏,图形使用了盛大的图像,游戏也设计得十分精彩.但是原作品没有完成,起码还缺少音效等 ...

  9. 泡泡堂段王一进去服务器不稳定,为什么泡泡堂游戏进入不了,只是点了选择了三区,然后就什么也没有了,过半天出来一个服务器连接中断...

    为什么泡泡堂游戏进入不了,只是点了选择了三区,然后就什么也没有了,过半天出来一个服务器连接中断 来源:互联网  宽屏版  评论 2009-03-24 03:38:20 分类: 电脑/网络 >&g ...

最新文章

  1. 如何在一个页面添加多个不同的kindeditor编辑器
  2. 《恋上数据结构第1季》红黑树(未完)
  3. 在线word预览方案
  4. 基于CST电磁仿真软件的波导弯头设计
  5. 梵曦诺(莫七七)店铺案例分析
  6. SOFR, So Far ... So Good?
  7. 可解释机器学习(Explainable/ Interpretable Machine Learning)的原理和应用(李宏毅视频课笔记)
  8. API管理平台,管理企业所有API资产
  9. 读《自控力:斯坦福大学最受欢迎心理学课程》体会
  10. 计算机科学导论(5):计算机网络
  11. 我学编程全靠B站了,真香(第一期)
  12. 运行Intel realsense L515相机
  13. CA策略发布目录SPC
  14. Android和iOS下载量统计方法
  15. 修改linux内核达到隐藏进程目的(2.6.28)
  16. 亨利·明茨伯格(Henry Mintzberg)质量管理学大师
  17. 大数据之统计学基础(一) -- 描述统计
  18. 用笔记本电脑怎样录音?
  19. 资源(论文、文学等)
  20. yield from

热门文章

  1. 佛说,今生你嫁的人,是前世葬你的人
  2. Java 中各数字类型(Double, Float, Long, Integer) 之间以及字符串之间的转换
  3. AcWing 378. 骑士放置(最大独立集)
  4. 什么是NLP思维逻辑层次
  5. Codeforces-429-2-B Godsend
  6. 车辆遇险有eCall,eCall是什么?
  7. Linux防火墙禁止ping的方法
  8. js 一段语音转换为文字 (暂时没有测试)
  9. 实习前端工程师的第一天(第一篇)
  10. Mac电脑U盘格式化数据恢复图文教程