目录

辅助模块介绍

概述:

为了方便开发者进行开发,加快开发效率,引擎内部以及最小资产库中,都有一些辅助的模块。

其中包含:

  • 仿函数(Functor)
  • KBEDebug
  • Math

仿函数(Functor)

仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

在我们写代码时有时会发现有些功能实现的代码,会不断的在不同的成员函数中用到,但是又不好将这些代码独立出来成为一个类的一个成员函数。但是又很想复用这些代码。写一个公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。这时就可以用仿函数了,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。这样就免去了对一些公共变量的全局化的维护了。又可以使那些代码独立出来,以便下次复用。

我们来看一下引擎提供的functor,其实非常简单:

class Functor:
    def __init__(self, func, *args):
        self.func = func
        self.args = args

    def __call__(self, *args):
        self.func(*(self.args + args))

用法:

比如我们有一个引擎的回调函数:createEntityAnywhere的callback函数,如下:

def create(self):
    key = KBEngine.genUUID64()  # 想放进回调里一起处理,但是现在不行。
    KBEngine.createEntityAnywhere(scene_data["entityType"], {}, self.onCreateCallback)

def onCreateCallback(self,entity)
    # do something with entity

这是createEntityAnywhere的callback回调函数的签名,无法更改。但是我们想在该回调函数里传入一些特定的参数,如上方代码中的key。那怎么办?

此时就需要仿函数,如下:

# 增加import
import Functor

def create(self):
    key = KBEngine.genUUID64()  # 现在可以了
    KBEngine.createEntityAnywhere(scene_data["entityType"], 
                                {},
                                Functor.Functor(self.onCreateCallback, key))

def onCreateCallback(self, key, entity)
    # do something with key and entity

ok! 成功把额外的参数key传入了回调函数,使得更加灵活。


KBEDebug

这个模块也比较好理解,就是提供一些Debug日志输出的手段。其实看下代码就比较容易理解:

def printMsg(args, isPrintPath):
    for m in args:
        print(m)


def TRACE_MSG(*args):
    KBEngine.scriptLogType(KBEngine.LOG_TYPE_NORMAL)
    printMsg(args, False)


def DEBUG_MSG(*args):
    if KBEngine.publish() == 0:
        KBEngine.scriptLogType(KBEngine.LOG_TYPE_DBG)
        printMsg(args, True)


def INFO_MSG(*args):
    if KBEngine.publish() <= 1:
        KBEngine.scriptLogType(KBEngine.LOG_TYPE_INFO)
        printMsg(args, False)


def WARNING_MSG(*args):
    KBEngine.scriptLogType(KBEngine.LOG_TYPE_WAR)
    printMsg(args, True)


def ERROR_MSG(*args):
    KBEngine.scriptLogType(KBEngine.LOG_TYPE_ERR)
    printMsg(args, True)

就是通过KBEngine.scriptLogType(),先设置了日志类型,再进行print


Math模块

该模块在最小资产库中没有.py模块文件,是引擎内置的模块。

在IDE中import Math时,会提示错误。没关系,引擎会正确识别并处理的。

该模块主要提供了Vector3类和一些基于Vector3的数学计算方法,如计算两个Vector3向量的距离:distTo


Copyright © 2018 Yolo Technologies. Publication: 2.0-025. Built: 2018-12-07.