قبلا در مورد Box2D مطلب کوتاهی نوشتم در مثال زیر روش drag کردن اجسام را نشان می دهم.
با تغییر در کد خط 89 یعنی مقدار mouse_joint.maxForce مي توان روي قىرت پرتاب اجسام توسط mouse اثر گذاشت.
با تغییر در کد خط 89 یعنی مقدار mouse_joint.maxForce مي توان روي قىرت پرتاب اجسام توسط mouse اثر گذاشت.
package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import Box2D.Dynamics.Joints.*; public class cratetest extends Sprite { public var m_world:b2World; public var m_iterations:int = 10; public var m_timeStep:Number = 1/30; public var mousePVec:b2Vec2 = new b2Vec2(); public var real_x_mouse:Number; public var real_y_mouse:Number; public var pixels_in_a_meter = 30; public var worldAABB:b2AABB = new b2AABB(); public var gravity:b2Vec2 = new b2Vec2(0.0, 10.0); public var mouseJoint:b2MouseJoint; public function cratetest() { addEventListener(Event.ENTER_FRAME, Update, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_DOWN, on_mouse_down); stage.addEventListener(MouseEvent.MOUSE_UP, on_mouse_up); worldAABB.lowerBound.Set(-100.0, -100.0); worldAABB.upperBound.Set(100.0, 100.0); m_world = new b2World(worldAABB, gravity, true); var body:b2Body; var bodyDef:b2BodyDef; var boxDef:b2PolygonDef; bodyDef = new b2BodyDef(); bodyDef.position.Set(8.5, 13.5); boxDef = new b2PolygonDef(); var ground_width = 8.5; var ground_height = 0.5; boxDef.SetAsBox(ground_width, ground_height); boxDef.friction = 0.3; boxDef.density = 0; bodyDef.userData = new floor(); bodyDef.userData.width = ground_width * 2 * pixels_in_a_meter; bodyDef.userData.height = ground_height * 2 * pixels_in_a_meter; addChild(bodyDef.userData); body = m_world.CreateBody(bodyDef); body.CreateShape(boxDef); body.SetMassFromShapes(); for (var i:int = 1; i <=5; i++) { bodyDef = new b2BodyDef(); bodyDef.position.x = Math.random() * 15 + 1; bodyDef.position.y = Math.random(); var crate_width:Number = 1.5; var crate_height:Number = 1.5; boxDef = new b2PolygonDef(); boxDef.SetAsBox(crate_width, crate_height); boxDef.density = 1.0; boxDef.friction = 0.5; boxDef.restitution = 0.2; bodyDef.userData = new crate(); bodyDef.userData.width = crate_width * 2 * pixels_in_a_meter; bodyDef.userData.height = crate_height * 2* pixels_in_a_meter; body = m_world.CreateBody(bodyDef); body.CreateShape(boxDef); body.SetMassFromShapes(); addChild(bodyDef.userData); } } public function Update(e:Event):void { m_world.Step(m_timeStep, m_iterations); if (mouseJoint) { var mouseXWorldPhys = mouseX/pixels_in_a_meter; var mouseYWorldPhys = mouseY/pixels_in_a_meter; var p2:b2Vec2 = new b2Vec2(mouseXWorldPhys, mouseYWorldPhys); mouseJoint.SetTarget(p2); } for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) { if (bb.m_userData is Sprite) { bb.m_userData.x = bb.GetPosition().x * pixels_in_a_meter; bb.m_userData.y = bb.GetPosition().y * pixels_in_a_meter; bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI); } } } public function on_mouse_down(evt:MouseEvent):void { var body:b2Body = GetBodyAtMouse(); if (body) { var mouse_joint:b2MouseJointDef = new b2MouseJointDef; mouse_joint.body1 = m_world.GetGroundBody(); mouse_joint.body2 = body; mouse_joint.target.Set(mouseX/pixels_in_a_meter, mouseY/pixels_in_a_meter); mouse_joint.maxForce = 10000; mouse_joint.timeStep = m_timeStep; mouseJoint = m_world.CreateJoint(mouse_joint) as b2MouseJoint; } } public function on_mouse_up(evt:MouseEvent):void { if (mouseJoint) { m_world.DestroyJoint(mouseJoint); mouseJoint = null; } } public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body { real_x_mouse = (stage.mouseX)/pixels_in_a_meter; real_y_mouse = (stage.mouseY)/pixels_in_a_meter; mousePVec.Set(real_x_mouse, real_y_mouse); var aabb:b2AABB = new b2AABB(); aabb.lowerBound.Set(real_x_mouse - 0.001, real_y_mouse - 0.001); aabb.upperBound.Set(real_x_mouse + 0.001, real_y_mouse + 0.001); var k_maxCount:int = 10; var shapes:Array = new Array(); var count:int = m_world.Query(aabb, shapes, k_maxCount); var body:b2Body = null; for (var i:int = 0; i < count; ++i) { if (shapes[i].m_body.IsStatic() == false || includeStatic) { var tShape:b2Shape = shapes[i] as b2Shape; var inside:Boolean = tShape.TestPoint(tShape.m_body.GetXForm(), mousePVec); if (inside) { body = tShape.m_body; break; } } } return body; } } }
0 نظرات:
ارسال یک نظر