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

ButtonTest10: クイズ機能に3Dも少しからませてみました

ButtonTestつづきです
3Dとの連携をいくつか追加してみました
クイズ画面でクイズに答えるとランド画面で表示される3Dランド区画が増えます
/**
 * Copyright siouxcitizen ( http://wonderfl.net/user/siouxcitizen )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/cX4y
 */

// forked from hacker_7daxapax's ButtonTest09
//ButtonTestつづきです
//3Dとの連携をいくつか追加してみました
//クイズ画面でクイズに答えるとランド画面で表示される3Dランド区画が増えます

package {
    import flash.display.*;
    import flash.events.*;
    import flash.text.*;

    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.objects.primitives.Arrow;
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.objects.DisplayObject3D;

    [SWF(width="500", height="500", backgroundColor="#FFFFFF")]
    public class ButtonTest extends Sprite {
        private var goQuestList01Btn : SimpleButton;//問題リスト1へ遷移ボタン
        private var goQuestList02Btn : SimpleButton;//問題リスト2へ遷移ボタン
        private var goQuestList03Btn : SimpleButton;//問題リスト3へ遷移ボタン
        private var goLandScrnBtn : SimpleButton;//ランド画面への遷移ボタン 

        private var answer01Btn : SimpleButton;//ボタン1 
        private var answer02Btn : SimpleButton;//ボタン2
        private var answer03Btn : SimpleButton;//ボタン3
        private var nextQuestBtn : SimpleButton;//「次の問題へ」ボタン

        private var springDispBtn : SimpleButton;//春ボタン
        private var summerDispBtn : SimpleButton;//夏ボタン
        private var autumnDispBtn : SimpleButton;//秋ボタン
        private var winterDispBtn : SimpleButton;//冬ボタン
        private var goQuestScrnBtn : SimpleButton;//クエスト画面への遷移ボタン
        private var forwardBtn : SimpleButton;//前進ボタン
        private var leftRotBtn : SimpleButton;//左回転ボタン
        private var rightRotBtn : SimpleButton;//右回転ボタン
        private var backwardBtn : SimpleButton;//後退ボタン
        private var bDashBtn : SimpleButton;//Bダッシュボタン
        private var forwardState : Boolean = false; //操作矢印「前進」制御用
        private var backwardState : Boolean = false; //操作矢印「後退」制御用
        private var bDashState : Boolean = false; //操作矢印「Bダッシュ」制御用
        private var leftRotState : Boolean = false; //操作矢印「左回転」制御用
        private var rightRotState : Boolean = false; //操作矢印「右回転」制御用

        private var question : TextField;//問題文テキスト
        private var questionFormat : TextFormat;//問題文テキストフォーマット
        private var judge : TextField;//判定文テキスト
        private var judgeFormat : TextFormat;//判定文テキストフォーマット
        
        private var target : CustomButton;  //マウスイベントでターゲット情報取得用
        private var questionNo : int = 0;  //問題番号
        private var questionArray : Array;  //問題保持用配列 
        private var answerArray : Array;  //解答保持用配列 

        private var answerCnt : int = 0;  //解答回数
        private var atariCnt : int = 0;  //当たり回数
        private var hazureCnt : int = 0;  //ハズレ回数
        private var answered : Boolean = false;  //解答チェック 1度も解答せずに次問題に遷移した場合はハズレ回数をカウントアップ
        private var atariLock : Boolean = false;  //「当たり」ボタン連続押下による当たり回数アップを禁止 「ハズレ」は何回でも可
        private var questSet01Clear : Boolean = false;  //問題セット1の正答率100%達成チェック
        private var questSet02Clear : Boolean = false;  //問題セット2の正答率100%達成チェック
        private var questSet03Clear : Boolean = false;  //問題セット3の正答率100%達成チェック
        private var questSet : int = 1;  //問題セット番号 デフォルト1
        private var topMenuTxt : String;  //問題セット番号 デフォルト1
        private var landAmount : int = 4;  //取得済土地

        private var txtField:Object=new Object(); //テキストフィールド用
        private var txtFormat:Object=new Object();//テキストフォーマット用

        private var screenId : int = 0;  //0:クエスト画面 1:ランド画面
        private const QUEST_SCREEN_ID : int = 0;  //クエスト画面ID
        private const LAND_SCREEN_ID : int = 1;  //ランド画面ID

        //3D表示用
        private var container : Sprite;
        private var viewport  : Viewport3D;
        private var scene     : Scene3D;
        private var camera    : Camera3D;
        private var material  : ColorMaterial;
        private var planeObj  : Plane; 
        private var renderer  : BasicRenderEngine;
        private var planeUnitSize : int = 300;//Planeオブジェクト1辺の長さ
        private var segment   : int = 1;  //面の分割数

        private var materialList:MaterialsList = new MaterialsList();

        private var arrow : Arrow //操作用オブジェクト
        private var crystalBoxCube : Cube //透明キューブ 飾り用クリスタル役

        private var cameraPitch: int = 90; //カメラのX軸回転の値 
        private var cameraYaw : int = 270; //カメラのY軸回転の値 
        private var cameraDistStat: int = 1; //カメラ設置場所の距離種類 0~2 

        //ランド表示管理用配列初期化
        private var landMap : Array =    [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                                          [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                                         ];                 

        public function ButtonTest() {
            //クエスト画面を初期化
            initQuestScrnBtn();

            //情報表示用テキストフィールドを初期化
            txtFieldInit();

            //問題リスト画面を初期化
            initQuestListScrnBtn();

            //ランド画面用3D空間を初期化
            init3DSpace();
            //ランド画面を初期化
            initLandScrnBtn();

            dispTopMenuTxt();
        }

        public function dispTopMenuTxt():void {
            addChild(txtField["clearInfo"]); //問題表示テキストフィールドを設定
            constTopMenuTxt();
            editLabel("clearInfo", topMenuTxt);
        }
        public function removeTopMenuTxt():void {
            editLabel("clearInfo", "");
            removeChild(txtField["clearInfo"]); //問題表示テキストフィールドを設定
        }

        public function constTopMenuTxt():void {
            topMenuTxt = "";
            topMenuTxt = "問題リスト1: ";
            if (questSet01Clear == true) {topMenuTxt += "クリア!土地12ランドげっと\n";} 
            else {topMenuTxt += "正答率100%未達成\n";}
            topMenuTxt += "問題リスト2: ";
            if (questSet02Clear == true) {topMenuTxt += "クリア!土地20ランドげっと\n";} 
            else {topMenuTxt += "正答率100%未達成\n";}
            topMenuTxt += "問題リスト3: ";
            if (questSet03Clear == true) {topMenuTxt += "クリア!土地28ランドげっと\n";} 
            else {topMenuTxt += "正答率100%未達成\n";}
            topMenuTxt += "取得済土地: " +  landAmount + "ランド";
        }
//■■■問題(クエスト)画面ボタン初期化スタート■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        //問題(クエスト)画面ボタンを初期化する
        public function initQuestScrnBtn():void {
            //問題(クエスト)画面ボタン設定
            goQuestList01Btn = new CustomButton("問題リスト1");
            goQuestList01Btn.x = 350;
            goQuestList01Btn.y = 50;
            goQuestList02Btn = new CustomButton("問題リスト2");
            goQuestList02Btn.x = 350;
            goQuestList02Btn.y = 80;
            goQuestList03Btn = new CustomButton("問題リスト3");
            goQuestList03Btn.x = 350;
            goQuestList03Btn.y = 110;
            goLandScrnBtn = new CustomButton("ランド画面");
            goLandScrnBtn.x = 350;
            goLandScrnBtn.y = 280;

            goQuestList01Btn.addEventListener(MouseEvent.MOUSE_DOWN,goQuestList01BtnDown);
            goQuestList02Btn.addEventListener(MouseEvent.MOUSE_DOWN,goQuestList02BtnDown);
            goQuestList03Btn.addEventListener(MouseEvent.MOUSE_DOWN,goQuestList03BtnDown);
            goLandScrnBtn.addEventListener(MouseEvent.MOUSE_DOWN,goLandScrnBtnDown);

            addChild(goQuestList01Btn);
            addChild(goQuestList02Btn);
            addChild(goQuestList03Btn);
            addChild(goLandScrnBtn);
        }
        //問題(クエスト)画面ボタンを非表示にする
        public function hideQuestScrnBtn():void {
            goQuestList01Btn.visible = false;
            goQuestList02Btn.visible = false;
            goQuestList03Btn.visible = false;
            goLandScrnBtn.visible = false;
        }
        //問題(クエスト)画面ボタンを再表示する
        public function dispQuestScrnBtn():void {
            goQuestList01Btn.visible = true;
            goQuestList02Btn.visible = true;
            goQuestList03Btn.visible = true;
            goLandScrnBtn.visible = true;
        }
//■■■問題画面ボタン初期化エンド■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

        //テキストフィールドの初期化処理
        private function txtFieldInit():void{
            //テキストフィールド(ラベル)の生成
            txtField["clearInfo"]=Util.makeTxtField(60,50,300,170);//問題文表示用のテキストを設定
            txtField["question"]=Util.makeTxtField(10,10,300,170);//問題文表示用のテキストを設定
            txtField["judge"]=Util.makeTxtField(55,170,400,200);//解答判定文表示用のテキストを設定
            txtField["landScrnInfo"]=Util.makeTxtField(50,50,250,200);//デベロップ情報表示用のテキストを設定

            //テキストフォーマットの生成
            txtFormat["clearInfo"]=Util.makeTextFormat(15,0x000000);
            txtFormat["question"]=Util.makeTextFormat(15,0x000000);
            txtFormat["judge"]=Util.makeTextFormat(15,0x000000);
            txtFormat["landScrnInfo"]=Util.makeTextFormat(15,0x000000);
        }

        //テキストフィールドの編集
        private function editLabel(key:String,text:String):void {
            txtField[key].text=text;
            txtField[key].setTextFormat(txtFormat[key]);        
        }

//■■■問題リスト画面ボタン初期化スタート■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        //問題リスト画面ボタンを初期化する
        public function initQuestListScrnBtn():void {
            //解答ボタン設定
            answer01Btn = new CustomButton("1",1);
            answer01Btn.x = 350;
            answer01Btn.y = 50;
            answer02Btn = new CustomButton("2",2);
            answer02Btn.x = 350;
            answer02Btn.y = 80;
            answer03Btn = new CustomButton("3",3);
            answer03Btn.x = 350;
            answer03Btn.y = 110;

            answer01Btn.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
            answer02Btn.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
            answer03Btn.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
            
            addChild(answer01Btn);
            addChild(answer02Btn);
            addChild(answer03Btn);
            
            //「次の問題へ」ボタン設定
            nextQuestBtn = new CustomButton("次の問題へ",1);
            nextQuestBtn.x = 350;
            nextQuestBtn.y = 150;
            nextQuestBtn.addEventListener(MouseEvent.MOUSE_DOWN,nextQuestBtnDown);
            addChild(nextQuestBtn);

            //クエスト画面に遷移するまでボタンを非表示
            hideQuestListScrnBtn();
        }
        //問題リスト画面ボタンを非表示
        private function hideQuestListScrnBtn():void {
            answer01Btn.visible = false;
            answer02Btn.visible = false;
            answer03Btn.visible = false;
            nextQuestBtn.visible = false;
        }
        //問題リスト画面ボタンを再表示
        private function dispQuestListScrnBtn():void {
            answer01Btn.visible = true;
            answer02Btn.visible = true;
            answer03Btn.visible = true;
            nextQuestBtn.visible = true;
        }
//■■■問題リスト画面ボタン初期化エンド■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

//■■■ランド画面ボタン初期化スタート■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        //ランド画面ボタンを初期化する
        public function initLandScrnBtn():void {
            springDispBtn = new CustomButton("春色?");
            springDispBtn.x = 350;
            springDispBtn.y = 50;
            summerDispBtn = new CustomButton("夏色?");
            summerDispBtn.x = 350;
            summerDispBtn.y = 80;
            autumnDispBtn = new CustomButton("秋色?");
            autumnDispBtn.x = 350;
            autumnDispBtn.y = 110;
            winterDispBtn = new CustomButton("冬色?");
            winterDispBtn.x = 350;
            winterDispBtn.y = 140;

            springDispBtn.addEventListener(MouseEvent.MOUSE_DOWN,onSpringDispBtnDown);
            summerDispBtn.addEventListener(MouseEvent.MOUSE_DOWN,onSummerDispBtnDown);
            autumnDispBtn.addEventListener(MouseEvent.MOUSE_DOWN,onAutumnDispBtnDown);
            winterDispBtn.addEventListener(MouseEvent.MOUSE_DOWN,onWinterDispBtnDown);
            
            addChild(springDispBtn);
            addChild(summerDispBtn);
            addChild(autumnDispBtn);
            addChild(winterDispBtn);

            //「クエスト画面」ボタン設定
            goQuestScrnBtn = new CustomButton("クイズ画面");
            goQuestScrnBtn.x = 350;
            goQuestScrnBtn.y = 280;
            goQuestScrnBtn.addEventListener(MouseEvent.MOUSE_DOWN,goQuestScrnBtnDown);
            addChild(goQuestScrnBtn);

            forwardBtn = new CustomButton("前進");
            forwardBtn.x = 200;
            forwardBtn.y = 310;
            leftRotBtn = new CustomButton("左回転");
            leftRotBtn.x = 90;
            leftRotBtn.y = 340;
            bDashBtn = new CustomButton("Bダッシュ");
            bDashBtn.x = 200;
            bDashBtn.y = 340;
            rightRotBtn = new CustomButton("右回転");
            rightRotBtn.x = 310;
            rightRotBtn.y = 340;
            backwardBtn = new CustomButton("後退");
            backwardBtn.x = 200;
            backwardBtn.y = 370;
            forwardBtn.addEventListener(MouseEvent.MOUSE_DOWN,onForwardBtnDown);
            forwardBtn.addEventListener(MouseEvent.MOUSE_UP,onForwardBtnUp);
            leftRotBtn.addEventListener(MouseEvent.MOUSE_DOWN,onLeftRotBtnDown);
            leftRotBtn.addEventListener(MouseEvent.MOUSE_UP,onLeftRotBtnUp);
            bDashBtn.addEventListener(MouseEvent.MOUSE_DOWN,onBDashBtnDown);
            bDashBtn.addEventListener(MouseEvent.MOUSE_UP,onBDashBtnUp);
            rightRotBtn.addEventListener(MouseEvent.MOUSE_DOWN,onRightRotBtnDown);
            rightRotBtn.addEventListener(MouseEvent.MOUSE_UP,onRightRotBtnUp);
            backwardBtn.addEventListener(MouseEvent.MOUSE_DOWN,onBackwardBtnDown);
            backwardBtn.addEventListener(MouseEvent.MOUSE_UP,onBackwardBtnUp);
            addChild(forwardBtn);
            addChild(leftRotBtn);
            addChild(bDashBtn);
            addChild(rightRotBtn);
            addChild(backwardBtn);

            //ランド画面に遷移するまでボタンを非表示
            hideLandScrnBtn();
        }
        //ランド画面ボタンを非表示
        private function hideLandScrnBtn():void {
            springDispBtn.visible = false;
            summerDispBtn.visible = false;
            autumnDispBtn.visible = false;
            winterDispBtn.visible = false;
            goQuestScrnBtn.visible = false;
            forwardBtn.visible = false;
            leftRotBtn.visible = false;
            rightRotBtn.visible = false;
            backwardBtn.visible = false;
            bDashBtn.visible = false;
        }
        //ランド画面ボタンを再表示
        private function dispLandScrnBtn():void {
            springDispBtn.visible = true;
            summerDispBtn.visible = true;
            autumnDispBtn.visible = true;
            winterDispBtn.visible = true;
            goQuestScrnBtn.visible = true;
            forwardBtn.visible = true;
            leftRotBtn.visible = true;
            rightRotBtn.visible = true;
            backwardBtn.visible = true;
            bDashBtn.visible = true;
        }
//■■■ランド画面ボタン初期化エンド■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

//■■■3D空間を初期化スタート■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        //3D空間を初期化
        private function init3DSpace():void {
            //ビューポート生成
            viewport = new Viewport3D(500, 500, false, true);
            addChild(viewport);

            //シーン生成
            scene = new Scene3D();

            //レンダリングエンジン生成
            renderer = new BasicRenderEngine();

             //カメラ設定
            camera = new Camera3D();
            camera.y = 200;
            camera.target = DisplayObject3D.ZERO;

            //最初のクエスト画面用に3Dオブジェクト初期化
            var tempBlueColorMaterial : ColorMaterial = new ColorMaterial(0x0000EE, 0.5);
            tempBlueColorMaterial.doubleSided = true;
            var tempRedColorMaterial : ColorMaterial = new ColorMaterial(0xEE0000, 0.5);
            tempRedColorMaterial.doubleSided = true;
            var tempGreenColorMaterial : ColorMaterial = new ColorMaterial(0x00EE00, 0.5);
            tempGreenColorMaterial.doubleSided = true;
            materialList.addMaterial(tempRedColorMaterial, "front");
            materialList.addMaterial(tempBlueColorMaterial, "back");
            materialList.addMaterial(tempGreenColorMaterial, "right");
            materialList.addMaterial(tempBlueColorMaterial, "left");
            materialList.addMaterial(tempRedColorMaterial, "top");
            materialList.addMaterial(tempGreenColorMaterial, "bottom");
            //飾り用3Dクリスタル表示
            crystalBoxCube = new Cube(materialList, 350, 350, 350);
            scene.addChild(crystalBoxCube);

            //マウスイベント処理用リスナを設定
            stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        }
//■■■イベント処理スタート■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        //イベント処理
        private function onEnterFrame(e:Event):void{
            if (screenId == QUEST_SCREEN_ID) {
		crystalBoxCube.rotationX = viewport.mouseY; //飾り用クリスタルの座標をマウス座標から設定
		crystalBoxCube.rotationY = viewport.mouseX; //飾り用クリスタルの座標をマウス座標から設定
                setCameraForQuestScrn(); //カメラ視点設定
                renderer.renderScene(scene, camera, viewport);
            } else if (screenId == LAND_SCREEN_ID) {
                calcArrowPos(); //操作用矢印座標を設定
                setCameraForLandScrn(); //カメラ視点設定
                renderer.renderScene(scene, camera, viewport);
            }
        }
        //ランド画面の操作用矢印座標を設定
        private function calcArrowPos():void{
            if (forwardState == true) {//前進
                arrow.moveForward(30);
            } else if (backwardState == true) {//後退
                arrow.moveForward(-15);
            } else if (leftRotState == true) {//左回転
                arrow.rotationY -= 10;
            } else if (rightRotState == true) {//右回転
                arrow.rotationY += 10;
            } else if (bDashState == true) {//Bダッシュ
                arrow.moveForward(60);
            }
        }
        //クエスト画面用カメラ視点設定
        private function setCameraForQuestScrn():void{
            var cameraDist : int = -1000; //デフォルトの距離、ステータスは1
            camera.x=cameraDist*Math.cos((90-crystalBoxCube.rotationY)*Math.PI/180)+crystalBoxCube.x;  
            camera.z=cameraDist*Math.sin((90-crystalBoxCube.rotationY)*Math.PI/180)+crystalBoxCube.z;
            camera.target.x=crystalBoxCube.x;
            camera.target.y=crystalBoxCube.y;
            camera.target.z=crystalBoxCube.z;
            cameraPitch = 90; //カメラのX軸回転の値 
            cameraYaw = 270; //カメラのY軸回転の値
            camera.orbit(cameraPitch, cameraYaw, true, crystalBoxCube);
        }
        //ランド画面用カメラ視点設定
        private function setCameraForLandScrn():void{
            var cameraDist : int = -1000; //デフォルトの距離、ステータスは1
            if (cameraDistStat == 0) {
                cameraDist = -500;
            } else if (cameraDistStat == 1) {
                cameraDist = -1000;
            } else if (cameraDistStat == 2) {
                cameraDist = -1500;
            }
            camera.x=cameraDist*Math.cos((90-arrow.rotationY)*Math.PI/180)+arrow.x;  
            camera.z=cameraDist*Math.sin((90-arrow.rotationY)*Math.PI/180)+arrow.z;
            camera.target.x=arrow.x;
            camera.target.y=arrow.y;
            camera.target.z=arrow.z;
            camera.orbit(cameraPitch, cameraYaw, true, arrow);
        }
        //キーボードイベント処理(押下時処理)
        private function onKeyDown(event:KeyboardEvent):void{
            if (screenId == QUEST_SCREEN_ID) {return;} //クエスト画面の場合は何も処理を行わない

            //Aボタン 操作オブジェクトを中心にカメラを左回り回転(Y軸回転)
            //4度づつ左回り回転  
            if (event.keyCode == 65) {
                cameraYaw = cameraYaw - 4;
                if(cameraYaw < 0) {cameraYaw = 360;}
            //Dボタン 操作オブジェクトを中心にカメラを右回り回転(Y軸回転)    
            //4度づつ右回り回転
            } else if (event.keyCode == 68) {
                cameraYaw = cameraYaw + 4;
                if(cameraYaw > 360) {cameraYaw = 0;}
            //Wボタン 操作オブジェクトを中心にカメラを上下移動(X軸回転)
            } else if (event.keyCode == 87) {        
                if(cameraPitch > 50) {cameraPitch = cameraPitch - 10;}
            //Sボタン 操作オブジェクトを中心にカメラを上下移動(X軸回転)
            } else if (event.keyCode == 83) {           
                if(cameraPitch < 100) {cameraPitch = cameraPitch + 10;}
            //Fボタン カメラと操作オブジェクトの距離を変更
            } else if (event.keyCode == 70) {
                cameraDistStat -= 1;
                if(cameraDistStat < 0) {cameraDistStat = 2;}
            //Rボタン カメラの設定をデフォルトにもどす
            } else if (event.keyCode == 82) {
                cameraDistStat = 1;
                cameraPitch = 90; //カメラのX軸回転の値 
                cameraYaw = 270; //カメラのY軸回転の値
            }
        }
//■■■イベント処理エンド■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■3D空間を初期化エンド■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

//■■■ボタン処理スタート■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■■■クエスト関連ボタン処理スタート■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        //トップメニュー画面からレベル1問題セット画面に遷移する
        private function goQuestList01BtnDown(evt:MouseEvent):void {
            questSet = 1;
            hideQuestScrnBtn(); //トップメニューボタンを隠す
            removeTopMenuTxt();
            addChild(txtField["question"]); //問題表示テキストフィールドを設定
            addChild(txtField["judge"]); //解答結果表示テキストフィールドを設定
            dispQuestListScrnBtn(); //解答選択肢ボタンを表示する

            questionArray = new Array(); //問題保持用配列の初期化
            answerArray = new Array(); //解答保持用配列の初期化
            questionArray.push("日本の主食は?\n1、米\n2、パン\n3、めん\n");
            answerArray.push(1);

            initQuestion();//問題を初期化
        }

        //トップメニュー画面からレベル2問題セット画面に遷移する
        private function goQuestList02BtnDown(evt:MouseEvent):void {
            questSet = 2;
            hideQuestScrnBtn(); //トップメニューボタンを隠す
            removeTopMenuTxt();
            addChild(txtField["question"]); //問題表示テキストフィールドを設定
            addChild(txtField["judge"]); //解答結果表示テキストフィールドを設定
            dispQuestListScrnBtn(); //解答選択肢ボタンを表示する

            questionArray = new Array(); //問題保持用配列の初期化
            answerArray = new Array(); //解答保持用配列の初期化
            questionArray.push("世界3大穀物は小麦ととうもろこしと何?\n1、とうもろこし\n2、小麦\n3、米\n");
            answerArray.push(3);
            questionArray.push("日本酒の原料となるのは?\n1、米\n2、とうもろこし\n3、いも\n");
            answerArray.push(1);
            questionArray.push("米菓(せんべい・おかき・あられ)の原料は?\n1、米\n2、大豆\n3、大麦\n");
            answerArray.push(1);
            questionArray.push("もちはなにから作られる?\n1、米\n2、とうもろこし\n3、小麦\n");
            answerArray.push(1);
            questionArray.push("米料理ではないものは?\n1、おかゆ\n2、ぞうすい\n3、コーンスープ\n");
            answerArray.push(3);

            initQuestion();//問題を初期化
        }

        //トップメニュー画面からレベル3問題セット画面に遷移する
        private function goQuestList03BtnDown(evt:MouseEvent):void {
            questSet = 3;
            hideQuestScrnBtn(); //トップメニューボタンを隠す
            removeTopMenuTxt();
            addChild(txtField["question"]); //問題表示テキストフィールドを設定
            addChild(txtField["judge"]); //解答結果表示テキストフィールドを設定
            dispQuestListScrnBtn(); //解答選択肢ボタンを表示する

            questionArray = new Array(); //問題保持用配列の初期化
            answerArray = new Array(); //解答保持用配列の初期化
            questionArray.push("コメが原料となるエネルギーは?\n1、バイオエタノール\n2、天然ガス\n3、ウラン\n");
            answerArray.push(1);
            questionArray.push("コメが原料となる素材は?\n1、バイオプラスチック\n2、鉄鉱石\n3、レアメタル\n");
            answerArray.push(1);
            questionArray.push("コメの青カビからできた薬は?\n1、スタチン\n2、風邪薬\n3、工業糊\n");
            answerArray.push(1);
            questionArray.push("米粉が原料とならないものは?\n1、パン\n2、めん\n3、米\n");
            answerArray.push(3);
            questionArray.push("飼料に使われないのは?\n1、米\n2、とうもろこし\n3、汚染米\n");
            answerArray.push(3);

            initQuestion();//問題を初期化
        }

        //配列から問題を取り出して問題を初期化
        private function initQuestion():void {
            //問題文テキスト設定
            var questTxt : String = "問題 " + (questionNo+1) + "\n"
                          + "\n" 
                          + questionArray[questionNo];
            editLabel("question", questTxt);
            atariLock = false;//次問題のために当たり回数カウントアップができるようにする
        }

        //マウスダウンイベントの処理
        private function onMouseDown(evt:MouseEvent):void {
            if (questionNo > (questionArray.length-1)) return;//全問終了後は処理を行わない
            var judgeTxt : String;
            answered = true; //解答(解答ボタンがクリック)された場合はtrueを設定
            target = CustomButton(evt.currentTarget);
            //当たりボタンは1問につき1回しかカウントされない
            if (target.getBtnNo() == answerArray[questionNo]) {
                judgeTxt = "当たり";
                if (atariLock == false) {//同一問題の「当たり」ボタン連続押下時の当たり回数カウントアップを禁止
                    answerCnt++;//解答回数をカウントアップ
                    atariCnt++;//当たり回数をカウントアップ
                    atariLock = true;
                }
            //ハズレボタン押下時は何度でもカウントアップされる
            } else {
                answerCnt++;//解答回数をカウントアップ
                judgeTxt = "ハズレ";
                hazureCnt++;//ハズレ回数をカウントアップ
            }
            editLabel("judge", judgeTxt);
        }

        //「次の問題へ」ボタンのマウスダウンイベントの処理
        private function nextQuestBtnDown(evt:MouseEvent):void {
            if (questionNo > (questionArray.length-1)) return;//全問終了後は処理を行わない
            if (answered == false) { //前問題が一度も回答されなかった場合は自動で解答回数とハズレ回数をカウントアップ
                answerCnt++;
                hazureCnt++;
            }
            answered = false; //次問題のために初期化

            if (questionNo < (questionArray.length-1)) {
                questionNo++; //次問題へ遷移するためにカウントアップ
                editLabel("question", "");
                editLabel("judge", "");
                initQuestion();            
            } else {
                questionNo++; //終了処理のためにカウントアップ
                editLabel("question", "");
                endQuestion();
                nextQuestBtn.removeEventListener(MouseEvent.MOUSE_DOWN,nextQuestBtnDown); //「次の問題へ」ボタンのイベントリスナ無効化
                nextQuestBtn.addEventListener(MouseEvent.MOUSE_DOWN,onNextBtnDownToTop); //「次の問題へ」ボタンにトップ画面遷移イベントリスナ設定
            }
        }

        //「次の問題へ」ボタンの問題セット終了時マウスダウンイベントの処理(問題画面→トップメニュー画面)
        private function onNextBtnDownToTop(evt:MouseEvent):void {
            answerCnt = 0; //解答回数の初期化
            hazureCnt = 0; //ハズレ回数の初期化
            atariCnt = 0; //当たり回数の初期化
            questionNo = 0; //問題番号の初期化
            nextQuestBtn.removeEventListener(MouseEvent.MOUSE_DOWN,onNextBtnDownToTop); //「次の問題へ」ボタンのトップ画面遷移イベントリスナを無効化
            nextQuestBtn.addEventListener(MouseEvent.MOUSE_DOWN,nextQuestBtnDown); //「次の問題へ」ボタンに基本機能の問題遷移イベントリスナを設定
            hideQuestListScrnBtn(); //問題画面ボタンを非表示
            dispQuestScrnBtn(); //トップメニュー画面のボタンを表示
            editLabel("question", "");  //表示文字列初期化
            editLabel("judge", "");  //表示文字列初期化
            removeChild(txtField["question"]); //トップメニューのボタンオブジェクトと重ならないようremoveする
            removeChild(txtField["judge"]); //トップメニューのボタンオブジェクトと重ならないようremoveする
            dispTopMenuTxt();
        }
//■■■クエスト関連ボタン処理エンド■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

//■■■画面遷移ボタン処理スタート■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

        //問題(クエスト)画面からランド画面に遷移する
        private function goLandScrnBtnDown(evt:MouseEvent):void {
            hideQuestScrnBtn(); //トップメニューボタンを隠す
            dispLandScrnBtn(); //デベロップ画面(作物増減ボタン)を表示する
            removeTopMenuTxt();
scene.removeChild(crystalBoxCube);
addLandMap();
screenId = LAND_SCREEN_ID;
            addChild(txtField["landScrnInfo"]); //デベロップ情報表示テキストフィールドを設定
            setDevelopmentTxt(); //デベロップ情報を設定
        }

        //ランド画面から問題(クエスト)画面に遷移
        private function goQuestScrnBtnDown(evt:MouseEvent):void {
            hideLandScrnBtn(); //問題画面ボタンを非表示
            dispQuestScrnBtn(); //トップメニュー画面のボタンを表示
            removeChild(txtField["landScrnInfo"]); //トップメニューのボタンオブジェクトと重ならないようremoveする
            dispTopMenuTxt(); //トップメニュー画面のテキストを表示
removeLandMap();
crystalBoxCube = new Cube(materialList, 350, 350, 350);
scene.addChild(crystalBoxCube);
screenId = QUEST_SCREEN_ID;
        }

        //ランド画面に3Dオブジェクトをセット
        private function addLandMap():void {
            for (var xIndex:int = 0; xIndex < 10; xIndex++){
	        for (var zIndex:int = 0; zIndex < 10; zIndex++){
                    //3DPlaneオブジェクトの設定
                    if (landMap[xIndex][zIndex] == 1) { //1の場合3DPlaneオブジェクトを設定
                        material = new ColorMaterial( 0xFF9999, 1 );
	                material.doubleSided = true;
	                material.smooth = true;
                        planeObj= new Plane(material, 290, 290, segment, segment); 
	                planeObj.x = -1650 + (300 * xIndex);
	                planeObj.z = 300 * zIndex;
	                planeObj.rotationX += 90;
	                //Planeオブジェクトに名前を割り振り
	                //7行3列の場合の名前例:"planeX7_Z3" 
	                scene.addChild(planeObj, "planeX" + xIndex + "_Z" + zIndex);
                    }
            	}
            }
            arrow = new Arrow(new WireframeMaterial(0x000000));
            arrow.y += 50;
            arrow.x = -300; 
            arrow.z = 1200; 
            scene.addChild(arrow);
        }

        //ランド画面から3Dオブジェクトをリリース
        private function removeLandMap():void {
            //ランドマップ配列1行分の処理
            for (var xIndex:int = 0; xIndex < 10; xIndex++){
                //配列1行分の10列のデータを処理
	        for (var zIndex:int = 0; zIndex < 10; zIndex++){
                    //3DPlaneオブジェクトをリリース
                    if (landMap[xIndex][zIndex] == 1) { //1の場合3DPlaneオブジェクトを画面から削除
                    var tempName:String = "planeX" + xIndex + "_Z" + zIndex;
                    scene.removeChildByName(tempName);
                    }
            	}
            }
            scene.removeChild(arrow);
        }
//■■■画面遷移ボタン処理エンド■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

        //デベロップ情報を設定
        private function setDevelopmentTxt():void {
            var landScrnInfoTxt : String = "取得済土地:" + landAmount + "ランド\n"
                                         + "\n"
                                         + "カメラ視点変更\n"
                                         + "Wボタン:カメラ視点アップ" + "\n"
                                         + "Sボタン:カメラ視点ダウン" + "\n"
                                         + "Aボタン:カメラ視点左回転" + "\n"
                                         + "Sボタン:カメラ視点右回転" + "\n"
                                         + "Fボタン:カメラ距離変更" + "\n";
            editLabel("landScrnInfo",landScrnInfoTxt);
        }
        
        private var seasonMaterial : ColorMaterial; //4季色保持用マテリアル
        //春色マテリアル設定
        private function onSpringDispBtnDown(evt:MouseEvent):void {
            seasonMaterial = new ColorMaterial( 0xFF9999, 1 );
            setSeasonMaterial();
        }
        //夏色マテリアル設定
        private function onSummerDispBtnDown(evt:MouseEvent):void {
            seasonMaterial = new ColorMaterial( 0x00FF00, 1 );
            setSeasonMaterial();
        }
        //秋色マテリアル設定
        private function onAutumnDispBtnDown(evt:MouseEvent):void {
            seasonMaterial = new ColorMaterial( 0xFFFF00, 1 );
            setSeasonMaterial();
        }
        //冬色マテリアル設定
        private function onWinterDispBtnDown(evt:MouseEvent):void {
            seasonMaterial = new ColorMaterial( 0xCCCCCC, 1 );
            setSeasonMaterial();
        }
        //マテリアル設定
        private function setSeasonMaterial():void {
            var tempPlane : Plane;
            for (var xIndex:int = 0; xIndex < 10; xIndex++){
	        for (var zIndex:int = 0; zIndex < 10; zIndex++){
                    //季節色マテリアル設定
                    if (landMap[xIndex][zIndex] == 1) { //
                        tempPlane = (scene.getChildByName("planeX" + xIndex + "_Z" + zIndex)) as Plane;
                        if(tempPlane != null) {
                            tempPlane.material = seasonMaterial;
                        }
                    }
            	}
            }
        }
        //前進ボタン押下時処理設定
        private function onForwardBtnDown(evt:MouseEvent):void {
            forwardState = true;
        }
        //前進ボタンリリース時処理設定
        private function onForwardBtnUp(evt:MouseEvent):void {
            forwardState = false;
        }
        //後退ボタン押下時処理設定
        private function onBackwardBtnDown(evt:MouseEvent):void {
            backwardState = true;
        }
        //後退ボタンリリース時処理設定
        private function onBackwardBtnUp(evt:MouseEvent):void {
            backwardState = false;
        }
        //左回転ボタン押下時処理設定
        private function onLeftRotBtnDown(evt:MouseEvent):void {
            leftRotState = true;
        }
        //左回転ボタンリリース時処理設定
        private function onLeftRotBtnUp(evt:MouseEvent):void {
            leftRotState = false;
        }
        //右回転ボタン押下時処理設定
        private function onRightRotBtnDown(evt:MouseEvent):void {
            rightRotState = true;
        }
        //右回転ボタンリリース時処理設定
        private function onRightRotBtnUp(evt:MouseEvent):void {
            rightRotState = false;
        }
        //Bダッシュボタン押下時処理設定
        private function onBDashBtnDown(evt:MouseEvent):void {
            bDashState = true;
        }
        //Bダッシュボタンリリース時処理設定
        private function onBDashBtnUp(evt:MouseEvent):void {
            bDashState = false;
        }
//■■■ボタン処理エンド■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        //全問終了後の処理
        private function endQuestion():void {
            //全問終了後メッセージ設定
            
            //正答率を計算
            var rate : int = 0;
            if ((answerCnt != 0) && (atariCnt != 0)) {//解答回数と当たり回数がどちらも0でない場合のみ計算
                rate = atariCnt/answerCnt*100;
            }
            //解答結果をテキストフィールドに表示
            var result : String = "\n解答結果\n\n"//問題文テキストへ解答結果を設定
                          + "解答回数: " + answerCnt + "回\n"
                          + "当たり回数: " + atariCnt + "回\n"
                          + "ハズレ回数: " + hazureCnt + "回\n"
                          + "正答率: " + rate + "%\n";
            editLabel("question", result);
            //終了情報をテキストフィールドに表示
            var lastMess : String = "クイズ終了です\nお疲れ様でした\n";//判定文テキストへ設定
            editLabel("judge", lastMess);

            //正答率100%時はその問題セットをクリア
            if (rate == 100) {
                switch (questSet) {
                    case 1:
                        if (questSet01Clear == true) {break;} //すでに一度全問正解した場合は処理せず
                        questSet01Clear = true;
                        landAmount += 12;
                        landMap[3][3] = 1;
                        landMap[3][4] = 1;
                        landMap[3][5] = 1;
                        landMap[3][6] = 1;
                        landMap[4][3] = 1;
                        landMap[5][3] = 1;
                        landMap[4][6] = 1;
                        landMap[5][6] = 1;
                        landMap[6][3] = 1;
                        landMap[6][4] = 1;
                        landMap[6][5] = 1;
                        landMap[6][6] = 1;
                        break;
                    case 2:
                        if (questSet02Clear == true) {break;} //すでに一度全問正解した場合は処理せず
                        questSet02Clear = true;
                        landAmount += 20;
                        landMap[2][2] = 1;
                        landMap[2][3] = 1;
                        landMap[2][4] = 1;
                        landMap[2][5] = 1;
                        landMap[2][6] = 1;
                        landMap[2][7] = 1;
                        landMap[3][2] = 1;
                        landMap[4][2] = 1;
                        landMap[5][2] = 1;
                        landMap[6][2] = 1;
                        landMap[3][7] = 1;
                        landMap[4][7] = 1;
                        landMap[5][7] = 1;
                        landMap[6][7] = 1;
                        landMap[7][2] = 1;
                        landMap[7][3] = 1;
                        landMap[7][4] = 1;
                        landMap[7][5] = 1;
                        landMap[7][6] = 1;
                        landMap[7][7] = 1;
                        break;
                    case 3:
                        if (questSet03Clear == true) {break;} //すでに一度全問正解した場合は処理せず
                        questSet03Clear = true;
                        landAmount += 28;
                        landMap[1][1] = 1;
                        landMap[1][2] = 1;
                        landMap[1][3] = 1;
                        landMap[1][4] = 1;
                        landMap[1][5] = 1;
                        landMap[1][6] = 1;
                        landMap[1][7] = 1;
                        landMap[1][8] = 1;
                        landMap[2][1] = 1;
                        landMap[3][1] = 1;
                        landMap[4][1] = 1;
                        landMap[5][1] = 1;
                        landMap[6][1] = 1;
                        landMap[7][1] = 1;
                        landMap[2][8] = 1;
                        landMap[3][8] = 1;
                        landMap[4][8] = 1;
                        landMap[5][8] = 1;
                        landMap[6][8] = 1;
                        landMap[7][8] = 1;
                        landMap[8][1] = 1;
                        landMap[8][2] = 1;
                        landMap[8][3] = 1;
                        landMap[8][4] = 1;
                        landMap[8][5] = 1;
                        landMap[8][6] = 1;
                        landMap[8][7] = 1;
                        landMap[8][8] = 1;
                        break;
                    default:
                        break;
                }
            }
        }
    }
}
//■■■カスタムボタンクラス■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
import flash.display.*;
import flash.system.*;
import flash.text.*;
//カスタムボタン
class CustomButton extends SimpleButton {
        private var btnName : String = "";//ボタン名
        private var btnNo : int = 0;//ボタン番号
        //コンストラクタ    
        public function CustomButton(label:String="",no:int=0) {
            btnName = label;
            btnNo = no;
            //状態
            upState = makeSprite(label,0x00FF00);
            overState = upState;
            downState = makeSprite(label,0x0000FF);
            hitTestState = upState;
        }
        public function getBtnName():String {
            return btnName;
        }
        public function getBtnNo():int {
            return btnNo;
        }
        //ボタン用スプライト作成
        private function makeSprite(text:String,color:uint):Sprite{
            //ボタン用ラベル作成
            var label : TextField = new TextField();
            label.text = text;
            label.autoSize = TextFieldAutoSize.CENTER;
            label.selectable = false;
            //ボタン用スプライト作成
            var sp:Sprite = new Sprite();
            sp.graphics.beginFill(color);
            sp.graphics.drawRoundRect(0, 0, 100, 20, 15);
            sp.graphics.endFill();
            sp.alpha = 0.8;            
            sp.addChild(label);
            //ラベル用フォーマット設定
            var format:TextFormat=new TextFormat();
            format.font = "Courier New";
            format.bold = true;
            format.size = 13;
            label.setTextFormat(format);
            return sp;
        }
}
//■■■ユーティリティクラス■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.AntiAliasType;
import flash.text.TextFormatAlign;
//ユーティリティ
class Util
{
    //テキストフィールドの生成
    public static function makeTxtField(posX:int,posY:int,width:int,height:int):TextField {
        var label:TextField=new TextField();
        label.selectable=false;
        label.x       =posX;
        label.y       =posY;
        label.width   =width;
        label.height  =height;
        label.antiAliasType=AntiAliasType.ADVANCED;
        return label;
    }
    //テキストフォーマットの生成
    public static function makeTextFormat(size:uint,color:uint,
        align:String=TextFormatAlign.LEFT):TextFormat {
        var format:TextFormat=new TextFormat();
        format.font ="Courier New"; // 等幅フォント
        format.size =size;  
        format.color=color;
        format.bold =true;
        format.align=align;
        return format;
    }
}