How to check collision with box2d?
If box2d body has collision to another body it will be checked with BeginContact function at ContactListener class. If box2d body has disable collision to another body it will be checked with EndContact function at ContactListener. This time I realise how-to check collision one body to another bodies. To check this one I will use userData field b2Body.
MyUserData.as
package
{
/**
* ...
* @author Lexcuk
*/
public class MyUserData
{
public var name:String = '';
public var contactArr:Vector.<String> = new Vector.<String>();
public function MyUserData(name:String)
{
this.name = name;
}
public function addContactString(str:String):void {
if (contactArr.indexOf(str) == -1) contactArr.push(str);
}
public function removeContactString(str:String):void {
var indx:int = contactArr.indexOf(str);
if (indx != -1) contactArr.splice(indx,1);
}
}
}
MyContactListener.as
package
{
import Box2D.Collision.*; import Box2D.Common.Math.*; import Box2D.Common.*;
import Box2D.Dynamics.*; import Box2D.Dynamics.Joints.*; import Box2D.Collision.Shapes.*;
import Box2D.Dynamics.Contacts.*;
public class MyContactListener extends b2ContactListener
{
public function MyContactListener()
{
return;
}// end function
override public function BeginContact(contact:b2Contact) : void
{
//var manifold:b2Manifold = contact.GetManifold();
//var manifoldPoint:b2Vec2 = manifold.m_localPlaneNormal;
var uDataObjectA:Object = contact.GetFixtureA().GetBody().GetUserData();
var uDataObjectB:Object = contact.GetFixtureB().GetBody().GetUserData();
if (uDataObjectA!=null&&uDataObjectB!=null) {
var uDataA:MyUserData = uDataObjectA as MyUserData;
var uDataB:MyUserData = uDataObjectB as MyUserData;
uDataA.addContactString(uDataB.name);
uDataB.addContactString(uDataA.name);
}
}
override public function PreSolve(contact:b2Contact, oldManifold:b2Manifold):void {
/*
contact.SetEnabled(false);
*/
}
override public function EndContact(contact:b2Contact) : void {
var uDataObjectA:Object = contact.GetFixtureA().GetBody().GetUserData();
var uDataObjectB:Object = contact.GetFixtureB().GetBody().GetUserData();
if (uDataObjectA!=null&&uDataObjectB!=null) {
var uDataA:MyUserData = uDataObjectA as MyUserData;
var uDataB:MyUserData = uDataObjectB as MyUserData;
uDataA.removeContactString(uDataB.name);
uDataB.removeContactString(uDataA.name);
}
}
/*
override public function PostSolve(param1:b2Contact, param2:b2ContactImpulse) : void
{
}
*/
}
}
Main class
HowToCheckCollisionWithBox2dDoc.as
package
{
import flash.display.*; import flash.events.*; import flash.system.*;
import flash.ui.*; import flash.utils.*; import flash.sampler.*;
import flash.net.*; import flash.media.*; import flash.net.*;
import flash.external.*; import flash.text.*; import flash.geom.*;
import Box2D.Collision.*; import Box2D.Common.Math.*; import Box2D.Common.*;
import Box2D.Dynamics.*;import Box2D.Dynamics.Joints.*;import Box2D.Collision.Shapes.*;
/**
* ...
* @author Lexcuk
*/
public class HowToCheckCollisionWithBox2dDoc extends Sprite
{
public var world:b2World;
public var debSprite:Sprite;
public var debugDraw:b2DebugDraw;
public var sensorBody:b2Body;
public var body0:b2Body;
public var body1:b2Body;
public var fSize:Number = 100;
public var qBody:b2Body;
public var qTrue:Boolean;
public var tx:Number = 0;
public var ty:Number = 0;
public var dragTr:Boolean;
public var infTxt:TextField;
public function HowToCheckCollisionWithBox2dDoc()
{
var gravity:b2Vec2 = new b2Vec2(0,0);
var doSleep:Boolean = true;
debSprite = new Sprite();
world = new b2World(gravity, doSleep);
debugDraw = new b2DebugDraw();
debugDraw.SetSprite(debSprite);
debugDraw.SetDrawScale(1);
debugDraw.SetFillAlpha(0.3);
debugDraw.SetLineThickness(1.0);
//debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit | b2DebugDraw.e_pairBit | b2DebugDraw.e_controllerBit | b2DebugDraw.e_centerOfMassBit | b2DebugDraw.e_aabbBit );
debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_controllerBit | b2DebugDraw.e_centerOfMassBit );
world.SetDebugDraw(debugDraw);
sensorBody = createCircleBody( true);
sensorBody.SetUserData(new MyUserData('sensorBody'));
body0 = createBody(false);
body0.SetUserData(new MyUserData('body0'));
body1 = createBody(false);
body1.SetUserData(new MyUserData('body1'));
infTxt = new TextField();
addChild(infTxt);
infTxt.mouseEnabled = false;
infTxt.autoSize = TextFieldAutoSize.LEFT;
infTxt.scaleX = infTxt.scaleY = 5;
world.SetContactListener(new MyContactListener());
debSprite.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
addChild(debSprite);
}
private function addedToStageHandler(e:Event):void {
debSprite.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
debSprite.stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
debSprite.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}
private function enterFrameHandler(e:Event):void {
var s:Stage = debSprite.stage;
world.Step ( 1/30, 10, 10 );
world.ClearForces();
world.DrawDebugData();
if (dragTr) {
qBody.SetPosition(
new b2Vec2(tx + s.mouseX,ty + s.mouseY)
);
}
infTxt.text = 'circle sensorBody collision = \n' + (sensorBody.GetUserData() as MyUserData).contactArr;
}
private function mouseUpHandler(e:MouseEvent):void {
dragTr = false;
var s:String;
var eData:MyUserData = sensorBody.GetUserData();
trace(eData.contactArr);
//for (s in eData.contactObj) trace(s);
}
private function mouseDownHandler(e:MouseEvent):void {
var s:Stage = debSprite.stage;
qTrue = false;
world.QueryPoint(onQueryPoint, new b2Vec2(s.mouseX, s.mouseY))
if (qTrue) {
trace(qBody.GetUserData());
tx = qBody.GetPosition().x - s.mouseX;
ty = qBody.GetPosition().y - s.mouseY;
dragTr = true;
}
}
private function onQueryPoint(fixture:b2Fixture):Boolean {
qTrue = true;
qBody = fixture.GetBody();
return true;
}
private function createCircleBody(sensorTr:Boolean):b2Body {
var bodyDef:b2BodyDef = new b2BodyDef();
var body:b2Body;
bodyDef.type = b2Body.b2_dynamicBody;
bodyDef.position = new b2Vec2(300, 300);
//bodyDef.position.Add(pos);
body = world.CreateBody(bodyDef);
body.SetAngularDamping(0.000001);
body.SetLinearDamping(0.000001);
var circleShape:b2CircleShape = new b2CircleShape(fSize);
var fixture:b2Fixture = body.CreateFixture2(circleShape, 1);
fixture.SetSensor(sensorTr);
body.SetSleepingAllowed(false);
return body;
}
private function createBody(sensorTr:Boolean):b2Body {
var bodyDef:b2BodyDef = new b2BodyDef();
var body:b2Body;
bodyDef.type = b2Body.b2_dynamicBody;
bodyDef.position = new b2Vec2(300, 200);
//bodyDef.position.Add(pos);
body = world.CreateBody(bodyDef);
body.SetAngularDamping(0.000001);
body.SetLinearDamping(0.000001);
//wheel shape
//leftWheelBodyShapeDef.density = 1;
var p1:b2Vec2 = new b2Vec2(fSize, fSize);
var p2:b2Vec2 = new b2Vec2(0, fSize+fSize*1.7);
var p3:b2Vec2 = new b2Vec2(-fSize, fSize);
var polygonShape:b2PolygonShape = new b2PolygonShape();
polygonShape.SetAsArray([p1, p2, p3], 3);
var fixture:b2Fixture = body.CreateFixture2(polygonShape, 1);
fixture.SetSensor(sensorTr);
body.SetSleepingAllowed(false);
/*
var b2Mass:b2MassData = new b2MassData();
b2Mass.mass = 0;
b2Mass.I = 1;
b2Mass.center = new b2Vec2(0,0);
body.SetMassData(b2Mass);
*/
return body;
}
}
}
You can drag objects in this demo and look at collision.
zip archive check-collision-box2d
Update Contact :
No Wa/Telepon (puat) : 085267792168
No Wa/Telepon (fajar) : 085369237896
Email : Fajarudinsidik@gmail.com
No Wa/Telepon (puat) : 085267792168
No Wa/Telepon (fajar) : 085369237896
Email: Fajarudinsidik@gmail.com
atau Kirimkan Private messanger melalui email dengan klik tombol order dibawah ini :