So I pulled a Car class from an older project of mine and decided to integrate it into my project here…. gotta love the ease of integration of classes with Actionscript 3! I also added in some walls to the left and right side to prevent the car and balls to move outside of the viewable area of the movie.
For those who have not followed along this project, you can drag your mouse across the screen to create colidable rectangle particles for the balls and car to bounce off of.
The Main Document class:
package {
import flash.display.Sprite;
import flash.display.Shape;
import flash.ui.Keyboard;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.geom.Rectangle;
import fl.controls.Button;
import org.cove.ape.*;
public class Main extends Sprite {
private var beginX:Number; // top left x position
private var beginY:Number; // top left y position
private var endX:Number; // bottom right x position
private var endY:Number; // bottom right y position
private var dynRect:RectangleParticle;
private var circle:CircleParticle;
private var circleGroup:Group;
private var defaultGroup:Group;
private var car:Car;
public function Main()
{
init();
}
private function init():void
{
stage.frameRate = 55;
// Initialize the engine. The argument here is the time step value.
// Higher values scale the forces in the sim, making it appear to run
// faster or slower. Lower values result in more accurate simulations.
APEngine.init(1/4);
// set up the default diplay container
APEngine.container = this;
APEngine.addMasslessForce(new Vector(0,8));
defaultGroup = new Group();
defaultGroup.collideInternal = true;
circleGroup = new Group();
circleGroup.collideInternal = true;
// this is the bottom
var rect:RectangleParticle = new RectangleParticle(345, 680, 710, 40, 0, true);
defaultGroup.addParticle(rect);
var l:RectangleParticle = new RectangleParticle(0, stage.stageHeight / 2 - 20, 10, stage.stageHeight-40, 0, true);
defaultGroup.addParticle(l);
var r:RectangleParticle = new RectangleParticle(stage.stageWidth, stage.stageHeight / 2 - 20, 10, stage.stageHeight-40, 0, true);
defaultGroup.addParticle(r);
APEngine.addGroup(defaultGroup);
APEngine.addGroup(circleGroup);
// make the groups collidable
defaultGroup.addCollidable(circleGroup);
addEventListener(Event.ENTER_FRAME, run);
stage.addEventListener(MouseEvent.MOUSE_DOWN, beginRectDraw);
stage.addEventListener(MouseEvent.MOUSE_UP, stopRectDraw);
// build the UI
buildUI();
}
private function beginRectDraw(m:MouseEvent):void
{
beginX = mouseX;
beginY = mouseY;
}
private function stopRectDraw(m:MouseEvent):void
{
// set the end points
endX = mouseX;
endY = mouseY;
// remove the listeners
stage.addEventListener(MouseEvent.MOUSE_DOWN, beginRectDraw);
stage.addEventListener(MouseEvent.MOUSE_UP, stopRectDraw);
// now draw the rectangle
drawRectangle();
}
private function drawRectangle():void
{
if ( beginY < 660 && endY < 660 )
{
dynRect = new RectangleParticle(beginX + ( (endX - beginX)/2 ), beginY + ((endY - beginY)/2), endX - beginX, endY - beginY, 0, true);
defaultGroup.addParticle(dynRect);
}
}
private function addBall( m:MouseEvent ):void
{
circle = new CircleParticle(Math.random() * stage.stageWidth, Math.random() * 100, Math.random() * 25 + 5);
circleGroup.addParticle(circle);
}
private function addCar ( m:MouseEvent ):void
{
car = new Car(Math.random() * 0xffffff,Math.random() * 0xffffff);
APEngine.addGroup(car);
defaultGroup.addCollidable(car);
circleGroup.addCollidable(car);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
}
private function run(e:Event):void
{
APEngine.step();
APEngine.paint();
}
private function removeLastBall( m:MouseEvent ):void
{
if ( circle ) circle.cleanup();
}
private function clearBoard( m:MouseEvent ):void
{
APEngine.removeGroup(defaultGroup);
APEngine.removeGroup(circleGroup);
APEngine.removeGroup(car);
init();
}
function keyPressed(event:KeyboardEvent):void {
var keySpeed:Number = 0.8;
if (event.keyCode == Keyboard.UP || event.keyCode == Keyboard.RIGHT)
{
car.speed = keySpeed;
}
if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.LEFT)
{
car.speed = -keySpeed;
}
}
function keyReleased(event:KeyboardEvent):void
{
car.speed = 0;
}
private function buildUI():void
{
// NEW BUTTONS
var btnAddBall:Button = new Button();
btnAddBall.width = 65;
btnAddBall.height = 25;
btnAddBall.move ( 5, stage.stageHeight - 20 - btnAddBall.height / 2 );
btnAddBall.label = "Add Ball";
addChild(btnAddBall);
btnAddBall.addEventListener(MouseEvent.CLICK, addBall);
var btnRemoveBall:Button = new Button();
btnRemoveBall.width = 120;
btnRemoveBall.height = 25;
btnRemoveBall.move ( 75, stage.stageHeight - 20 - btnRemoveBall.height / 2 );
btnRemoveBall.label = "Remove Last Ball";
addChild(btnRemoveBall);
btnRemoveBall.addEventListener(MouseEvent.CLICK, removeLastBall);
var btnAddCar:Button = new Button();
btnAddCar.width = 65;
btnAddCar.height = 25;
btnAddCar.move ( 200, stage.stageHeight - 20 - btnAddCar.height / 2 );
btnAddCar.label = "Add Car";
addChild(btnAddCar);
btnAddCar.addEventListener(MouseEvent.CLICK, addCar);
var btnClearBoard:Button = new Button();
btnClearBoard.width = 120;
btnClearBoard.height = 25;
btnClearBoard.move ( 575, stage.stageHeight - 20 - btnClearBoard.height / 2 );
btnClearBoard.label = "Clear Board";
addChild(btnClearBoard);
btnClearBoard.addEventListener(MouseEvent.CLICK, clearBoard);
}
}
}
the original Car class file:
package {
import org.cove.ape.*;
public class Car extends Group {
private var wheelParticleA:WheelParticle;
private var wheelParticleB:WheelParticle;
public function Car(colorOne:uint=0xffffff, colorTwo:uint=0xffffff) {
wheelParticleA = new WheelParticle(140,30,14,false,2);
wheelParticleA.setStyle(0, colorOne, 1, colorTwo);
addParticle(wheelParticleA);
wheelParticleA.sprite.cacheAsBitmap = true;
var suspA:CircleParticle = new CircleParticle(140,0,7,false,10);
suspA.mass = 0.001;
suspA.setStyle(1, colorOne, 1, colorOne);
addParticle(suspA);
wheelParticleB = new WheelParticle(200,30,14,false,2);
wheelParticleB.setStyle(0, colorOne, 1, colorTwo);
addParticle(wheelParticleB);
wheelParticleB.sprite.cacheAsBitmap = true;
var suspB:CircleParticle = new CircleParticle(200,0,7,false,10);
suspB.mass = 0.001;
suspB.setStyle(1, colorOne, 1, colorOne);
addParticle(suspB);
var wheelAConnector:SpringConstraint = new SpringConstraint(wheelParticleA, suspB, .7, false, 8);
wheelAConnector.setStyle(0, colorOne, 1, colorTwo);
addConstraint(wheelAConnector);
var shockAConnector:SpringConstraint = new SpringConstraint(wheelParticleA, suspA, .6, false, 8);
shockAConnector.setStyle(0, colorOne, 1, colorTwo);
addConstraint(shockAConnector);
var wheelBConnector:SpringConstraint = new SpringConstraint(wheelParticleB, suspA, 0.5, false, 8);
wheelBConnector.setStyle(0, colorOne, 1, colorTwo);
addConstraint(wheelBConnector);
var bodyConnector:SpringConstraint = new SpringConstraint(suspA, suspB, 0.2, true, 8);
bodyConnector.setStyle(0, colorOne, 1, colorTwo);
addConstraint(bodyConnector);
var shockBConnector:SpringConstraint = new SpringConstraint(wheelParticleB, suspB, .6, false, 8);
shockBConnector.setStyle(0, colorOne, 1, colorTwo);
addConstraint(shockBConnector);
var axelConnector:SpringConstraint = new SpringConstraint(wheelParticleA, wheelParticleB, .7, false, 8);
axelConnector.setStyle(0, colorOne, 1, colorTwo);
addConstraint(axelConnector);
}
public function set speed(s:Number):void {
wheelParticleA.angularVelocity = s;
wheelParticleB.angularVelocity = s;
}
}
}
0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.