目录
2. 传送器
3. 武器弹夹系统
4. 独立玩家武器切换系统
5. 单次射击多发子弹
6. 新的伤害通知方式
7. 资产管线
8. 小结
1.新的特性:
下面是我们对1.2发布版本的 Torque 3D新特性的摘要。每个汇总包括对每一个新特性的细节。
2.传送器:
传送器是具有特定行为触发的物体。你可以使用一些具备特定的字段的TriggerData datablock(触发器数据 数据块(后面解释定义))来定义一个传送器。
datablock TriggerData(TeleporterTrigger : DefaultTrigger)
{
// 毫秒为单位的时间量,等待允许另一个物体使用传送器的间隔时间。
teleporterCooldown = 0;
// 如果为true,物体会在离开传送器后朝前,否则保持他们原来的朝向。
reorientPlayer = true;
// 如果为true,传送器仅仅监测从前面进入传送器的物体。
oneSided = false;
// 传送器入口播放的特效
entranceEffect = EntranceEffect;
exiteffect = EntranceEffect;
// 客户端传送时播放的2D声效
teleportSound = TeleportSound;
};
当你定义了一个传送器,你还需要一个实例的“exist”字段来定义退出,这是关卡内另一个对象--通常是另一个传送器触发器。还要注意这仅仅定义了触发器本身。如果你需要传送点有个外形,还需要添加一个形状对象到关卡,例如TSStatic。
武器现在可以使用可选的弹夹系统。
要是用武器的弹夹系统每个武器需要定义两个ItemData(道具数据)datablocks(数据块)。首先是弹夹自己,它需要AmmoClip累的一部分。下面是一个例子。
datablock ItemData(LurkeClip)
{
// 任务编辑器类型
category = “AmmoClip”;
className = “AmmoClip”;
// 基础道具属性
shapeFile = “art/shapes/weapons/Lurker/TP_Lurker.DAE”;
mass = 1;
elasticity = 0.2;
friction = 0.6;
// 脚本定义的动态属性
pickUpName = “Lurker clip”;
count = 1;
maxInventory = 10;
};
然后弹药本身需要被定义为Ammo类的一部分。
datablock ItemData(LukerAmmo)
{
// 任务编辑器类型
catagory = “Ammo”;
// 添加Ammo名称空间作为父类。Ammo名称空间提供了通用弹夹涉及的函数和库存系统的挂钩。
class = “Ammo”;
// 基础道具属性
shapeFile = “art/shapes/weapons/Lurker/TP_Lurker.DAE”;
mass = 1;
elasticity = 0.2;
friction = 0.6;
// 脚本定义的动态属性
pickUpName = “Luker ammo”;
maxInventory = 30;
clip = LurkerClip;
};
最后,你要将两者同时加入武器的datablock
脚本代码:
datablock ShapeBaseImageData(LurkerWeaponImage){
。。。
// 属性和弹药
item = Lurker;
ammo = LurkerAmmo;
clip = LurkerClip;
}
当你构建好玩家的datablock时,你必须同时添加武器和弹夹作为玩家可以携带的道具。你不必添加弹药。
datablock PlayerData(DefaultPlayerData)
{
。。。
maxInv[Lurker] = 1;
maxInv[LurkerClip] = 20;
。。。
}
但是,GameCore::loadOut() (加载完毕)期间,你实际添加武器和弹夹给玩家的时候,你也会想添加弹药。为了加载它将启动武器。
function GameCore::loadOut(%game, %player)
{
。。。
// 创建库存系统和武器切换系统(实际是轮换的意思,但通常称为切换)
%player.clearWeaponCycle();
%player.setInventory(Lurker, 1);
%player.setInventory(LurkerClip, %player.maxInventory(LurkerClip));
%player.setInventory(LurkerAmmo, %player.maxInventory(LurkerAmmo));
%player.addToWeaponCycle(Lurker);
。。。
}
默认情况下武器系统会恢复玩家手动重装所剩余的弹夹内的弹量。许多游戏都是如此操作的。如果你希望在弹夹被移除并被丢弃时拥有弹夹内的弹量,可以看下WeaponImage::clearAmmoClip() 方法并注视掉指示的代码行。
武器切换系统不再全局的创建了--它为每个玩家实例创建。这允许不同的玩家使用不同的武器装配,例如一个战士有一套枪械,一个外星人有一套自己的枪械。
通常你会在GameCore::loadOut()中创建武器切换系统,但它可以在服务器的任何时间创建。武器切换方法自己定义在script/server/weapon.cs 而非ShapeBase类(玩家继承的类)。
当开始构建武器切换列表的时候调用玩家的clearWeaponCycle(),它会清理任何存在的列表。然后调用玩家的addToWeaponCycle()为每一个你想轮换的武器道具类。武器添加到列表的顺序将决定玩家轮换武器的顺序。在场景的ShapeBase::cycleWeapon()被玩家调用后,武器应该已被切换完毕。轮换的方向被传入这个方法来向上或向下移动列表。
武器可以单次发射多个子弹。散弹枪是一个好例子。
要想一个武器单次射击多发子弹,需要定义“projectileNum”字段并将它设置大于1。并且如果武器有一个子弹定义了扩散(”projectileSpread”字段)那么每个子弹拥有自己计算的扩散轨迹。
T3D 1.2开始支持基于杀死玩家伤害类型的自定义死亡消息。要设置它你需要定义一个sendMsgClientKilled_XXX 函数来提供死亡消息,XXX是伤害类型。例如,附近的地雷有如下的定义作为定义在地雷datablock的MineDamage伤害类型:
// 自定义附近地雷引发的杀伤消息。
function sendMsgClientKilled_MineDamage(%msgType, %client, %sourceClient, %damLoc)
{
if (%sourceClient $= “”) // 编辑器布置地雷
messageAll(%msgType, ‘%1 was blown up!’, %client.playerName);
else if (%sourceClient == %client) // 我们的地雷
messageAll(%msgType, ‘%1 stepped on his own mine!’, %client.playerName);
else // 敌人布置的地雷
messageAll(%msgType, ‘%1 was blow up by %2!’, %client.playerName);
}
7.资产管线
T3D中的角色可以被设置使用不同的武器动画,且在使用相同骨骼的不同蒙皮的网格间共享那些动画。
因此,一个标准的T3D角色将有COLLADA文件的角色的蒙皮网格和蒙皮骨骼以及角色针对每个武器动作的骨骼动画。这些动画可以独立倒出或组合成一个.dae文件,它由形状编辑器分离出来。
更多信息,参考“Torque 3D 角色入门”。
Torque 3D 已经加入了有趣好玩的新功能伴随1.2版本的发布。希望这篇简洁的概叙能让您在您的项目中简单快捷的使用他们。