Torque2D MIT 学习笔记(5) ---- 脚本语法(3)

状态控制

和其他编程语言一样,TorqueScript支持分支结构.

if, then, else

if(<boolean expression>) 
{
   pass logic
}
else 
{
   alternative logic
}
 
// 控制灯光的全局变量
$lightsShouldBeOn = true;

// 检查灯是否应该打开
if($lightsShouldBeOn)
{
   // 开灯
   turnOnLights();

   echo("Lights have been turned on");
}
else
{
   // 关灯
   turnOffLights();

   echo("Lights have been turned off");
}

多行处理的时候需要方括号划定作用域,如果只有一行,也可以省略不写,比如:
// 控制灯光的全局变量
$lightsShouldBeOn = true;

// 检查灯是否应该打开
if($lightsShouldBeOn)
  turnOnLights();   //开灯
else
  turnOffLights(); // 关灯

switch and switch$

If your code is using several cascading if-then-else statements based on a single value, you might want to use a switch statement instead. Switch statements are easier to manage and read. There are two types of switch statements, based on data type: numeric (switch) and string (switch$).

TorqueScript支持两种多分支结构

1: switch: 数字类型

switch(<numeric expression>) 
{
   case value0:
       statements;
   case value1:
       statements;
   case value3:
       statements;
   default:
       statements;
}

PS: 没有break;

switch($ammoCount)
{
   case 0:
      echo("Out of ammo, time to reload");
      reloadWeapon();
   case 1:
      echo("Almost out of ammo, warn user");
      lowAmmoWarning();
   case 100:
      echo("Full ammo count");
      playFullAmmoSound();
   default:
      doNothing();
}

 

2: switch$: 字符串类型

switch$ (<string expression>) 
{
   case "string value 0":
       statements;

   case "string value 1":
       statements;
...
   case "string value N":
       statements;

   default:
       statements;
}

 

// Print out specialties
switch($userName)
{
   case "Heather":
      echo("Sniper");
   case "Nikki":
      echo("Demolition");
   case "Mich":
      echo("Meat shield");
   default:
      echo("Unknown user");
}

 

循环

和C++一样,Torquescript支持两种循环,分别如下:

For循环

for(expression0; expression1; expression2) 
{
    statement(s);
}
例子:
for(%count = 0; %count < 3; %count++) 
{
    echo(%count);
}

OUTPUT:
0
1
2

While循环

语法:

while(expression) 
{
    statements;
}

 

例子:
%countLimit = 0;

while(%countLimit <= 5)
{
   echo("Still in loop");
   %count++;
}
echo("Loop was terminated");

函数

Much of your TorqueScript experience will come down to calling existing functions and writing your own. Functions are a blocks of code that only execute when you call them by name. Basic functions in TorqueScript are defined as follows:

归根结底,Torquescript的代码大多都是要调用存在的引擎函数方法和自定义方法.函数方法是一个在需要时主动调用函数名才执行的代码块.

基本的脚本函数定义方式如下:

// function - 脚本函数的关键字
// function_name - 函数名
// arg0-N... - 参数表(任意个)
// statements - 函数逻辑
// return val - 返回值
function function_name([arg0],...,[argn]) 
{
    statements;
    [return val;]
}

 

例子:

function echoRepeat (%echoString, %repeatCount) 
{
   for (%count = 0; %count < %repeatCount; %count++)
   {
      echo(%echoString);
   }
}
如果脚本被编译执行,那么在其他的函数方法,还有控制台都可以调用这个方法.
echoRepeat("hello!", 5);

OUTPUT:
"hello!"
"hello!"
"hello!"
"hello!"
"hello!"

如果定义了一个函数名已经存在的方法,Torquescript将覆盖老的函数.即使只是参数数量不同,老的方法仍然会给覆盖.

比如:

function OutputA( %text )
{
   echo( %text );
}
function OutputA( %text, %addon )
{
   echo( %text SPC "+" SPC %addon );
}
调用: 
   OutputA( "A output function" );
   OutputA( "A output function", "AddOn Infomation" );
输出:
A output function + 
A output function + AddOn Infomation

 

Console Methods:
         控制台成员方法,是C++函数导出到TorqueScript中使用,与指定的对象类绑定.

Console Functions:

         控制台全局方法,是C++函数导出到TorqueScript中使用,是全局函数,比如使用到的echo.

Objects:

         对象,用在脚本需要处理游戏对象的复杂情况.需要记住的一点就是在Torquescript中的所有的一切都是一个字符串,但是当需要访问一个精灵,场景对象或者任意一个其他对象,字符串就需要转换为相应的对象ID.

 

对象的定义语法: 

// In TorqueScript
%objectID = new ObjectType(Name) 
{   
   [existing_field0 = InitialValue0;]
   ...
   [existing_fieldN = InitialValueN;]

   [dynamic_field0 = InitialValue0;]
   ...
   [dynamic_fieldN = InitialValueN;]
};

语法解释:

%objectID - 保存对象句柄的变量,new是一个关键字,他告诉引擎创建一个ObjectType指定的对象实例.

ObjectType - 引擎或者脚本中的定义的任意一个SimObject的继承类或者子类.SimObject的继承对象统称为游戏世界对象.

Name (可选项) - 对象名字符串

existing_fieldN - 初始化已经存在的类成员变量,当然变量必须是导出到脚本的变量.

dynamic_fieldN - 最后是添加一些新的变量,这些变量有唯一性,只属于这里实例化的对象,被称为动态变量.

Handles vs Names 每一个游戏对象都可以通过两个参数来访问,他们分别是:

Handle - 当对象创建时分配的全局唯一的数字ID编号.

Name - 在对象创建时可选的指定对象名.

例子:

// In this example, Truck is the name of the object
new SceneObject(Truck) 
{
   position = "0 0";
   size = "5 5";
};

 

Object Fields 由脚本实例化的对象可能有自己的数据成员,它们被称为Fields(域);

Methods 除了创建独立的全局方法之外,Torquescript还允许创建和调用绑定对象的方法(类似于类成员函数).一些重要的控制方法是用C++写好然后导出到脚本中,随时可以使用,要使用这些方法只需要通过(.)符号.

语法:

objHandle.function_name();
objName.function_name();

 

例子:
new SceneObject(Truck) 
{
   position = "0 0";
   size = "5 5";
};

// 将Truck对象的所有导出方法输出打印到控制台日志.
Truck.dump();

// 获取对象的数字ID编号
$objID = Truck.getID();

// 输出ID
echo("Object ID: ", $objID);

// 获取对象的位置
%position = $objID.getPosition();

// 输出位置
echo("Object Position: ", %position);

上面的代码展示了如何通过对象句柄和对象名来调用对象的方法.另外,Torquescript还支持对象脚本辅助函数的创建.

语法:

// function - 函数定义关键字
// ClassName::- 类名
// function_name - 函数名
// ... - 参数表
// statements - 逻辑代码
// %this- 传递调用对象的句柄参数
// return val - 返回值
function Classname::func_name(%this, [arg0],...,[argn]) 
{
   statements;
   [return val;]
}

 

最低要求,控制台成员方法需要传递一个对象的句柄.你将经常看到第一个参数是%this.

人们用this作为提醒,但是你可以随意的命名.

一个简单的例子,输出一个由Player类继承而来的对象,名字叫Samurai,很可能会有一些特殊的造型和玩法给予这个武士对象,所以增加自定义的新方法,如下:

// 武士刀入鞘
function Samurai::sheatheSword(%this)
{
    echo("Katana sheathed");
}

当创建了一个武士对象,将会获得一个对象ID,假设这个ID为1042,那么我们可以通过调用上面的方法完成入鞘的操作:

1042.sheatheSword();
OUTPUT: "Katana sheathed"

这里需要注意,我们并没有传递任何参数给函数,%this参数是默认的,由引擎内部自动传递,不需要我们进行额外的传递.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值