zoukankan      html  css  js  c++  java
  • 9:《地牢守卫者》代码分析:AntManaToken

      这就是传说中的金币,金币前后被Controller,和Player分别调用。

    在controller中出现在以下地方:

    function CollectManaToken(AntManaToken token)

    {

      token.Collected(AntPawn(pawn));

      AddManaPower(token.TokenPower);
    }

    显而易见该函数一方面是通知token自己已经被使用了,另一方面是加入到controller的power中。

    function AddManaPower(float  tokenPower)

    {            //ManaPower是controller的属性

      ManaPower=FClamp(ManaPower+tokenPower,0,MaxManaPower);

    }

      接下来是AntPawn中有关AntManaToken的函数了:

    实际上是该函数调用了Controller的CollectManaToken函数,也就是说Pawn启发了AntManaToken的交互事件发生,事实上也只有pawn和AntManaToken的距离能做出更好的系统。

    function CheckForManaTokens()

    {

      local AntManaToken token;

      foreach OverLappingActors(class'AntManaToken',token,ManaTokenRadius)

      {

        token.AttractTo(self); //将Attractor指向pawn,紧接着tick函数会将其吸向pawn

        if(VSize(token.location-location)<ManaTokenCollectRadius)

        AntController(controller).CollectManaToken(token);
      }
    }

    现在进入AntManaToken:发现AntManaToken有以下变量

    var AntEmitterSpawnable CollectedEmitterTemplate;    //收集到时应该有一个粒子效果

    var AntPawn MyAttractor;          //自己的吸引者

    var bool WasCollected;           //被收集的标志位,以备用来销毁


    发现controller的token.Collected(AntPawn(pawn));

    function Collected(AntPawn pawn)

    {

      WasCollected=true;

      Spawn(CollectedEmitter.class,,Location,rotation,CollectedEmitter,true);

      LifeSpan=-1;

    }

      标志位决定了token的销毁

      function Destroyed()

    {

      if(WasCollected)

      super.Destroyed();
    }

      看到了Pawn中还有一个地方调用了token.attractTo(self)

    function AttractTo(AntPawn attractor)

    {

      MyAttractor=attractor;

    }


      有一个Tick函数检查MyAttractor

      event Tick(float DeltaTime)

    {

      super.Tick(DeltaTime);

      if(MyAttractor!=none)

      {

        staticMeshComponent.AddForce(Myattractor.ManaTokenAttractorForce*normal(MyAttractor.location-location));
      }

      
    }

    至此ManaToken结束,下一节研究Emitter

  • 相关阅读:
    JS运行机制之 Event Loop 的思考
    模块机制 之commonJs、node模块 、AMD、CMD
    git报错:'fatal:remote origin already exists'怎么处理?附上git常用操作以及说明。
    Uncaught RangeError: Maximum call stack size exceeded-栈溢出
    对循环内部反复声明变量的写法的一点想法?
    JS的forEach和map方法的区别
    函数的属性和方法之call、apply 及bind
    利用Apach ab对nodejs进行并发负载的压力测试
    怎么判断一个对象是不是数组类型?
    Python模块学习之fabric
  • 原文地址:https://www.cnblogs.com/NEOCSL/p/2372523.html
Copyright © 2011-2022 走看看