• 小妖精的完美游戏教室——魔方塔防02,怪物移动


      今天也要直播魔法,求科学的!

      欢迎来到小妖精Balous的完美游戏教室!

      在上节课,小妖精介绍了怪物路径的实现办法,相信米娜桑已经成功了呢。既然我们已经设计好路径,接下来肯定是要让怪物在路径中移动起来,对吧?所以这节课主要介绍如何让怪物在路径中移动。小妖精相信感兴趣的同学在上周已经在网上查阅过相关的资料,你会发现大家的实现方式都大同小异,这是肯定的嘛,毕竟一些落后的方法已经被淘汰掉了。所以,小妖精教给大家的,都是目前最通用的实现方法啦,希望能帮助到大家。

      好啦,言归正传,如果实现怪物的移动。

      其实移动,说白了就是改变怪物的世界坐标,世界坐标改变了,在玩家看上去就是移动啦。所以呢,要实现移动,就是要算出下一帧,怪物的新坐标。在上节课,我们已经实现了路径,而路径是个链表,也就是说,只要怪物保留了路径链表的头结点,就能够沿着路径走到终点啦,是不是很简单呢。

      既然如此,怪物除了坐标系统外,应该还有下面这些额外的属性:

      /// <summary>
      /// 怪物移动速度
      /// </summary>
      public float moveSpeed;

      /// <summary>
      /// 怪物起始结点
      /// </summary>
      public PathNode startNode;

      拥有这些属性后,加上坐标系统,怪物就能够移动咯^o^,下面我用目前市场占比最高的游戏引擎unity为例子,示范最简单的移动代码该怎么写。

      

    /// <summary>
    /// 怪物移动方法
    /// </summary>
    private void Move()
    {
      Vector3 currentPos = transform.position;

      //起始结点在运行时用作目标结点
      Vector3 goalPos = startNode.transform.position;

      //如果到达目标结点,更新下一个目标结点
      if(Vector2.Distance(new Vector2(goalPos.x,goalPos.y),new Vector2(currentPos.x,currentPos.y)) < 0.01f)
      {
        //如果到达终点
        if(startNode.nextNode == null)
        {
          Destroy(gameObject);
        }
        startNode = startNode.nextNode;
      }

      //计算移动方向
      Vector3 dir = new Vector3(goalPos.x - currentPos.x, goalPos.y - currentPos.y).normalized;
      transform.Translate(dir * moveSpeed * Time.deltaTime);
    }

      好啦,这节课就到这里,小妖精会在下节课跟大家见面,byebye~~

  • 相关阅读:
    iPhone 3开发基础教程这本书怎么样
    好久没有用过VS6.0了。
    关于UNIX环境高级编程(第2版)——图灵计算机科学丛书的读后感
    强烈推荐C++ Primer 习题解答(第4版)
    C标准库这本书怎么样
    关于C语言程序设计:现代方法(第2版)的读后感
    强烈推荐JavaScript DOM高级程序设计
    强烈推荐深入浅出Ext JS(第2版)(附光盘)
    关于PHP与MySQL程序设计(第3版)的读后感
    强烈推荐NET设计规范:约定、惯用法与模式(第2版)(附光盘)
  • 原文地址:https://www.cnblogs.com/balous/p/6559181.html
Copyright © 2020-2023  润新知