zoukankan      html  css  js  c++  java
  • 小妖精的完美游戏教室——魔方塔防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~~

  • 相关阅读:
    HTTP 03 HTTP 报文头
    HTTP 02 HTTP1.1 协议
    HTML 01 请求过程
    Java_异常_04_ OutOfMemoryError系列
    mq_学习_01_消息中间件的概述
    mq_学习_00_资源帖
    Java钉钉开发_异常_01_error code:50002, error message:请求的员工userid不在授权范围内
    Java_JS_01_java调用js
    JavaUtil_09_email_使用 commons-email 发送邮件
    JavaUtil_08_StringUtil_commons-lang3 之 StringUtils
  • 原文地址:https://www.cnblogs.com/balous/p/6559181.html
Copyright © 2011-2022 走看看