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

キャラクターを追尾

crossdomain.xmlを読みに行くのを忘れててハマった
/**
 * Copyright 3f5 ( http://wonderfl.net/user/3f5 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/jBAO
 */

// forked from narutohyper's Alternativa3D 7.5 Template
package {
    import flash.system.Security;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import alternativ7.engine3d.controllers.SimpleObjectController;
    import alternativ7.engine3d.materials.FillMaterial;
    import alternativ7.engine3d.materials.TextureMaterial;
    import alternativ7.engine3d.primitives.Box;
    import alternativ7.engine3d.primitives.Plane;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Vector3D;
    import flash.ui.Keyboard;
    
    
    
    public class NewClass extends Sprite
    {
        private var loader:Loader;

        public function NewClass():void    {
        
            if (stage) load();
            else addEventListener(Event.ADDED_TO_STAGE, load);
        }
        
        private function load(e:Event = null):void {
            Security.loadPolicyFile('http://assets.wonderfl.net/crossdomain.xml');
            var urlReq:URLRequest = new URLRequest('http://assets.wonderfl.net/images/related_images/2/25/2550/2550ef21df943b0f9b07c16a4ffd50f20fe46511');
            loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, init);
            loader.load(urlReq);
        }


        
        private function init(e:Event):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var bitmap:BitmapData = new BitmapData(loader.width,loader.height);
            
            bitmap.draw(loader);
        
            //AlternativaTemplateを使用
            var scene:AlternativaTemplate = new AlternativaTemplate(this);

            addChild(scene.camera.diagram);
        
            
            //床
            var material1:FillMaterial = new FillMaterial(0x0, 1, 0,0x666666);
            
            var plane:Plane = new Plane(2000, 2000, 10, 10);
            plane.setMaterialToAllFaces(material1);
            scene.container.addChild(plane);
            plane.z = 0;
            
            
            //箱のテクスチャ
            var material2:TextureMaterial = new TextureMaterial(bitmap);
            
            //箱
            var box:Box = new Box(100, 100, 100, 1, 1, 1);
            box.setMaterialToAllFaces(material2);
            scene.container.addChild(box);
            box.z = 50;
            box.y = 50;
            
            scene.camera.z = 100;
            scene.cameraController.mouseSensitivity = 0;

            //追尾するオブジェクトを作成
            var chara:Plane = new Plane(100, 100, 2, 2);

            chara.setMaterialToAllFaces(material2);
            
            scene.container.addChild(chara);
            chara.z = 0;
            chara.y = -950;

            //コントローラー。矢印キーでオブジェクトが移動する
            var objectController:YawController = new YawController(stage, chara, 500, 3, 0);

            objectController.bindKey(Keyboard.RIGHT,  SimpleObjectController.ACTION_YAW_LEFT);
            objectController.bindKey(Keyboard.LEFT,  SimpleObjectController.ACTION_YAW_RIGHT);
            objectController.mouseSensitivity = 0;

            // enterFrame時に呼び出される
            scene.onPreRender = function():void {
                objectController.update();
                
                //追尾
                scene.camera.rotationZ = chara.rotationZ;
                scene.camera.x = chara.x - 300 * Math.sin(chara.rotationZ + 180 * Math.PI / 180);
                scene.camera.y = chara.y + 300 * Math.cos(chara.rotationZ + 180 * Math.PI / 180);
                scene.camera.z = 100;
            }
            
            //描画開始
            scene.startRendering();

        }


    }
}


/**
 * BasicTemplate for Alternativa3D 7.5
 * Alternativa3D 7.5を扱いやすくするためのテンプレートです
 * @author narutohyper & clockmaker
 *
 */
import alternativ7.engine3d.containers.BSPContainer;
import alternativ7.engine3d.containers.ConflictContainer;
import alternativ7.engine3d.containers.DistanceSortContainer;
import alternativ7.engine3d.containers.KDContainer;
import alternativ7.engine3d.containers.LODContainer;
import alternativ7.engine3d.controllers.SimpleObjectController;
import alternativ7.engine3d.core.Camera3D;
import alternativ7.engine3d.core.Object3DContainer;
import alternativ7.engine3d.core.View;
import flash.display.DisplayObject;

import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;

import flash.events.Event;

class AlternativaTemplate extends Sprite
{
    /**
     * 子オブジェクトを最適な方法でソートするコンテナ
     * (ConflictContainer)
     */
    public static const CONFLICT:String = 'conflict';
    /**
     * 子オブジェクトをBSP(バイナリ空間分割法)によってソートするコンテナ
     * (BSPContainer)
     */
    public static const BSP:String = 'bsp';
    
    /**
     * 子オブジェクトをカメラからのZ値でソートするコンテナ
     * (DistanceSortContainer)
     */
    public static const ZSORT:String = 'zsort';
    /**
     * KDツリー(http://ja.wikipedia.org/wiki/Kd%E6%9C%A8)によってソートするコンテナ
     * (KDContainer)
     */
    public static const KD:String = 'kd';
    /**
     * detalizationと子オブジェクトの距離でソートするコンテナ(詳細は調査中)
     * (LODContainer)
     */
    public static const LOD:String = 'lod';
    
    /**
     * 3dオブジェクト格納するコンテナインスタンス。
     */
    public var container:Object3DContainer;

    /**
     * ビューインスタンスです。
     */
    public var view:View;
    
    /**
     * カメラインスタンスです。
     */
    public var camera:Camera3D;
    
    /**
     * カメラコントローラーです。
     */
    public var cameraController:SimpleObjectController;
    
    private var _mc:DisplayObjectContainer;
    private var _viewWidth:int;
    private var _viewHeight:int;
    private var _scaleToStage:Boolean;
    private var _containerType:String;
    
    /**
     * 新しい Alternativa3DTemplate インスタンスを作成します。
     * @param    mc
     * @param    containerType
     * @param    viewWidth
     * @param    viewHeight
     * @param    scaleToStage
     */
    public function AlternativaTemplate(mc:DisplayObjectContainer,containerType:String=CONFLICT,viewWidth:int=640, viewHeight:int=480, scaleToStage:Boolean = true)
    {
        
        _mc = mc;
        _mc.addChild(this);

        _containerType = containerType;
        _viewWidth = viewWidth;
        _viewHeight = viewHeight;
        _scaleToStage = scaleToStage;
        
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }


    /**
     * 初期化されたときに実行されるイベントです。
     * 初期化時に実行したい処理をオーバーライドして記述します。
     */
    protected function atInit():void {}


    /**
     * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
     * レンダリング前に実行したい処理をオーバーライドして記述します。
     */
    protected function atPreRender():void {}
    
    /**
     * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
     * レンダリング前に実行したい処理をオーバーライドして記述します。
     */
    private var _onPreRender:Function = function():void{};
    public function get onPreRender():Function { return _onPreRender; }
    public function set onPreRender(value:Function):void
    {
        _onPreRender = value;
    }
    
    /**
     * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
     * レンダリング後に実行したい処理をオーバーライドして記述します。
     */
    protected function atPostRender():void {}
    
    /**
     * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
     * レンダリング後に実行したい処理を記述します。
     */
    private 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
     */
    private function init(e:Event = null):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // entry point
        stage.scaleMode = StageScaleMode.NO_SCALE;
        stage.align = StageAlign.TOP_LEFT;
        stage.quality = StageQuality.HIGH;
        
        //Root objectの作成
        if (_containerType == CONFLICT) {
            container = new ConflictContainer();
        } else if (_containerType == BSP) {
            container = new BSPContainer();
        } else if (_containerType == ZSORT) {
            container = new DistanceSortContainer();
        } else if (_containerType == KD) {
            container = new KDContainer();
        } else if (_containerType == LOD) {
            container = new LODContainer();
        }
        //Viewの作成
        view = new View(stage.stageWidth, stage.stageHeight);
        view.interactive=true;
        _mc.addChild(view);

        //cameraの作成
        camera = new Camera3D();
        camera.view = view;
        camera.x = 0;
        camera.y = -500;
        camera.z = 0;
        container.addChild(camera);
        
        // Camera controller
        cameraController = new SimpleObjectController(stage, camera, 10);
        cameraController.mouseSensitivity = 0;
        cameraController.unbindAll();
        cameraController.lookAtXYZ(0, 0, 0);
        
        onResize();
        stage.addEventListener(Event.RESIZE, onResize);
        
        atInit();
    }
    
    /**
     * @private
     */    
    private function onResize(e:Event = null):void 
    {
        if (_scaleToStage)
        {
            view.width = stage.stageWidth;
            view.height = stage.stageHeight;
        } 
        else
        {
            view.width = _viewWidth;
            view.height = _viewHeight;
        }
    }
    
    /**
     * @private
     */    
    private function onRenderTick(e:Event = null):void 
    {
        atPreRender();
        _onPreRender();
        //cameraController.update();
        camera.render();
        atPostRender();
        _onPostRender();
    }
    
    
}

import alternativ7.engine3d.controllers.SimpleObjectController;
import alternativ7.engine3d.core.Object3D;
import flash.display.InteractiveObject;
import flash.events.KeyboardEvent;
import flash.geom.Vector3D;

/**
 * 上下左右回転を持ったコントローラー
 * @author narutohyper
 */
class YawController extends SimpleObjectController
{
    private var _yawSpeed:Number= 1.5;
    private var _pitchSpeed:Number = 2;
        
    private var _target:Object3D;
    private var _pitchDown:Boolean;
    private var _pitchUp:Boolean;
    private var _yawLeft:Boolean;
    private var _yawRight:Boolean;
    
    
    public function YawController(eventSource:InteractiveObject, object:Object3D, speed:Number, speedMultiplier:Number = 3, mouseSensitivity:Number = 1)
    {
            _target=object;
            super(eventSource, object, speed, speedMultiplier, mouseSensitivity);

    }

    
    override public function bindKey(keyCode:uint, action:String): void {
        switch (action) {
            case ACTION_YAW_LEFT:
                    keyBindings[keyCode]=yawLeft;
            break;
            case ACTION_YAW_RIGHT:
                    keyBindings[keyCode]=yawRight;
            break;
            case ACTION_PITCH_DOWN:
                    keyBindings[keyCode]=pitchDown;
            break;
            case ACTION_PITCH_UP:
                    keyBindings[keyCode]=pitchUp;
            break;
        }
        super.bindKey(keyCode, action);
    }
    
    
    public function pitchDown(value:Boolean):void {
        _pitchDown=value;
    }
    public function pitchUp(value:Boolean):void {
        _pitchUp=value;
    }
    public function yawLeft(value:Boolean,near:Boolean=false):void {
        _yawLeft = value;
    }
    public function yawRight(value:Boolean,near:Boolean=false):void {
        _yawRight = value;
    }
    
    
    override public function update(): void {
        //現在のVector3D
        var nowVector:Vector3D=new Vector3D(_target.x,_target.y,_target.z);
        if (_yawLeft) {
             _target.rotationZ = (((_target.rotationZ / Math.PI * 180) - _yawSpeed) % 360) *    Math.PI/180;
        } else if (_yawRight) {
             _target.rotationZ = (((_target.rotationZ / Math.PI * 180) + _yawSpeed) % 360) *    Math.PI/180;
        }
        
        if (_pitchDown) {
             _target.rotationX=(((_target.rotationX / Math.PI * 180) + _pitchSpeed) % 360) *    Math.PI/180;
        }
        if (_pitchUp) {
             _target.rotationX=(((_target.rotationX / Math.PI * 180) - _pitchSpeed) % 360) *    Math.PI/180;
        }
        
        updateObjectTransform()
        super.update();
    
    }
    
    
    public function set yawSpeed(value:Number):void {
        _yawSpeed = value*Math.PI/180;
    }
    
    public function set pitchSpeed(value:Number):void
    {
        _pitchSpeed = value*Math.PI/180;
    }
        
        
}