Talking about Way of an Idea game, Actionscript 3, Box2D, Flash and Game development.
Welcome to the 3rd part. In part 2 we allowed the player to draw the chalk track in a “paused” Box2D environment and then run the simulation.
Now it’s time to delete our chalk track.
A bit of theory: although the simulation is paused, the chalk bodies are already placed in the Box2D world. So we can easily select them with our old friend GetBodyAtMouse
function.
Then we need to know whether the selected body is a chalk or not… we don’t want to delete other level assets or even the ball!!
So we must check if the userData
of the selected body (that is the attached sprite) is a chalk. If true, we can remove the sprite from the stage and destroy the body.
This is the code:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
public class draw extends Sprite {
public var drawing:Boolean=false;
public var canvas:Sprite = new Sprite();
public var points_array:Array;
public var pixel_dist:int=20;
public var saved_x:int;
public var saved_y:int;
public var m_world:b2World;
public var body:b2Body;
public var bodyDef:b2BodyDef = new b2BodyDef();
public var circleDef:b2CircleDef= new b2CircleDef();
public var mousePVec:b2Vec2 = new b2Vec2();
// radians to degrees conversion
public var rad_to_deg:Number=57.2957795;
// simulation timestep. We start at zero.
public var timestep:Number=0;
public function draw():void {
// world creation
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
m_world=new b2World(worldAABB,new b2Vec2(0,10),true);
//
// *** IMPORTANT: NOTICE THERE ISN'T ANY DEBUG DRAW ROUTINE ***
//
// placing the ball
bodyDef.position.Set(20/30,20/30);
circleDef.radius=15/30;
circleDef.density=1;
circleDef.friction=0.5;
circleDef.restitution=0.2;
// ball's movieclip attachment
bodyDef.userData = new sphere();
bodyDef.userData.x=20;
bodyDef.userData.y=20;
bodyDef.userData.width=30;
bodyDef.userData.height=30;
addChild(bodyDef.userData);
// end ball's movieclip attachment
body=m_world.CreateBody(bodyDef);
body.CreateShape(circleDef);
body.SetMassFromShapes();
//
addChild(canvas);
canvas.graphics.lineStyle(5);
stage.addEventListener(MouseEvent.MOUSE_DOWN,mouse_pressed);
stage.addEventListener(MouseEvent.MOUSE_MOVE,mouse_moved);
stage.addEventListener(MouseEvent.MOUSE_UP,mouse_released);
addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
}
public function mouse_pressed(e:MouseEvent):void {
drawing=true;
canvas.graphics.moveTo(mouseX,mouseY);
points_array=new Array();
saved_x=mouseX;
saved_y=mouseY;
points_array.push(saved_x);
points_array.push(saved_y);
}
public function mouse_moved(e:MouseEvent):void {
if (drawing) {
var dist_x:int=mouseX-saved_x;
var dist_y:int=mouseY-saved_y;
if (dist_x*dist_x+dist_y*dist_y>pixel_dist*pixel_dist) {
canvas.graphics.lineTo(mouseX,mouseY);
saved_x=mouseX;
saved_y=mouseY;
points_array.push(saved_x);
points_array.push(saved_y);
}
}
}
public function mouse_released(e:MouseEvent):void {
drawing=false;
var sx:int;
var ex:int;
var sy:int;
var ey:int;
var dist_x:int;
var dist_y:int;
var dist:Number;
var angle:Number;
var segments:int=points_array.length/2-1;
for (var i:int=0; i
And this is the result:
Draw the track with your mouse, press SPACE to begin the simulation and delete the chalk pressing 0 (zero) and moving the mouse over the chalk.
No need to download anything since you can easily cut-paste this code on the Step 2 example
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.