不同类型刚体接触测试
一个刚体与任意类型的感应刚体接触,preSlove和postSlove将会忽略不执行只执行。测试代码如下:
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+"\n"; } }; }
源码下载:https://yunpan.cn/cxx6C2BgWAYqY 访问密码 a205
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)