forked from: forked from: forked from: PV3D で某ゲームを3D化してみた

by ohisama forked from forked from: forked from: PV3D で某ゲームを3D化してみた (diff: 163)
斁E͗化けしてしまぁE~した
[遊�E方]
・矢印でぁEiぁE// ・それだぁE

[遊�E方]
・クリチEE�E�E�E�E�E�EށE�E�E�E�gジャンプすめE
・それだぁE
♥0 | Line 382 | Modified 2013-02-24 14:38:42 | MIT License
play

ActionScript3 source code

/**
 * Copyright ohisama ( http://wonderfl.net/user/ohisama )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/l9yc
 */

// forked from NOB_Q's forked from: forked from: PV3D で某ゲームを3D化してみた
// 斁E͗化けしてしまぁE~した
// [遊�E方]
// ・矢印でぁEiぁE// ・それだぁE
// forked from moriyoshi's forked from: PV3D で某ゲームめED化してみぁE
// forked from nitoyon's PV3D で某ゲームめED化してみぁE
// [遊�E方]
// ・クリチEE�E�E�E�E�E�EށE�E�E�E�gジャンプすめE
// ・それだぁE
package 
{
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.utils.Dictionary;
    import org.papervision3d.view.*;
    import org.papervision3d.objects.*;
    import Box2D.Dynamics.*;
    import Box2D.Collision.*;
    import Box2D.Common.Math.*;
    [SWF(backgroundColor="#000000", width="475", height="475")]
    public class Test extends BasicView 
    {
        private var character : Character;
        private var jump : Boolean;
        private var prevJump : Boolean;
        private var rjump : Boolean;
        private var prevrJump : Boolean;
        private var walk : int = 0;
        private var keyDownCode : Dictionary = new Dictionary();
        private var world : b2World;
        private var frame : int = 0;
        public function Test() 
        {
            super(475, 475, false);
            {
                var aabb : b2AABB = new b2AABB();
                aabb.lowerBound.Set(-512, -512);
                aabb.upperBound.Set(512, 512);
                var g : b2Vec2 = new b2Vec2(0., -10.0);
                world = new b2World(aabb, g, true);
            }
            stage.scaleMode = "noScale";
            stage.align = "TL";
            CharacterGenerator.init(init);
        }
        private function init() : void 
        {
            Map.populateScene(scene, world);
            scene.addChild(character = new Character(world));
            camera.focus = 800;
            camera.z = -14000;
            camera.x = 2000;
            camera.y = 5000;
            startRendering();
            stage.addEventListener("keyDown", stageKeyDownHandler);
            stage.addEventListener("keyUp", stageKeyUpHandler);    
            stage.addEventListener("click", function(event : Event) : void{jump = true;});
        }
        private function stageKeyDownHandler(event : KeyboardEvent) : void 
        {
            keyDownCode[event.keyCode] = true;
        }    
        private function stageKeyUpHandler(event : KeyboardEvent) : void 
        {
            delete keyDownCode[event.keyCode];
        }    
        private function keydown() : int 
        {
            var keyDownNum : int = 0;    
            for (var key : String in keyDownCode) 
            {
                var intKey : int = int(key);
                switch (intKey) 
                {
                case Keyboard.LEFT:
                    keyDownNum++;
                    if (-10 < walk) walk -= 1;
                break;
                case Keyboard.RIGHT:
                    keyDownNum++;
                    if (walk < 10) walk += 1;
                break;
                case Keyboard.UP:
                    jump = true;
                break;
                case Keyboard.DOWN:
                    rjump = true;
                break;
                }
            }
            return keyDownNum;
        }
        protected override function onRenderTick(e : Event = null) : void 
        {
            super.onRenderTick(e);
            world.Step(1 / 10., 10);
            for (var b : b2Body = world.GetBodyList(); b; b = b.GetNext()) 
            {
                if (b.GetUserData() is DisplayObject3D) 
                {
                    var obj : DisplayObject3D = b.GetUserData();
                    var pos : b2Vec2 = b.GetPosition();
                    obj.rotationZ = 180 * b.GetAngle() / Math.PI;
                    var com : b2Vec2 = b.GetLocalCenter();
                    obj.x = pos.x;
                    obj.y = pos.y;
                }
            }
            if (keydown() == 0)
            {
                if (walk < 0) walk++;
                else if (0 < walk) walk--;
            }
            if (prevJump && jump) 
            {
                jump = false;
            }
            prevJump = jump;
            if (prevrJump && rjump) 
            {
                rjump = false;
            }
            prevrJump = rjump;
            character.update(jump, rjump, walk);
            //camera.z += Math.sin(frame / 100) * 100;
            //camera.y += Math.cos(frame / 100) * -100;
            frame++;
        }
    }
}
import flash.display.*;
import flash.events.Event;
import flash.geom.*;
import flash.utils.ByteArray;
import mx.utils.Base64Decoder;
import org.papervision3d.core.proto.*;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.view.*;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
class CharacterData 
{
    public static const data : String = "R0lGODlhEQEQALMLAP/////Mmf+ZM/9mAP8zAMz/AJlmAGaZ/zPM/wCZAAAAAP///wAAAAAAAAAAAAAAACH5BAEAAAsALAAAAAARARAAAAT/8MhJ6xkh66ywHtcgjuRonZOCoupaJXAsx8ps325+KHyr/0BXD0AsGo+Alm+1aDoJ0KhzSqUKroLgIVAaKbjeAXZMvi6FCW3ivLrNeu64tqIo2AvsuZ6F7CNVCkk5VFGFUlWGBAtjWmBdXyQdAgplY5R5FjVpQTCYL3GdPKA4ejx3d557e4F+rUWsqQdUBrQGV7ZVTYmFV41dIpBhYyVksTsxap06o2uizDKlp6eAqtUUrthG1ChTtAK2t1hVteC25L6/Xx3AYlfAPCKWOZowycoucaJwz8hzddKo8FhTxSObwSSCTnQzB+6bOCfeGpajhe7RgB7rsABzdxFLKnr1/zjJSJVPE0h+0aQlkGZsIJ2DMBNaWNjwW61ZDLFIrFjiywZJHCkJ2GhmxclNQGx4KsmPVJB/BWDcWYnKpRZWMbNhqlJJwDhvOskt4BnJ0cV2Zih58cjC6Y8bmJg2nXF1KsBpVq9mxeYJpwECN3M16WqgCVkvZoEOu8iDbSY39t6cmDv3R4+7mAXuKNVDL4AD2BDwdUHzLy3AtCCSM326sOEgZstGQquxozw6ckTCtUC5qQ6ome8C0gwEq0zLREADEH2E+WhuTVYXEru6Fuq/Cyg+XSd7dqXGt1OAiqz0U29m84Kr/9dyh3Ei7SWwOoCgfpH69u/72Tr4FgEBUABYk/hN5BiSnQGNBAAPYj3RxlEZSxxFl25uLHHeMzmop6Ed2xi132bIGYEffsuN2AoT/V2RSCVR/PVfgKj5wkEPsZ1VBlGOHTMKebtJcCF6LAC3YWZ1fNRKIO0NcZ9zJTKpTV8p7vKfV7e4KKV2QDiiQTDeCeWRl5fIhyEFGPFgHigt/LjjCUIOuZ4QSDgZ3w5/7AdfLIRIUUhpUsYI2yOxwdMVhDoCuc9IZh7Ajwpqjsemm256glV+y2njD1aAGGdmooOollp0gRWYCBVaMIYRBmV2kOqqGDXlDJoSVthobo9C+iYfRDh5xJwpcOqer0B4+umBN6VmYC4RAAA7";
    public static const CHARACTER_WIDTH : int = 16;
    public static const SKY : int = 0;   // Sky
    public static const GRD : int = 1;   // Ground
    public static const BLQ : int = 2;   // Block question
    public static const MT0 : int = 3;   // Mountain left
    public static const MT1 : int = 4;   // Mountain top
    public static const MT2 : int = 5;   // Mountain right
    public static const MT3 : int = 6;   // Mountain with tree
    public static const MT4 : int = 7;   // Mountain background
    public static const BU0 : int = 8;   // Bush left
    public static const BU1 : int = 9;   // Bush mid
    public static const BU2 : int = 10;  // Bush right
    public static const CL0 : int = 11;  // Cloud left top
    public static const CL1 : int = 12;  // Cloud mid top
    public static const CL2 : int = 13;  // Cloud right top
    public static const CL3 : int = 14;  // Cloud left bottom
    public static const MR0 : int = 15;  // MaOio still
    public static const MR1 : int = 16;  // MaOio jumping
}
class CharacterGenerator 
{
    private static var bmdChars : Array = null;
    public static function init(continuation : Function) : void 
    {
        var decoder : Base64Decoder = new Base64Decoder();
        decoder.decode(CharacterData.data);
        var bytes : ByteArray = decoder.toByteArray();
        bytes.position = 0;
        var loader : Loader = new Loader();
        loader.loadBytes(bytes);
        loader.contentLoaderInfo.addEventListener("complete",
            function(event : Event) : void 
            {
                var bmdBundle : BitmapData = new BitmapData(loader.width, loader.height);
                bmdBundle.draw(loader);
                var numChars : int = loader.width / CharacterData.CHARACTER_WIDTH;
                var _bmdChars : Array = new Array(numChars);
                for (var i : int = 0; i < numChars; i++) 
                {
                    var bmdChar : BitmapData = new BitmapData(16, 16);
                    bmdChar.copyPixels(bmdBundle,
                        new Rectangle(
                            i * CharacterData.CHARACTER_WIDTH, 0,
                            CharacterData.CHARACTER_WIDTH,
                            CharacterData.CHARACTER_WIDTH),
                        new Point());
                    _bmdChars[i] = bmdChar;
                }
                bmdChars = _bmdChars;
                continuation();
            }
        );
    }
    public static function get(code : int) : BitmapData 
    {
        return bmdChars[code];
    }
}
import Box2D.Common.Math.b2Vec2;
class Character extends Plane 
{
    private var characterImages : Array;
    private var character : Sprite; 
    private var jumping : Boolean;
    private var vy : int;
    private var rjumping : Boolean;
    private var rvy : int;
    private var my : b2Body = null;
    public function Character(world : b2World) 
    {
        super(null, 17, 16);
        var bmd1:BitmapData = CharacterGenerator.get(CharacterData.MR0);
        var bmd2:BitmapData = CharacterGenerator.get(CharacterData.MR1);
        bmd1.threshold(bmd1, bmd1.rect, new Point(), "==", 0xffffffff, 0, 0xffffffff); // 背景透過
        bmd2.threshold(bmd2, bmd2.rect, new Point(), "==", 0xffffffff, 0, 0xffffffff);
        characterImages = [new Bitmap(bmd1), new Bitmap(bmd2)];
        character = new Sprite();
        for each (var img : Bitmap in characterImages) 
        {
            character.addChild(img);
            img.visible = false;
        }
        setImage(0);
        material = new MovieMaterial(character, true, true, true, new Rectangle(0, 0, 17, 16));
        //x = -64;
        //y = -40;
        //z = -8;
        x = 30;
        y = -30;
        z = -8;
        var boxdef : b2BodyDef = new b2BodyDef();
        boxdef.position.Set(x, y);
        my = world.CreateBody(boxdef);
        my.CreateShape(createBoxShape());
        my.SetUserData(this);
        my.SetMassFromShapes();
        my.GetLocalCenter().x += Math.random() - .5;
        my.GetLocalCenter().y += Math.random() - .5;
    }
    private static function createBoxShape() : b2PolygonDef 
    {
        var boxshape : b2PolygonDef = new b2PolygonDef();
        boxshape.SetAsBox(CharacterData.CHARACTER_WIDTH / 2, CharacterData.CHARACTER_WIDTH / 2);
        boxshape.density = 1;
        return boxshape;
    }
    public function update(jump : Boolean, rjump : Boolean, walk : int) : void 
    {
        if (jump && !jumping) 
        {
            vy = 9;
            jumping = true;
            var vec:b2Vec2 = my.GetLinearVelocity();
            vec.Set(vec.x, 70);
            my.SetLinearVelocity(vec);
        }
        
        if (jumping) 
        {
            //y += vy;
            if (vy < -8) 
            {
                vy = 0;
                jumping = false;
            }
            vy--;
        }
        if (rjump && !rjumping) 
        {
            rvy = 9;
            rjumping = true;
            vec = my.GetLinearVelocity();
            vec.Set(vec.x, -70);
            my.SetLinearVelocity(vec);
        }
        if (rjumping) 
        {
            //y += vy;
            if (rvy < -8) 
            {
                rvy = 0;
                rjumping = false;
            }
            rvy--;
        }
        vec = my.GetLinearVelocity();
        vec.Set(walk * 10, vec.y);
        my.SetLinearVelocity(vec);
        setImage(jumping ? 1 : 0);
    }
    private function setImage(num : int) : void 
    {
        for (var i : int = 0; i < characterImages.length; i++) 
        {
            characterImages[i].visible = (num == i);
        }
    }
}
class Map extends CharacterData 
{
    private static var mapTypeIndex : int = 0;
    private static const map : Array = 
    [
        [GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD],
        [GRD, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, MT0, MT3, GRD, GRD],
        [GRD, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, MT1, MT3, MT4, GRD, GRD],
        [GRD, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, MT2, MT3, GRD, GRD],
        [GRD, SKY, SKY, SKY, SKY, BLQ, SKY, SKY, SKY, SKY, SKY, MT2, GRD, GRD],
        [GRD, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, GRD, GRD],
        [GRD, SKY, SKY, SKY, BLQ, SKY, SKY, BLQ, SKY, SKY, SKY, SKY, GRD, GRD],
        [GRD, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, GRD, GRD],
        [GRD, SKY, SKY, CL1, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, GRD, GRD],
        [GRD, SKY, CL0, CL2, SKY, SKY, SKY, BLQ, SKY, SKY, SKY, SKY, GRD, GRD],
        [GRD, SKY, SKY, CL3, SKY, SKY, SKY, SKY, BLQ, SKY, SKY, SKY, GRD, GRD],
        [GRD, SKY, SKY, SKY, CL1, SKY, SKY, SKY, SKY, SKY, SKY, BU0, GRD, GRD],
        [GRD, BLQ, SKY, CL0, CL2, SKY, SKY, SKY, SKY, SKY, SKY, BU1, GRD, GRD],
        [GRD, SKY, SKY, CL0, CL2, SKY, SKY, SKY, SKY, SKY, SKY, BU1, GRD, GRD],
        [GRD, SKY, SKY, SKY, CL3, SKY, SKY, SKY, SKY, SKY, SKY, BU2, GRD, GRD],
        [GRD, SKY, SKY, SKY, SKY, SKY, SKY, SKY, BLQ, SKY, SKY, MT0, GRD, GRD],
        [GRD, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, SKY, MT1, MT3, GRD, GRD],
        [GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD, GRD]
    ];
    private static var materialCache : Array = [];
    private static var shapeData : Object = {};
    private static function createBoxShape() : b2PolygonDef 
    {
        var boxshape : b2PolygonDef = new b2PolygonDef();
        boxshape.SetAsBox(CHARACTER_WIDTH / 2, CHARACTER_WIDTH / 2);
        return boxshape;
    }
    private static function prepareShapeData() :  void 
    {
        var boxshape : b2PolygonDef;
        boxshape = createBoxShape();
        boxshape.friction = .3;
        boxshape.restitution = .7;
        boxshape.density = .5;
        shapeData[BLQ] = boxshape;
        boxshape = createBoxShape();
        boxshape.friction = .4;
        boxshape.restitution = .3;
        boxshape.density = 0;
        shapeData[GRD] = boxshape;
    }
    prepareShapeData();
    public static function getMaterial(mapType : int) : MaterialObject3D 
    {
        if (materialCache[mapType]) return materialCache[mapType];
        materialCache[mapType] = new BitmapMaterial(CharacterGenerator.get(mapType));
        return materialCache[mapType];
    }
    public static function populateScene(scene : DisplayObjectContainer3D, world : b2World) : void 
    {
        for (var xx : int = 0; xx < map.length; xx++) 
        {
            for (var yy : int = 0; yy < map[yy].length; yy++) 
            {
                var mapType : int = map[xx][yy];
                var x : Number = xx * CHARACTER_WIDTH - CHARACTER_WIDTH / 2 - 128;
                var y : Number = -yy * CHARACTER_WIDTH + CHARACTER_WIDTH / 2 + 128;
                var obj : DisplayObject3D;
                if (mapType == GRD || mapType == BLQ) 
                {
                    obj = new Plane(getMaterial(SKY), CHARACTER_WIDTH, CHARACTER_WIDTH);
                    obj.x = x, obj.y = y, obj.z = 0;
                    scene.addChild(obj);
                    obj = new Cube(new MaterialsList({all: getMaterial(mapType)}), CHARACTER_WIDTH, CHARACTER_WIDTH, CHARACTER_WIDTH);
                    obj.x = x, obj.y = y, obj.z = -8;
                    scene.addChild(obj);
                } 
                else 
                {
                    obj = new Plane(getMaterial(mapType), CHARACTER_WIDTH, CHARACTER_WIDTH);
                    obj.x = x, obj.y = y, obj.z = 0;
                    scene.addChild(obj);
                }
                if (shapeData[mapType]) 
                {
                    var boxdef : b2BodyDef = new b2BodyDef();
                    boxdef.position.Set(obj.x, obj.y);
                    var box : b2Body = world.CreateBody(boxdef);
                    box.CreateShape(shapeData[mapType]);
                    box.SetUserData(obj);
                    box.SetMassFromShapes();
                    box.GetLocalCenter().x += Math.random() - .5;
                    box.GetLocalCenter().y += Math.random() - .5;
                }
            }
        }
    }
}