Dragging objects with Box2D Flash
November 20, 2008 by Emanuele Feronato
Filed Under Actionscript 3, Box2D, Flash, Game design • 19 Comments
Filed Under Actionscript 3, Box2D, Flash, Game design • 19 Comments
This is ideally the next part after Understanding pixels and meters with Box2D and how to select an object with mouse – part 2, but it’s so important understanding how to drag objects with Box2D that I decided to change the title.
Anyway, in this uncommented example (a commented one will follow) you can select any crate with the mouse and drag it.
Changing at line 89 the mouse_joint.maxForce value will affect gameplay.
This is the source code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | 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;
}
}
} |
And this is the result:
Enjoy dragging and dropping crates with your mouse.
» Flash Templates provided by Template Monster are pre-made web design products developed using Flash technology.
They can be easily customized to meet the unique requirements of your project.
They can be easily customized to meet the unique requirements of your project.
19 Responses to “Dragging objects with Box2D Flash”
Leave a Reply
Trackbacks
-
Goodbye AS2… : Emanuele Feronato on
November 26th, 2008 1:03 pm
[...] new cool libraries are written in AS3, just think about BOX2D and the games you can make with [...]
- Citrus Engine released for free for learning
- My epic fail with ClickBank
- Get up to $100,000 for your next Flash game with Mochi GAME Developer Fund
- Create a dynamic content animated footer ad for your site in just 9 jQuery lines – 17 lines version
- Sell sitelocked version of your Flash games and even .fla sources to Free Online Games
- Protect your work from ActionScript code theft with SWF Protector
- Create a dynamic content animated footer ad for your site in just 9 jQuery lines
- Understanding Box2D’s one-way platforms, aka CLOUDS
- Triqui MochiAds Arcade plugin for WordPress upgraded to 1.2
- Box2D Flash game creation tutorial – part 2
- Create a Lightbox effect only with CSS - no javascript needed
- Flash game creation tutorial - part 1
- Create a Flash Racing Game Tutorial
- Flash game creation tutorial - part 2
- Make a Flash game like Flash Element Tower Defense - Part 2
- Flash game creation tutorial - part 3
- Triqui MochiAds Arcade plugin for WordPress official page
- Make a Flash game like Flash Element Tower Defense - Part 1
- Create a flash draw game like Line Rider or others - part 1
- Create a flash artillery game - step 1
- Flash game creation tutorial – part 5.2 (4.88/5)
- Create a flash artillery game – step 1 (4.79/5)
- Create a Flash Racing Game Tutorial (4.76/5)
- Create a survival horror game in Flash tutorial – part 1 (4.74/5)
- Create a flash artillery game – step 2 (4.74/5)
- Creation of a Flash arcade site using WordPress – step 2 (4.73/5)
- Flash game creation tutorial – part 1 (4.71/5)
- Flash game creation tutorial – part 2 (4.71/5)
- Create a flash draw game like Line Rider or others – part 1 (4.69/5)
- Creation of a platform game with Flash – step 2 (4.68/5)

(18 votes, average: 4.33 out of 5)



Very cool!
Nice tutorial I was having an idea to create a game by dragging the boxes and it helps a lot. :)
Can you please make a turoial how to make game like mytheria
COOOOOOOOOLLLLL!!!!!! :D
excelente
Won’t Work
1046: Type was not found or was not a compile-time constant: b2Body. “public function GetBodyAtMouse(includeStatic:Boolean=false):b2Body {“
hi,I’m very much interested to create games in flash can u help me
Im trying to put a top limit…
//arriba
boxDef.SetAsBox(8.5, 14.5);
bodyDef.position.Set(8.5, -0.5);
boxDef.friction = 1;
boxDef.density = 0;
bodyDef.userData = new floor();
bodyDef.userData.width = 8.5 * 2 * pixels_in_a_meter;
bodyDef.userData.height = 0.5 * 2 * pixels_in_a_meter;
addChild(bodyDef.userData);
body = m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
…the limit is in a correct position but my box have a bad movement, what´s the problem?
solucionado!!! Thanksssssss a lot
Fixed :
worked well if addin my b2body a m_userData when created rather than addin userData to the body Def…
now everything works fine….
Is a empty b2Body always considered as null ???
Strange ????
Please can you fully explain the code iside the function function GetBodyAtMouse.
Thanks
thankssssss a lot !
regarding this function (GetBodyAtMouse), i did not understand all of them .
especially line 112. what is it used for?
Great!
Now where is Box3D???
I am SERIOUS!!!!
What faster using GetBodyAtMouse() or
private function on_mouse_down(e:MouseEvent):void
{
for(var body:b2Body=world.GetBodyList();body;body=body.m_next)
{
if(body.m_userData==e.target) break;
}
if (body)
{
…do something…
}
}
?
but my method depend on object count.
Great !!
I would like to know how can I delineate the area of drag and drop ?
PS: sorry for my bad benglish.. :/
Emanuele, might I ask why you always put everything in the same class ? is it for the simplicity of the tutorial ?
Having a single script to show is easier to display and understand for newbies.
Emanuele, great job. thanks for u r code its really helps us to move forward with box2d. keep it up.