In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: One Man's Dream (Event's Button)

Alternativa3D を簡単に扱うためのベーシックテンプレート
@author Yasu (clockmaker)
/**
 * Copyright sakusan393 ( http://wonderfl.net/user/sakusan393 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/lP6F
 */

// forked from narutohyper's One Man's Dream (Event's Button)
package {
    import alternativ5.engine3d.materials.FillMaterial;

    import alternativ5.engine3d.primitives.Plane;
    import alternativ5.engine3d.primitives.Cone;
    import alternativ5.engine3d.core.Camera3D;
    import alternativ5.engine3d.core.Object3D;
    import alternativ5.engine3d.core.Mesh;
    import alternativ5.engine3d.core.Surface;
    import alternativ5.engine3d.events.MouseEvent3D
    import alternativ5.engine3d.loaders.*;
    import alternativ5.types.Point3D;
    import alternativ5.types.Texture;
    import alternativ5.utils.*

    import flash.system.LoaderContext;
    import flash.display.StageQuality;
    import flash.display.Sprite;
    import flash.display.BlendMode;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.events.IOErrorEvent;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.media.SoundTransform;
    import flash.utils.describeType;
    import flash.net.URLRequest;
    import flash.system.Security;
    import flash.ui.Mouse;
    import flash.display.Loader;
    
    [SWF(width = 465, height = 465, frameRate = 60,backgroundColor=0xFFE3C8)]
    /**
     * Alternativa3D を簡単に扱うためのベーシックテンプレート
     * @author Yasu (clockmaker)
     */
    public class Main extends Sprite {
        private var test:Number=1
        private var camera:Camera3D
        private var sound:SoundChannel;
        private var soundFactory:Sound = new Sound();
        public function Main():void {
        this.graphics.beginFill(0xFFE3C8);
        this.graphics.drawRect(0,0,465,465);
        
        var url:String = "http://marubayashi.net/archive/sample/secret/chime.mp3";

        var request:URLRequest = new URLRequest(url);
        soundFactory = new Sound();
        soundFactory.addEventListener(Event.COMPLETE, completeHandler);
        soundFactory.load(request);

    }
         private var _handArray:Array;
        private var _handCount:int;
        public function loadHand():void
        {
            Security.loadPolicyFile("http://assets.wonderfl.net/crossdomain.xml");         
            var loader0:Loader = new Loader();
            var loader1:Loader = new Loader();
            
            loader0.load(new URLRequest("http://assets.wonderfl.net/images/related_images/f/fe/fe58/fe58561f3aa5c17f2f7c085624a011bd15aae90e"));
            loader1.load(new URLRequest("http://assets.wonderfl.net/images/related_images/c/cd/cd1d/cd1d53ec46913066792e290f0b53feba25168cf2"));
            loader0.contentLoaderInfo.addEventListener(Event.COMPLETE, handInit);
            loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, handInit);
            loader1.visible = false;
            addChild(loader0).x = addChild(loader1).y = 1000;
            loader0.mouseEnabled = loader1.mouseEnabled = false;
            _handArray = [loader0,loader1];
        }
        
       private function handInit(e:* = null):void
        {
            _handCount++;
            if (_handCount < 2) return;
            Mouse.hide();
            this.addEventListener(Event.ENTER_FRAME, handEnterFrameHandler);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, stageDownHandler);
            stage.addEventListener(MouseEvent.MOUSE_UP, stageUpHandler);
        }
        
        private function stageDownHandler(e:MouseEvent):void 
        {
            _handArray[0].visible = false;
            _handArray[1].visible = true;
        }
        private function stageUpHandler(e:MouseEvent):void 
        {
            _handArray[0].visible = true;
            _handArray[1].visible = false;
        }
        
        private function handEnterFrameHandler(e:Event):void 
        {
            for (var i:int = 0; i < 2; i++)
            {
            _handArray[i].x += (mouseX-_handArray[i].x -5)*.4;
            _handArray[i].y += (mouseY-_handArray[i].y -35)*.4;
            }
        }   
    
    
    

    private function completeHandler(event:Event):void {
            init()
    }
            
        private function init():void{
            stage.quality = StageQuality.HIGH;
            // テンプレートを作成します
            var template:BasicTemplate = new BasicTemplate();
            template.view.interactive = true;
            camera = template.camera
            camera.y = 5000;
            camera.z = 0;
            camera.zoom=0.15
            camera.orthographic=true
            //camera.fov = 45/180*Math.PI;
            addChild(template);
            loadHand();

            var context:LoaderContext = new LoaderContext();
            var loader:LoaderOBJ = new LoaderOBJ();
            loader.addEventListener(Event.COMPLETE, loadCompleteHandler);
            loader.load("http://marubayashi.net/archive/sample/secret/oppai3.obj", context);

            var container:Object3D;
            var oppai:Mesh;
            var body:Mesh;
            var button:Surface;

            function loadCompleteHandler(e:Event):void {

                template.scene.root.addChild(loader.content);
                loader.content.scaleX = loader.content.scaleY = loader.content.scaleZ = 20;

                container = loader.content
                oppai=container.children.toArray()[0]
                //メソッド[Object3D.forEach()]ですべての子Object3Dにアクセスできます

                function test():void {
                    if (this is Mesh) {
                        MeshUtils.removeSingularFaces(Mesh(this));
                        MeshUtils.removeUselessVertices(Mesh(this));
                        MeshUtils.removeIsolatedVertices(Mesh(this));
                        MeshUtils.autoWeldVertices(Mesh(this), 0.01);
                        MeshUtils.autoWeldFaces(Mesh(this), 0.01, 0.001);
                    }
                    //oppai.rotationX=120/180*Math.PI
    
                    //oppai.y=100
                }
                
                button = oppai.surfaces['button'];
                button.addEventListener(MouseEvent3D.CLICK,onClick);
                
                function onClick(e:MouseEvent3D):void {
                    trace('ピンポーン')
                    if (sound) {
                        sound.stop();
                    }
                    sound = soundFactory.play();
                    var transform:SoundTransform = new SoundTransform(1);
                    sound..soundTransform = transform;
                }
                
                
            }


            // Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
            // レンダリング前に実行したい処理を記述します。
            var angle:Number=0
            template.onPreRender = function():void {
                if (oppai) {

                    var rateX:Number = (stage.stageHeight-(mouseY-2))*0.05+60;
                    var rateZ:Number = (mouseX-(stage.stageWidth-2))*0.1+20;
                    
                    oppai.rotationX += (MathUtils.toRadian(rateX)-oppai.rotationX)*0.1;
                    oppai.rotationZ += (MathUtils.toRadian(rateZ)-oppai.rotationZ)*0.1;
                    // カメラの座標を中央に向かせる
                    template.cameraContoller.lookAt(oppai.coords);
                }


            }
        }






            
        
        

    }
}



import alternativ5.engine3d.controllers.CameraController;
import alternativ5.engine3d.core.Camera3D;
import alternativ5.engine3d.core.Object3D;
import alternativ5.engine3d.core.Scene3D;
import alternativ5.engine3d.display.View;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;




/**
 * BasicTemplate for Alternativa3D
 * Alternativa3Dを扱いやすくするためのテンプレートです
 * @author Yasu
 */
class BasicTemplate extends Sprite{
    public var scene:Scene3D;
    public var view:View;
    public var camera:Camera3D;
    public var cameraContoller:CameraController;
    
    private var _viewWidth:int;
    private var _viewHeight:int;
    private var _scaleToStage:Boolean;

    public function BasicTemplate(viewWidth:int=640, viewHeight:int=480, scaleToStage:Boolean = true) {
        _viewWidth = viewWidth;
        _viewHeight = viewHeight;
        _scaleToStage = scaleToStage;
        
        // Creating scene
        scene = new Scene3D();
        scene.splitAnalysis = false; // not analysis for performance
        scene.root = new Object3D();
        
        // Adding camera
        camera = new Camera3D();
        camera.y = -1000;
        scene.root.addChild(camera);
        
        // camera contoller
        cameraContoller = new CameraController(this);
        cameraContoller.camera = camera;
        
        // set view
        view = new View();
        view.camera = camera;
        addChild(view);
        
        // stage
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }
    
    protected function atInit():void {}
    
    private var _onInit:Function = function():void { };
    public function get onInit():Function { return _onInit; }
    public function set onInit(value:Function):void {
        _onInit = value;
    }
    
    protected function atPreRender():void {}
    
    private var _onPreRender:Function = function():void{};
    public function get onPreRender():Function { return _onPreRender; }
    public function set onPreRender(value:Function):void {
        _onPreRender = value;
    }
    
    protected function atPostRender():void {
    }
    
    protected var _onPostRender:Function = function():void{};
    public function get onPostRender():Function { return _onPostRender; }
    public function set onPostRender(value:Function):void {
        _onPostRender = value;
    }
    
    public function startRendering():void {
        addEventListener(Event.ENTER_FRAME, onRenderTick);
    }
    public function stopRendering():void {
        removeEventListener(Event.ENTER_FRAME, onRenderTick);
    }
    
    public function singleRender():void {
        onRenderTick();
    }
    
    private function init(e:Event = null):void {
        stage.scaleMode = StageScaleMode.NO_SCALE;
        stage.align = StageAlign.TOP_LEFT;
        stage.quality = StageQuality.HIGH;

        stage.addEventListener(Event.RESIZE, onResize);
        onResize(null);
        
        startRendering();
        
        atInit();
        _onInit();
        
    }
    
    private function onRenderTick(e:Event = null):void {
        atPostRender();
        _onPostRender();
        scene.calculate();
        atPreRender();
        _onPreRender();
    }
    
    private function onResize(event:Event = null):void {
        if (_scaleToStage) {
            view.width = stage.stageWidth;
            view.height = stage.stageHeight;
        }else {
            view.width = _viewWidth;
            view.height = _viewHeight;
        }
    }
}