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: [Alternativa3D] Maze(酔うので改良しました)

Alternativa3D Maze Demo
* W,S,A,D+Spaceで移動
* ドラッグで方向回転
* 参考: http://clockmaker.jp/blog/2008/10/alternativa3d_walkcontroller/

移動方法を変えてみました。
* 
* ジャンプした時に下を向くようにした・・・はずだけど
* 回転しちゃうよ、たすけて。
* ↑直しました。
* 
* アクションゲームが作れそうだな
* 
* 何となく見ているとカドケシに見える。
* 
* clockmakerさん、favoriteありがとうございます!
* 移動にTweenerは使って無いですよ。
* Tweenerはジャンプした時に、
* 下を向くようにするため使ったものです。
* (今は何にも使っていない)
* 
* 移動がしやすくなったのは、右と左のキー設定を無くしたらからです。
* controller.bindKey(KeyboardUtils.UP, ObjectController.ACTION_FORWARD);
* controller.bindKey(KeyboardUtils.DOWN, ObjectController.ACTION_BACK);
*
// forked from clockmaker's flash on 2009-3-19
/**
* Alternativa3D Maze Demo
* W,S,A,D+Spaceで移動
* ドラッグで方向回転
* 参考: http://clockmaker.jp/blog/2008/10/alternativa3d_walkcontroller/
*/

/*
 * 移動方法を変えてみました。
 * 
 * ジャンプした時に下を向くようにした・・・はずだけど
 * 回転しちゃうよ、たすけて。
 * ↑直しました。
 * 
 * アクションゲームが作れそうだな
 * 
 * 何となく見ているとカドケシに見える。
 * 
 * clockmakerさん、favoriteありがとうございます!
 * 移動にTweenerは使って無いですよ。
 * Tweenerはジャンプした時に、
 * 下を向くようにするため使ったものです。
 * (今は何にも使っていない)
 * 
 * 移動がしやすくなったのは、右と左のキー設定を無くしたらからです。
 * controller.bindKey(KeyboardUtils.UP, ObjectController.ACTION_FORWARD);
 * controller.bindKey(KeyboardUtils.DOWN, ObjectController.ACTION_BACK);
 * 
*/

package
{
	import alternativ5.engine3d.controllers.*;
	import alternativ5.engine3d.core.*;
	import alternativ5.engine3d.display.*;
	import alternativ5.engine3d.materials.*;
	import alternativ5.engine3d.primitives.*;
	import alternativ5.types.*;
	import alternativ5.utils.*;
	//import caurina.transitions.Tweener;
	
	import flash.net.*;
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;

	[SWF(frameRate="60")]
	
	public class Main extends Sprite
	{
		private const WIDTH_NUM:int = 10;
		private const HEIGHT_NUM:int = 10;
		private const LINE_SIZE:int = 500;
		
		private const MAZE_ARR:Array = 
		[
			[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
			[0, 0, 1, 0, 0, 1, 0, 0, 0, 0],
			[0, 0, 1, 0, 0, 1, 0, 0, 0, 0],
			[0, 0, 1, 1, 0, 1, 0, 1, 1, 0],
			[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
			[0, 0, 0, 0, 1, 0, 0, 1, 0, 0],
			[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
			[0, 0, 1, 0, 1, 1, 1, 1, 0, 0],
			[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
			[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
		]
		
		private const MAZE2_ARR:Array = 
		[
			[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
			[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
			[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
			[0, 0, 1, 1, 0, 1, 0, 0, 1, 0],
			[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
			[0, 1, 0, 0, 0, 0, 0, 1, 0, 0],
			[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
			[0, 0, 0, 2, 1, 0, 1, 0, 1, 0],
			[0, 2, 0, 0, 0, 0, 0, 1, 0, 0],
			[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
		]
		
		private const WALL_ARR:Array = 
		[
			[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
			[1, 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, 1],
			[1, 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, 1],
			[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
			[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
			[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
		]
		
		private var scene:Scene3D;
		private var view:View;
		private var camera:Camera3D;
		
		// The camera controller
		private var controller:WalkController;
		private var jump_camera:Boolean;
		
		//private var controller_tween:Boolean = false;
		
		public function Main()
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			
			// Creating scene
			scene = new Scene3D();
			scene.root = new Object3D();
			
			// create box
			for (var i:int = 0; i < MAZE_ARR.length; i++ )
			{
				for (var j:int = 0; j < MAZE_ARR[i].length; j++ )
				{
					if (MAZE_ARR[i][j] == 0) continue;
					
					var box:Box = Box(scene.root.addChild(new Box(LINE_SIZE, LINE_SIZE, LINE_SIZE)));
					box.cloneMaterialToAllSurfaces(new DevMaterial(0,0xFFFFFF));
					box.x = LINE_SIZE * (i - WIDTH_NUM / 2);
					box.y = LINE_SIZE * (j - HEIGHT_NUM / 2);
				}
			}
			for (i = 0; i < MAZE2_ARR.length; i++ )
			{
				for (j = 0; j < MAZE2_ARR[i].length; j++ )
				{
					if (MAZE2_ARR[i][j] == 0) continue;
					
					box = Box(scene.root.addChild(new Box(LINE_SIZE, LINE_SIZE, LINE_SIZE)));
					box.cloneMaterialToAllSurfaces(new DevMaterial(0,0xFFFFFF));
					box.x = LINE_SIZE * (i - WIDTH_NUM / 2);
					box.y = LINE_SIZE * (j - HEIGHT_NUM / 2);
					box.z = LINE_SIZE;
				}
			}
			// create wall
			for (i = 0; i < WALL_ARR.length; i++ )
			{
				for (j = 0; j < WALL_ARR[i].length; j++ )
				{
					if (WALL_ARR[i][j] == 0) continue;
					
					var box2:Box = Box(scene.root.addChild(new Box(LINE_SIZE, LINE_SIZE, LINE_SIZE*20)));
					box2.cloneMaterialToAllSurfaces(new DevMaterial(0,0xaaaaaaa));
					box2.x = LINE_SIZE * (i - WIDTH_NUM / 2);
					box2.y = LINE_SIZE * (j - HEIGHT_NUM / 2);
				}
			}
			
			var plane:Plane = Plane(scene.root.addChild(new Plane(LINE_SIZE * MAZE_ARR.length, LINE_SIZE * MAZE_ARR.length)));
			plane.cloneMaterialToAllSurfaces(new FillMaterial(0x888888));
			
			plane.z = -LINE_SIZE / 2;
			plane.rotationX = 0 * Math.PI / 180;
			
			// Adding camera and view
			camera = new Camera3D();
			camera.rotationX = MathUtils.toRadian(-90)
			camera.rotationZ = MathUtils.toRadian(120)
			scene.root.addChild(camera);

			view = new View();
			addChild(view);
			view.camera = camera;
			
			// 徒歩のコントローラーを作成
			controller = new WalkController(stage);
			
			// キーボード操作を可能にする機能
			controller.setDefaultBindings();
			// キーボードショートカットの整理
			controller.bindKey(KeyboardUtils.UP, ObjectController.ACTION_FORWARD);
			controller.bindKey(KeyboardUtils.DOWN, ObjectController.ACTION_BACK);
			
			// WalkControllerの対象を設定
			controller.object = camera;
			// 障害物の衝突設定
			controller.checkCollisions = true;
			// 徒歩の速度
			controller.speed = 700;
			// ジャンプ(スペースでジャンプできます)の速度
			controller.jumpSpeed = 1250;
			// 重力の速度
			controller.gravity = 600;
			// 視点(制御点)の高さ
			controller.objectZPosition = 1;
			
			//controller.flyMode = true;
			
			// FPS display launch
			FPS.init(stage);
			
			stage.addEventListener(Event.RESIZE, onResize);
			stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			onResize(null);
		}
		
		private function onEnterFrame(e:Event):void
		{
                        /*if (!controller.onGround && !controller_tween) {
				controller_tween = true;
				Tweener.addTween(camera, { rotationX:10, transition:"liner", time:2, onComplete:function():void { controller_tween = false } } );
			}
                        if (controller.onGround && !controller_tween) {
				controller_tween = true;
				Tweener.addTween(camera, {rotationX:MathUtils.toRadian(-90) ,transition:"liner", time:2, onComplete:function():void { controller_tween = false } } );
			}*/
			
                        if (!controller.onGround && camera.rotationX >= -2.75 && !jump_camera) {
				camera.rotationX -= 0.02;
				if (camera.rotationX < -2.75) {
					camera.rotationX = -2.75;
					jump_camera = true;
				}
			}else {
				camera.rotationX += 0.005;
				if (camera.rotationX >= MathUtils.toRadian( -90)) {
				    camera.rotationX = MathUtils.toRadian(-90)
				}
			}
                        /*if (!controller.onGround && jump_camera) {
				camera.rotationX += 0.025;
			}*/
                        if (controller.onGround && camera.rotationX <= MathUtils.toRadian( -90)) {
				jump_camera = false;
				camera.rotationX += 0.05;
			}
                        
			// interface
			controller.processInput();
			                        
			// Scene calculating
			scene.calculate();
		}
		
		/**
		 * Resize Handler
		 */
		private function onResize(e:Event):void
		{
			view.width = stage.stageWidth;
			view.height = stage.stageHeight;
			
			// BackGround Color
			var bgMatrix:Matrix = new Matrix();
			bgMatrix.rotate(90 * Math.PI / 180);
			graphics.clear()
			//graphics.beginGradientFill("linear", [0xFFFFFF, 0x001122], [100, 100], [0, 255], bgMatrix);
                        graphics.beginFill(0x000000);
			graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
		}
		
	}
}