Torque2D MIT 学习笔记(26) ---- 关于SimSet的一些注意事项

前言

  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的支持,而且编辑器也已经开始了!很看好!

  

posted on 2013-04-10 21:26  Kevin Game  阅读(925)  评论(0编辑  收藏  举报