创建几条带链球的锁链,并模拟之间的物理碰撞.
代码片段
创建一条锁链需要分四步:
1. 创建一个静态对象作为整条链子的锚点,这个对象是固定不动的
// 创建一个精灵
%fixedObject = new Sprite();
// 设置为静态固定类型
%fixedObject.BodyType = static;
// 图像资源
%fixedObject.Image = "ToyAssets:chain";
// 位置设定
%fixedObject.setPosition( %posX, %posY );
// 尺寸
%fixedObject.setSize( %linkWidth, %linkHeight );
// 加入场景
SandboxScene.add( %fixedObject );
2. 创建一条链子,整条链接链由数量众多的小对象组成
// 接上面的代码,因为设置链接的时候需要用到两个相连接的对象
%lastLinkObj = %fixedObject;
// 创建链条节点
for ( %n = 1; %n <= %this.ChainLinks; %n++ )
{
// Create the link object.
%obj = new Sprite();
%obj.setImage( "ToyAssets:chain" );
%obj.setPosition( %posX, %posY - (%n*%linkHeight) );
%obj.setSize( %linkWidth, %linkHeight );
%obj.setDefaultDensity( 20 ); // 碰撞回复系数
%obj.setDefaultFriction( 0.2 ); // 摩擦力系数
%obj.createPolygonBoxCollisionShape( %linkWidth, %linkHeight ); // 碰撞边界创建
%obj.setAngularDamping( 0.1 ); // 角度阻尼
%obj.setLinearDamping( 0.1 ); // 线性阻尼
SandboxScene.add( %obj );
// 与上一个节点创建连接关系
SandboxScene.createRevoluteJoint( %lastLinkObj, %obj, 0, -%halfLinkHeight, 0, %halfLinkHeight, false );
// 标记为上一个节点,为下次连接做准备
%lastLinkObj = %obj;
}
3. 创建链球,作为重力体
// Create the weight.
%weight = new Sprite();
%weight.setImage( "ToyAssets:whitesphere" );
%weight.BlendColor = DarkGreen;
%weight.setSize( %weightSize );
%weight.setPosition( %posX, %posY - %pivotDistance - %weightHalfSize );
%weight.setDefaultFriction( 0.2 );
%weight.setDefaultDensity( 1 );
%weight.createCircleCollisionShape( %weightHalfSize );
SandboxScene.add( %weight );
// Create a revolute joint from the last link to the weight.
SandboxScene.createRevoluteJoint( %lastLinkObj, %weight, 0, -%halfLinkHeight, 0, %halfLinkHeight, false );
4. 设定链子的作用范围
// If the chain limit is on then create a rope join from the fixed pivot to the weight.
if ( %this.ChainLimit )
SandboxScene.createRopeJoint(%fixedObject, %weight, 0, 0, 0, %weightHalfSize, %pivotDistance, false);
细节说明
这个例子中有两个重要的新方法,分别是:
转动关节创建方法.
ConsoleMethod(Scene, createRevoluteJoint, S32, 4, 9, "(sceneObjectA, sceneObjectB, [localAnchorA X/Y], [localAnchorB X/Y], [collideConnected]) Creates a revolute joint.\n"
"@param sceneObjectA The first scene object to connect to the joint. Use an empty string to indicate the Scene ground body.\n"
"@param sceneObjectB The second scene object to connect to the joint. Use an empty string to indicate the Scene ground body.\n"
"@param localAnchorA The local point of the first scene object where the joint connects.\n"
"@param localAnchorB The local point of the second scene object where the joint connects.\n"
"@param collideConnected Whether the scene objects can collide with each other while connected with this joint.\n"
"@return The joint Id (-1 if error).")
绳关节创建方法.
ConsoleMethod(Scene, createRopeJoint, S32, 4, 10, "(sceneObjectA, sceneObjectB, [localAnchorA X/Y], [localAnchorB X/Y], [maxLength], [collideConnected]) Creates a rope joint.\n"
"@param sceneObjectA The first scene object to connect to the joint. Use an empty string to indicate the Scene ground body.\n"
"@param sceneObjectB The second scene object to connect to the joint. Use an empty string to indicate the Scene ground body.\n"
"@param localAnchorA The local point of the first scene object where the joint connects.\n"
"@param localAnchorB The local point of the second scene object where the joint connects.\n"
"@param maxLength The maximum rigid length of the rope.\n"
"@param collideConnected Whether the scene objects can collide with each other while connected with this joint.\n"
"@return The joint Id (-1 if error).")
效果图: