Menu
Samaritan's Purse

PHYSICS

Physics

CODE

´╗┐package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.ui.Keyboard;

    import jiglib.geometry.JBox;
    import jiglib.geometry.JPlane;
    import jiglib.geometry.JSphere;
    import jiglib.math.JMatrix3D;
    import jiglib.math.JNumber3D;
    import jiglib.physics.PhysicsSystem;
    import jiglib.physics.RigidBody;
    import jiglib.plugin.papervision3d.Pv3dMesh;

    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.materials.special.CompositeMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.render.QuadrantRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;

    public class JigLibFlashPhysics extends Sprite
    {
        private var scene            :Scene3D;
        private var camera         :Camera3D;
        private var viewport         :Viewport3D;
        private var renderer         :QuadrantRenderEngine;
        private var material         :ColorMaterial;
        private var materialActive :CompositeMaterial;
        private var materialInactive :CompositeMaterial;
        private var materialMoveable :CompositeMaterial;
        private var materials        :MaterialsList;

        private var jCube :Array = new Array();
        private var jSphere :Array = new Array();

        private var keyForward :Boolean = false;
        private var keyBackward :Boolean = false;
        private var keyLeft     :Boolean = false;
        private var keyRight    :Boolean = false;
        private var keyUp     :Boolean = false;

        private var field :TextField;

        public function JigLibFlashPhysics()
        {
            scene = new Scene3D();

            camera = new Camera3D();
            camera.x = 0;
            camera.y = 500;
            camera.z = -400;

            camera.target = new DisplayObject3D();
            camera.target.x = 0;
            camera.target.y = 250;
            camera.target.z = 0;

            viewport                 = new Viewport3D();
            viewport.autoScaleToStage = true;
            addChild(viewport);

            renderer = new QuadrantRenderEngine(1);

            material = new ColorMaterial(0x000000);

            materialActive = new CompositeMaterial();
            materialActive.addMaterial(new ColorMaterial(0x00ff00, 0.5));
            materialActive.addMaterial(new WireframeMaterial(0x00ff00));

            materialInactive = new CompositeMaterial();
            materialInactive.addMaterial(new ColorMaterial(0xff0000, 0.5));
            materialInactive.addMaterial(new WireframeMaterial(0xff0000));

            materialMoveable = new CompositeMaterial();
            materialMoveable.addMaterial(new ColorMaterial(0xffff00, 0.5));
            materialMoveable.addMaterial(new WireframeMaterial(0xffff00));

            materials = new MaterialsList();
            materials.addMaterial(material, "all");

            var ground :Cube = new Cube(materials, 500, 500, 500);
            scene.addChild(ground);

            var jGround :JBox = new JBox(new Pv3dMesh(ground), 500, 500, 500);
            jGround.movable = false;
            jGround.moveTo(JNumber3D.ZERO);
            jGround.setOrientation(JMatrix3D.rotationX(Math.PI / 2.5));
            PhysicsSystem.getInstance().addBody(jGround);

            var cube :Cube;
            for (var i:int = 0; i < 6; i++) {
                cube = new Cube(materials, 40, 40, 40);
                scene.addChild(cube);

                jCube[i]     = new JBox(new Pv3dMesh(cube), 40, 40, 40);
                jCube[i].mass = 3;
                jCube[i].moveTo(new JNumber3D((Math.random() * 100), 240 + (60 * Number(i) + 60), (Math.random() * -100)));
                PhysicsSystem.getInstance().addBody(jCube[i]);
            }

            var sphere :Sphere;
            for (i = 0; i < 12; i++) {
                if (i == 0) {
                    sphere = new Sphere(materialMoveable, 20, 6);
                } else {
                    sphere = new Sphere(materialActive, 20, 6);
                }
                scene.addChild(sphere);

                jSphere[i]     = new JSphere(new Pv3dMesh(sphere), 20);
                jSphere[i].mass = 3;
                jSphere[i].moveTo(new JNumber3D(((Math.random() * 500) - 250), 240 + (60 * Number(i) + 60), ((Math.random() * 500) - 250)));
                PhysicsSystem.getInstance().addBody(jSphere[i]);
            }

            field                 = new TextField();
            field.autoSize         = TextFieldAutoSize.LEFT;
            field.defaultTextFormat = new TextFormat("verdana");
            field.selectable        = false;
            addChild(field);
            instructions();

            stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp);
            addEventListener(Event.ENTER_FRAME, handleEnterFrame);
        }

        private function handleEnterFrame(e:Event):void
        {
            if (keyForward) {
                jSphere[0].addWorldForce(new JNumber3D(0, 0, 100), jSphere[0].currentState.position);
            }
            if (keyBackward) {
                jSphere[0].addWorldForce(new JNumber3D(0, 0, -100), jSphere[0].currentState.position);
            }
            if (keyLeft) {
                jSphere[0].addWorldForce(new JNumber3D(-100, 0, 0), jSphere[0].currentState.position);
            }
            if (keyRight) {
                jSphere[0].addWorldForce(new JNumber3D(100, 0, 0), jSphere[0].currentState.position);
            }
            if (keyUp) {
                jSphere[0].addWorldForce(new JNumber3D(0, 100, 0), jSphere[0].currentState.position);
            }
            for (var i:String in jCube) {
                if (jCube[i].isActive()) {
                    jCube[i].skin.mesh.material = materialActive;
                } else {
                    jCube[i].skin.mesh.material = materialInactive;
                }
                if (jCube[i].currentState.position.y < 0) {
                    jCube[i].moveTo(new JNumber3D(((Math.random() * 500) - 250), 250, ((Math.random() * 500) - 250)));
                }
            }
            for (i in jSphere) {
                if (Number(i) != 0) {
                    if (jSphere[i].isActive()) {
                        jSphere[i].skin.mesh.material = materialActive;
                    } else {
                        jSphere[i].skin.mesh.material = materialInactive;
                    }
                }
                if (jSphere[i].currentState.position.y < 0) {
                    jSphere[i].moveTo(new JNumber3D(((Math.random() * 800) - 400), 240 + (60 * Number(i) + 60), ((Math.random() * 800) - 400)));
                }
            }
            PhysicsSystem.getInstance().integrate(0.1);
            renderer.renderScene(scene, camera, viewport);
        }

        private function handleKeyDown(e:KeyboardEvent):void
        {
            switch(e.keyCode) {
                case Keyboard.ENTER:
                    field.visible = field.visible ? false : true;
                    break;
                case Keyboard.UP:
                case "W".charCodeAt():
                    keyForward = true;
                    keyBackward = false;
                    break;
                case Keyboard.DOWN:
                case "S".charCodeAt():
                    keyBackward = true;
                    keyForward = false;
                    break;
                case Keyboard.LEFT:
                case "A".charCodeAt():
                    keyLeft = true;
                    keyRight = false;
                    break;
                case Keyboard.RIGHT:
                case "D".charCodeAt():
                    keyRight = true;
                    keyLeft = false;
                    break;
            }
        }

        private function handleKeyUp(e:KeyboardEvent):void
        {
            switch(e.keyCode) {
                case Keyboard.UP:
                case "W".charCodeAt():
                    keyForward = false;
                    break;
                case Keyboard.DOWN:
                case "S".charCodeAt():
                    keyBackward = false;
                    break;
                case Keyboard.LEFT:
                case "A".charCodeAt():
                    keyLeft = false;
                    break;
                case Keyboard.RIGHT:
                case "D".charCodeAt():
                    keyRight = false;
                    break;
            }
        }

        private function instructions():void
        {
            field.text = "Click\tStart"
                + "\nEnter\tInstructions"
                + "\nW\t\tForward"
                + "\nS\t\tBackward"
                + "\nA\t\tLeft"
                + "\nD\t\tRight";
        }
    }
}

Download