Papervision3DTest05 :音ファイル取り込み、人型作成のテスト

by siouxcitizen forked from Papervision3DTest04 :当たり判定テスト (diff: 121)
Sphere(頭部),Cone(胴体部),Cylinder(四肢)オブジェクトによる人型?操作オブジェクトを作成しました
←↑→↓またはA、W、D、Xボタンで操作オブジェクトを移動させます
Coneオブジェクトが紫色のクリスタルもどきに触れるとクリスタルが消えて100ポイント加算されます(クリスタル取得処理)
クリスタルもどきを2つとも取得すると終了となりキー操作を受け付けなくなります
操作オブジェクトの動きにあわせてカメラオブジェクトの視点も移動するようにしました
クリスタル取得時に音が出るようにしました
半透明機能テストのためクリスタルを半透明にしてみました
♥0 | Line 199 | Modified 2009-03-23 08:15:11 | MIT License
play

ActionScript3 source code

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

// forked from hacker_7daxapax's Papervision3DTest04
//Sphere(頭部),Cone(胴体部),Cylinder(四肢)オブジェクトによる人型?操作オブジェクトを作成しました
//←↑→↓またはA、W、D、Xボタンで操作オブジェクトを移動させます
//Coneオブジェクトが紫色のクリスタルもどきに触れるとクリスタルが消えて100ポイント加算されます(クリスタル取得処理)
//クリスタルもどきを2つとも取得すると終了となりキー操作を受け付けなくなります
//操作オブジェクトの動きにあわせてカメラオブジェクトの視点も移動するようにしました
//クリスタル取得時に音が出るようにしました
//半透明機能テストのためクリスタルを半透明にしてみました

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.AntiAliasType;
 
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.objects.primitives.Cone;
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.objects.primitives.Cylinder;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.WireframeMaterial;
    
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.render.BasicRenderEngine;
 
    import flash.media.Sound;
    import flash.net.URLRequest;
    
    import flash.errors.IOError;
    import flash.events.IOErrorEvent;
    
    [SWF(width="500", height="500", frameRate="60", backgroundColor="#0055FF")]
 
    public class CrystalGain extends Sprite
    {
        private var container    : Sprite;
        private var viewport     : Viewport3D;
        private var scene        : Scene3D;
        private var camera       : Camera3D;
        private var planeObj     : Plane; 
        private var sphereObj    : Sphere;//頭部
        private var coneObj      : Cone;//胴体部
        private var cylin01      : Cylinder;//四肢 向かって左側手
        private var cylin02      : Cylinder;//四肢 向かって右側手
        private var cylin03      : Cylinder;//四肢 向かって左側足
        private var cylin04      : Cylinder;//四肢 向かって右側足
        private var crystal01    : Cylinder;
        private var crystal02    : Cylinder;
        private var renderer     : BasicRenderEngine;

        private var textarea : TextField; // テキスト表示部分
        private var planeSize : int = 2000; //Planeオブジェクト1辺の長さ
        private var score : int = 0; //スコア表示用
        private var keyFreeze : Boolean = false; //キー操作凍結を判定

        private var snd : Sound;
        private var req : URLRequest = new URLRequest("http://bokutaikan.web.fc2.com/mp3/crystalgainse.mp3");

        //CrystalGainクラスのコンストラクタ
        public function CrystalGain():void
        {          
            //ビューポート生成
            viewport = new Viewport3D(stage.stageWidth, stage.stageHeight);
            addChild(viewport);

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

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

            //Planeオブジェクト生成
            planeObj= new Plane(new WireframeMaterial(0xFFFF00), planeSize, planeSize, 4, 4);
            planeObj.rotationX = 90;
            scene.addChild(planeObj);
            
            //Sphere(頭部)オブジェクト生成
            sphereObj = new Sphere(new ColorMaterial(0xFF7700), 65, 8, 6);
            sphereObj.y = 450;
            scene.addChild(sphereObj);
            
            //操作用キャラクタを作成
            //Cone(胴体部)オブジェクト生成
            coneObj = new Cone(new ColorMaterial(0xFF0000), 100, 150, 8, 6);
            coneObj.y = 300;
            coneObj.rotationX = 180;
            scene.addChild(coneObj);
            
            //四肢を作成
            //Cylinder(向かって左側の手)オブジェクト生成
            cylin01 = new Cylinder(new ColorMaterial(0xFF7700),20,130);
            cylin01.x = -100;
            cylin01.y = 300;
            cylin01.rotationZ = -20;
            scene.addChild(cylin01);
            //Cylinder(向かって右側の手)オブジェクト生成
            cylin02 = new Cylinder(new ColorMaterial(0xFF7700),20,130);
            cylin02.x = 100;
            cylin02.y = 300;
            cylin02.rotationZ = 20;
            scene.addChild(cylin02);
            //Cylinder(向かって左側の足)オブジェクト生成
            cylin03 = new Cylinder(new ColorMaterial(0xFF7700),30,130);
            cylin03.x = -55;
            cylin03.y = 200;
            //cylin03.rotationZ = -20;
            scene.addChild(cylin03);
            //Cylinder(向かって右側の足)オブジェクト生成
            cylin04 = new Cylinder(new ColorMaterial(0xFF7700),30,130);
            cylin04.x = 55;
            cylin04.y = 200;
            //cylin03.rotationZ = -20;
            scene.addChild(cylin04);
            
            //Cylinderオブジェクト生成(クリスタルもどき*2)
            //右手奥配置クリスタルもどき
            crystal01 = new Cylinder(new ColorMaterial(0xFF00FF, 0.7),50,400);
            crystal01.x = 400;
            crystal01.z = 400;
            crystal01.y = 200;
            scene.addChild(crystal01);
            //左手手前配置クリスタルもどき
            crystal02 = new Cylinder(new ColorMaterial(0xFF00FF, 0.7),50,400);
            crystal02.x = -400;
            crystal02.z = -400;
            crystal02.y = 200;
            scene.addChild(crystal02);
            
            //カメラ設定
            camera = new Camera3D();
            camera.x = coneObj.x;
            camera.y = coneObj.y + 300;
            camera.z = coneObj.z - 1100;
             
            //情報表示用テキストエリアを設定
            setTestarea();
            showInfoText("Score: " + score + " points");
            
            //サウンドオブジェクト生成
            snd = new Sound();
            snd.load(req);
            snd.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
            //snd.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
            
            //イベント処理用リスナを設定
            stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        }

        //フレーム毎の処理
        private function onEnterFrame(e:Event):void{
            renderer.renderScene(scene, camera, viewport);
        }
        
        //キーボード入力処理
        //←↑→↓、A、W、D、Xボタン押下時処理(人型オブジェクト移動処理)
        private function onKeyDown(event:KeyboardEvent):void{
            //「YOU CLEARED!!!」表示後はキー操作を受け付けない
            if (keyFreeze) {return;}
            
            //←ボタンまたはAボタン X軸移動 X座標値増加     
            if ((event.keyCode == 37) || (event.keyCode == 65)) {
                if (sphereObj.x > -950) {
                    sphereObj.x -= 5;
                    coneObj.x -= 5;
                    cylin01.x -= 5;
                    cylin02.x -= 5;
                    cylin03.x -= 5;
                    cylin04.x -= 5;
                    checkCrystalGain();
                }
            //→ボタンまたはDボタン X軸移動 X座標値減少
            } else if ((event.keyCode == 39) || (event.keyCode == 68)) {
                if (sphereObj.x < 950) {
                    sphereObj.x += 5;
                    coneObj.x += 5;
                    cylin01.x += 5;
                    cylin02.x += 5;
                    cylin03.x += 5;
                    cylin04.x += 5;
                    checkCrystalGain();
                }
            //↑ボタンまたはWボタン Z軸移動 Z座標値増加
            } else if ((event.keyCode == 38) || (event.keyCode == 87)) {
                if (sphereObj.z < 950) {
                    sphereObj.z += 5;
                    coneObj.z += 5;
                    cylin01.z += 5;
                    cylin02.z += 5;
                    cylin03.z += 5;
                    cylin04.z += 5;
                    checkCrystalGain();
                }
            //↓ボタンまたはXボタン Z軸移動 Z座標値減少
            } else if ((event.keyCode == 40) || (event.keyCode == 88)) {
                if (sphereObj.z > -950) {
                    sphereObj.z -= 5;
                    coneObj.z -= 5;
                    cylin01.z -= 5;
                    cylin02.z -= 5;
                    cylin03.z -= 5;
                    cylin04.z -= 5;
                    checkCrystalGain();
                }
            }
            
            setCameraTarget();
        }
        
        //クリスタルもどきを取得したか(=円錐部分がクリスタルもどきに触れたか)判定
        private function checkCrystalGain():void{
            //右手奥配置クリスタルもどきに触れたか判定
            //クリスタルもどき表示中かつ触れた場合に、クリスタルもどきを消す(表示を停止)
            if(crystal01.visible && coneObj.hitTestObject(crystal01)) {
                crystal01.visible = false;
                score += 100;
                playSound(); //クリスタル取得時に音を出す
                showInfoText("Score: " + score + " points");
            }
            //左手手前配置クリスタルもどきに触れたか判定
            //クリスタルもどき表示中かつ触れた場合に、クリスタルもどきを消す(表示を停止)
            if(crystal02.visible && coneObj.hitTestObject(crystal02)) {
                crystal02.visible = false;
                score += 100;
                playSound(); //クリスタル取得時に音を出す
                showInfoText("Score: " + score + " points");
            }
            
            //クリスタルもどきが2つとも消された場合の処理
            if(!crystal01.visible && !crystal02.visible) {
                appendText("YOU CLEARED!!!");
                //キー操作を受け付けなくする
                keyFreeze = true;
            }
        }
        
        //情報表示用テキストエリアを設定
        private function setTestarea():void
        {
            var txtFmt:TextFormat = new TextFormat();
            txtFmt.font  = 'Courier New'; // 等幅フォント
            txtFmt.color = '0xFFFFFF';
            txtFmt.size  = 15;

            textarea = new TextField();
            textarea.defaultTextFormat = txtFmt;
            textarea.height = 200;
            textarea.width = 450;
            textarea.multiline = true;
            textarea.antiAliasType = AntiAliasType.ADVANCED;

            addChild(textarea);
        }
        
        //テキストエリアを新しいテキストで置き換え
        private function showInfoText(text:String):void {
            textarea.replaceText(0, textarea.length, text);
        }

        //テキストエリアにすでにあるテキストに新しいテキストを連結する
        private function appendText(text:String):void {
            textarea.replaceText(0, 0, text + "\n");
        }
        
        //カメラのターゲットをセット
        private function setCameraTarget():void {
            camera.x = coneObj.x;
            camera.y = coneObj.y + 300;
            camera.z = coneObj.z - 1100;
        }
        
        //サウンドファイルを実行
        private function playSound():void {
            //サウンドファイルを実行
            snd.play();
        }
                
        //エラーハンドラ
        private function errorHandler(event:IOErrorEvent):void {
            showInfoText("Couldn't load the file " + event.text);
        }
    }
}