Talking about Platform game game, Actionscript 3, Box2D, Flash and Game development.
Platform engines always represented a challenge for me, you can see my prototypes with AS2 and AS3, and this time I am going to make one using Box2D.
Box2D is used as physics engine by PlayCrafter guys, and since the results you can see in Rick Triqui game are really interesting, I’ll start coding my little personal engine to make platform games.
The following script is an adaptation of Platform game basics using Box2D but I am going to add it a lot of options in order to let you use it for your projects.
I am also using the input class included in Box2D, why writing my own one if that one works?
At the moment it’s only a bunch of lines starting from the Hello World example, but starting from tomorrow I’ll code the main character shooting as seen in Rick Triqui.
package {
import flash.display.Sprite;
import flash.events.Event;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
import General.Input;
import flash.events.MouseEvent;
public class HelloWorld extends Sprite {
public var m_world:b2World;
public var pixels_in_a_meter:int=30;
public var bodyDef:b2BodyDef;
public var boxDef:b2PolygonDef;
public var m_input:Input;
public var xspeed:int=0;
var body:b2Body;
public function HelloWorld() {
addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
var gravity:b2Vec2=new b2Vec2(0.0,10.0);
var doSleep:Boolean=true;
m_world=new b2World(worldAABB,gravity,doSleep);
var m_sprite:Sprite;
m_sprite = new Sprite();
addChild(m_sprite);
var dbgDraw:b2DebugDraw = new b2DebugDraw();
var dbgSprite:Sprite = new Sprite();
m_sprite.addChild(dbgSprite);
dbgDraw.m_sprite=m_sprite;
dbgDraw.m_drawScale=30;
dbgDraw.m_alpha=1;
dbgDraw.m_fillAlpha=0.5;
dbgDraw.m_lineThickness=1;
dbgDraw.m_drawFlags=b2DebugDraw.e_shapeBit;
m_world.SetDebugDraw(dbgDraw);
var bodyDef:b2BodyDef;
var boxDef:b2PolygonDef;
var circleDef:b2CircleDef;
square_tile(250,395,500,10);
hero(100,370,10,40);
// Box2D input class - why should I bother making my one?
m_sprite = new Sprite();
addChild(m_sprite);
// input
m_input=new Input(m_sprite);
}
public function square_tile(px:int,py:int,w:int,h:int) {
bodyDef = new b2BodyDef();
bodyDef.position.Set(px/pixels_in_a_meter, py/pixels_in_a_meter);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(real_pixels(w), real_pixels(h));
boxDef.friction=0.3;
boxDef.density=0;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
}
public function hero(px:int, py:int, w:int, h:int) {
bodyDef = new b2BodyDef();
bodyDef.position.Set(px/pixels_in_a_meter, py/pixels_in_a_meter);
boxDef = new b2PolygonDef();
boxDef.SetAsBox(real_pixels(w), real_pixels(h));
boxDef.density=1.0;
boxDef.friction=0.3;
boxDef.restitution=0.2;
bodyDef.userData = new Sprite();
bodyDef.userData.name="Player";
body=m_world.CreateBody(bodyDef);
body.SetBullet(true);
body.CreateShape(boxDef);
body.SetMassFromShapes();
}
public function real_pixels(n:int) {
return (n/pixels_in_a_meter/2);
}
public function Update(e:Event):void {
m_world.Step(1/30, 10);
for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
if (bb.GetUserData()!=null) {
if (Input.isKeyPressed(39)) {
xspeed=3;
} else if (Input.isKeyPressed(37)) {
xspeed=-3;
}
if (xspeed) {
bb.WakeUp();
bb.m_linearVelocity.x=xspeed;
}
bb.m_sweep.a = 0;
}
}
Input.update();
}
}
}
Here it is the result… no need to download, just copy/paste these lines in the Hello World example.
Next time I’ll add graphics and the bazooka, and obviously I’ll explain the script, meanwhile… left/right arrows to move the player.
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.