完成:マップ移動

by Nowloading_
なぜ移動可能なマスを表示するたびに透過度が高くなるんだ!('A`)ヴァーウゼー→移動可能マスを格納するmasu:DO3Dのコンストラクタを生成するたびに作るようにしたら解決した。

左上の四角クリックで移動可能なマスが出て、移動可能なマスをクリックすると球体がそこに移動します。

一回移動した後に、異動後の座標から移動可能マスを再計算して表示→移動としたいが、まだ未実装。
♥0 | Line 132 | Modified 2011-09-23 23:53:49 | MIT License
play

ActionScript3 source code

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

package {
    import flash.display.DisplayObject;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.utils.*;
    import org.papervision3d.materials.special.*;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.view.*;
    import flash.events.*;
    import flash.ui.Keyboard;
    import org.papervision3d.events.*;

    [SWF(backgroundColor = 0x000000)]
    public class mf extends BasicView {
        //Field格納用オブジェクト
        private var field:DisplayObject3D;
        
        //地形参照用配列
        //0=green,1=brown, 2=blue
        private var uField:Array = [[0,0,0,1,1],
                                    [0,0,1,2,2],
                                    [0,1,2,2,2],
                                   ];
        private var dField:Array = [[1,1,1,1,1],
                                    [1,1,1,1,2],
                                    [1,1,1,2,2],
                                   ];
        //Cube用material,primitive
        private var gr:ColorMaterial = new ColorMaterial(0x60ff60);
        private var br:ColorMaterial = new ColorMaterial(0xd0a080);
        private var bl:ColorMaterial = new ColorMaterial(0xd0ddff);
        
        private var g:MaterialsList = new MaterialsList( { all:gr } );
        private var l:MaterialsList = new MaterialsList( { all:br } );
        private var b:MaterialsList = new MaterialsList( { all:bl } );
        private var materials:Array = [g,l,b];
        private var ucube:Cube;
        private var dcube:Cube;
        
        //spher
        private var material:WireframeMaterial= new WireframeMaterial(0xff0000,1);
        //primitives(for Sphere)
        private var sphere:Sphere = new Sphere(material,50);        
        //radiun
        private var rad:int = 0;
        //idou用
        private var mato:idou = new idou();
        private var idou:Array = new Array();
        private var move:int = 2;
        private var zahyou:Array = [1,2];
        private var idoumat:ColorMaterial = new ColorMaterial(0x0000ff,0.3);
        private var idoupl:Plane;
        private var idoumasu:Array = new Array();
        private var masuNo:int = 0;
        private var masu:DisplayObject3D = new DisplayObject3D();

        public function mf() {
            stage.addChild(mato);
            mato.x = 10;
            mato.y = 10;
            super(465,465,true,true);
            idoumat.interactive = true;
            init();
        }
        private function init():void{
            field = new DisplayObject3D;
            scene.addChild(field);
            
            //materialslistの作成
            for(var i:int = 0; i<3; i++){
                for(var j:int = 0; j<5; j++){
                    ucube = new Cube(materials[uField[i][j]],100,100,30);
                    dcube = new Cube(materials[dField[i][j]],100,100,70);
                    
                    ucube.x = dcube.x = -120 + (120*i);
                    ucube.z = dcube.z = -240 + (120*j);
                    ucube.y = 50;
                    field.addChild(ucube,"UCx_"+i+"z_"+j);
                    field.addChild(dcube,"DCx_"+i+"z_"+j);
                }
            }
            
            //Sphereの作成
            scene.addChild(sphere);
            sphere.y = 130;
            material.doubleSided = true;
            sphere.useOwnContainer = true;
            
            camera.y = 700;
            camera.z = -600;
            startRendering();
            //addEventListener(Event.ENTER_FRAME,oEF);
            mato.addEventListener(MouseEvent.CLICK,oMC);
        }
        private function oMC(e:MouseEvent):void{
            for(var mm:int = 0;mm<masuNo; mm++){
                masu.removeChild(idoumasu[mm]);
            }
            zahyou[0] = Math.floor(sphere.x/120)+1;
            zahyou[1] = Math.floor(sphere.z/120)+2;
            idou = [];
            masuNo = 0;
            idoumasu = [];
            for(var i:int = move; i>0; i--){
                //cubes[x±α,z]と[x,z±βの4つ
                idou.push([zahyou[0]-i,zahyou[1]]);
                idou.push([zahyou[0]+i,zahyou[1]]);
                idou.push([zahyou[0],zahyou[1]-i]);
                idou.push([zahyou[0],zahyou[1]+i]);
                if(i>1){
                    for(var j:int = i-1; j>0; j--){
                        //cubes[x±(α-m),z±α]とcubes[x±α,z±(α-m)]の4α個
                        idou.push([zahyou[0]-(i-j),zahyou[1]+j]);
                        idou.push([zahyou[0]-(i-j),zahyou[1]-j]);
                        idou.push([zahyou[0]+(i-j),zahyou[1]+j]);
                        idou.push([zahyou[0]+(i-j),zahyou[1]-j]);
                    }
                }
            }
            masu = new DisplayObject3D();
            for(var k:int = 0; k<idou.length; k++){
                idoupl = new Plane(idoumat,100,100);
                idoupl.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK,oOC);
                idoupl.x = dcube.x = -120 + (120*idou[k][0]);
                idoupl.z = dcube.z = -240 + (120*idou[k][1]);
                idoupl.y = 70;
                idoupl.rotationX = 90;
                idoumasu[masuNo] = idoupl;
                masu.addChild(idoumasu[masuNo]);
                masuNo += 1;
            }
            sphere.alpha = 0.3;
            scene.addChild(masu);
        }
        private function oOC(e:InteractiveScene3DEvent):void{
            sphere.x = e.target.x;
            sphere.z = e.target.z;
            for(var mm:int = 0;mm<masuNo; mm++){
                masu.removeChild(idoumasu[mm]);
            }
            masuNo = 0;
            //scene.removeChild(masu);
            sphere.alpha = 1;
        }
    }
}

import flash.display.Sprite;
class idou extends Sprite{
    public function idou(){
        graphics.lineStyle();
        graphics.beginFill(0xff9999);
        graphics.drawRoundRect(0,0,50,30,10,10);
        graphics.endFill();
    }
}