前言
SimSet在TorqueScript中可以说是最重要,也是用的最多,使用方法简单,但是有些地方需要注意,毕竟脚本调试不是那么容易.
如何组建脚本对象
在TorqueScript中,可以像C++中一样,定义类,有自己的变量(DynamicField),方法(Method),只要不是帧更新的对象,比如管理器,封装体等等都推荐使用脚本类来完全实现,而不是修改C++代码.
脚本类非常灵活,它是作为一个独立的方法集合嵌入到某个控制台对象的,比如SceneObject,Sprite,SimObject,SimSet都可以,视情况而定.比如:
1: 要实现一个独立的管理器或者服务类
有两种选择, 一种直接作为一个独立的模块,这种在Toy中很明显,不再描述. 另一种就是如下方法:
%service = new SimSet() { class = "MyService"; }; function MyService::QuerySth( %this ) { // do sth } %service.QuerySth();
class在前面的笔记中已经详细解释过了,包括Namespace的关系.
2: 对已知的对象扩展方法
%player = new Sprite() { class = "EnemySprite"; }; function EnemySprite::Fire( %this ) { // Fire } %player.getPosition(); %player.Fire()
严格意义上,上面两种其实是一种情况,都是属于对已有对象类的扩展,但是理念上是不一样的.在设计过程中自行决策.
删除与移除
在大量使用SimSet的脚本中,如果涉及到对象的共享问题,那么就要特别注意,什么情况下使用delete,什么时候使用remove.比如:
%set1 = new SimSet(); for( %index = 0; %index < 3; %index++ ) { %obj = new SimObject(); %set1.add( %obj ); } %set2 = new SimSet(); for( %index = 0; %index < 3; %index++ ) { %set2.add( %set1.getObject(%index) ); }
这种情况下,set1与set2中其实是同一个对象,对任意一个使用deleteobjects,另一个也会被清空,这里要非常注意,如果不能保证,那么最好是clone一下,各保存各的.
比如set1是配置库或者模版库,而set2是具体的使用方,那么就需要克隆,不能直接add.
总结
TorqueScript非常强大,还在不断完善,虽然Melv不知道为什么跳槽了,但是项目还在继续,最近增加了IOS reactor和Leap的支持,而且编辑器也已经开始了!很看好!