Talking about Quick Switch game, Actionscript 3, Box2D, Flash and Game development.
A simple and addictive game which is interesting to deconstruct is Quick Switch. Use your mouse to hover over and activate platforms to guide your ball to the target.
In the making of this prototype, I’ll be using all body types Box2D allows me to use, so we have:
Static Bodies: will be used for platform which are always active
Dynamic Bodies: will be used for the ball
Kinematic Bodies: will be used for platform which need to be activated. If you don’t know what is a kinematic body, read understanding Box2D kinematic bodies.
To simplify the process of level design, I will start from the project basic Box2D editor using Flash movieclips.
So this is the final script:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.*;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
public class Main extends Sprite {
private var boxOriginalSize:int=40;
private var editor:Editor = new Editor();
private var world:b2World=new b2World(new b2Vec2(0,5),true);
private var worldScale:int=30;
public function Main():void {
debugDraw();
addChild(editor);
for (var i:int=0; i500/worldScale) {
b.SetPosition(new b2Vec2(500/worldScale,-50/worldScale));
b.SetLinearVelocity(new b2Vec2(0,0));
}
break;
case b2Body.b2_kinematicBody :
for (var f:b2Fixture=b.GetFixtureList(); f; f=f.GetNext()) {
f.SetSensor(true);
}
break;
}
}
world.QueryPoint(queryCallback,new b2Vec2(mouseX/worldScale,mouseY/worldScale));
world.DrawDebugData();
}
}
}
And this is the result:
Hover the mouse over purple platform to make them solid and drive the ball into the green goal.
Now, let’s see the interesting part of this script, which is update
function:
private function update(e : Event):void {
world.Step(1/30,10,10);
world.ClearForces();
for (var b:b2Body=world.GetBodyList(); b; b=b.GetNext()) {
switch (b.GetType()) {
case b2Body.b2_dynamicBody :
if (b.GetPosition().y>500/worldScale) {
b.SetPosition(new b2Vec2(500/worldScale,-50/worldScale));
b.SetLinearVelocity(new b2Vec2(0,0));
}
break;
case b2Body.b2_kinematicBody :
for (var f:b2Fixture=b.GetFixtureList(); f; f=f.GetNext()) {
f.SetSensor(true);
}
break;
}
}
world.QueryPoint(queryCallback,new b2Vec2(mouseX/worldScale,mouseY/worldScale));
world.DrawDebugData();
}
Line 85: looping through all bodies
Line 86: now it’s time to make different things according to body type
Lines 87-92: it’s a dynamic body (the falling ball): I just put it in its starting place if it falls down the stage
Lines 93-97: it’s a kinematic body (an activable platform): I turn it into a sensor. It’s the best thing to do to make it “transparent”. It does not react to collision.
Line 100: Now it’s time to check for mouse position and check for bodies under the mouse with queryCallback
function.
private function queryCallback(fixture:b2Fixture):Boolean {
var touchedBody:b2Body=fixture.GetBody();
for (var f:b2Fixture=touchedBody.GetFixtureList(); f; f=f.GetNext()) {
f.SetSensor(false);
}
return false;
}
This function simply scans for all fixtures inside the body under the mouse and does not make them sensors anymore.
And that’s it.
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.