異なるタイプのリジッドボディコンタクトテスト
8332 ワード
1つのリジッドボディが任意のタイプの誘導リジッドボディに接触すると、presloveとpostSloveは実行せずに実行することを無視します.テストコードは次のとおりです.
ソースのダウンロード:https://yunpan.cn/cxx6C2BgWAYqYアクセスパスワードa 205
package{
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import flash.text.TextField;
import Box2D.Dynamics.Contacts.b2Contact;
import Box2D.Collision.b2Manifold;
import Box2D.Dynamics.b2ContactImpulse;
import com.bit101.components.TextArea;
import com.bit101.components.PushButton;
import flash.events.MouseEvent;
public class Main extends BaseMain{
public function Main(){
super(new b2Vec2(0,0));
}
private var _box:b2Body;
private var _textArea:TextArea;
private var _clearBtn:PushButton;
override protected function init():void{
//static sensor
createTxt(60,200,"static sensor");
var staticSensorBox:b2Body=createBox(100,100,60,200);
staticSensorBox.SetType(b2Body.b2_staticBody);
staticSensorBox.SetSensor(true);
staticSensorBox.SetAllowMovement(false);
staticSensorBox.SetUserData({type:"static sensor"});
//static
createTxt(60,400,"static");
var staticBox:b2Body=createBox(100,100,60,400);
staticBox.SetType(b2Body.b2_staticBody);
staticBox.SetAllowMovement(false);
staticBox.SetUserData({type:"static"});
//kinematic sensor
createTxt(300,200,"kinematic sensor");
var kinematicSensorBox:b2Body=createBox(100,100,300,200);
kinematicSensorBox.SetType(b2Body.b2_kinematicBody);
kinematicSensorBox.SetSensor(true);
kinematicSensorBox.SetAllowMovement(false);
kinematicSensorBox.SetUserData({type:"kinematic sensor"});
//kinematic
createTxt(300,400,"kinematic");
var kinematicBox:b2Body=createBox(100,100,300,400);
kinematicBox.SetType(b2Body.b2_kinematicBody);
kinematicBox.SetAllowMovement(false);
kinematicBox.SetUserData({type:"kinematic"});
//dynamic sensor
createTxt(500,200,"dynamic sensor");
var dynamicSensorBox:b2Body=createBox(100,100,500,200);
dynamicSensorBox.SetType(b2Body.b2_dynamicBody);
dynamicSensorBox.SetSensor(true);
dynamicSensorBox.SetAllowMovement(false);
dynamicSensorBox.SetUserData({type:"kinematic sensor"});
//dynamic
createTxt(500,400,"dynamic");
var dynamicBox:b2Body=createBox(100,100,500,400);
dynamicBox.SetType(b2Body.b2_dynamicBody);
dynamicBox.SetAllowMovement(false);
dynamicBox.SetUserData({type:"kinematic"});
var box:b2Body=createBox(40,40,300,40);
box.SetContactBeginCallback(contactBegin);
box.SetPreSolveCallback(preSolve);
box.SetPostSolveCallback(postSolve);
box.SetContactEndCallback(contactEnd);
_box=box;
_textArea=new TextArea(null,10,10,"");
addChildAt(_textArea,0);
_clearBtn=new PushButton(this,220,10,"clear",clearHandler);
_clearBtn.setSize(50,20);
}
private function contactBegin(contact:b2Contact):void{
contactHandler(contact,"begin");
}
private function preSolve(contact:b2Contact,oldManifold:b2Manifold):void{
contactHandler(contact,"pre");
}
private function postSolve(contact:b2Contact,impulse:b2ContactImpulse):void{
contactHandler(contact,"post");
}
private function contactEnd(contact:b2Contact):void{
contactHandler(contact,"end");
}
private function contactHandler(contact:b2Contact,cbType:String):void{
var b1:b2Body=contact.GetFixtureA().GetBody();
var b2:b2Body=contact.GetFixtureB().GetBody();
var ob:b2Body=(b1==_box)?b2:b1;
var otype:String=ob.GetUserData().type;
print("bodyType:"+otype, "cbType:"+cbType);
}
private function createTxt(x:Number,y:Number,text:String):void{
var txt:TextField=new TextField();
txt.htmlText="<font color='#ffffff' size='15'>"+text+"</font>";
txt.x=x-txt.textWidth*0.5;
txt.y=y-txt.textHeight*0.5;
addChild(txt);
}
private function clearHandler(e:MouseEvent):void{
_textArea.text="";
}
private function print(... params):void{
var text:String="";
for(var i:int=0; i<params.length; i++) text+=params[i]+" ";
_textArea.text+=text+"
";
}
};
}
ソースのダウンロード:https://yunpan.cn/cxx6C2BgWAYqYアクセスパスワードa 205