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

使徒ビューア(ラミエル→レリエル→アルミサエル)ENTERで切り替え

第5使徒ラミエル(決戦、第3新東京市)
もう、hacker_3q88gl5n さんの見たときから、
これにしか見えなくて (^^;

第16使徒アルミサエル(涙)
使徒つながりで (形状はなんちゃってですが(^_^;) 作っていたけれど
別出しするのも面倒なので、Angel(使徒)Viewer として、一本化する方向で・・・。

第12使徒レリエル(死に至る病、そして)
例によってテクスチャはなんちゃってですが(^_^;;;

使い方
1、画面クリックでインフォメーションウィンドウが切り替わります。
2、エンターキーで使徒が切り替わります。

Copyright(c) since 2010 Nekyo.
@licence MIT licence

必要なライブラリをインポートします
[SWF(backgroundColor=0xccffff)]
package {
	/**
	 * 第5使徒ラミエル(決戦、第3新東京市)
	 *   もう、hacker_3q88gl5n さんの見たときから、
	 *   これにしか見えなくて (^^;
	 * 
	 * 第16使徒アルミサエル(涙)
	 *   使徒つながりで (形状はなんちゃってですが(^_^;) 作っていたけれど
	 *   別出しするのも面倒なので、Angel(使徒)Viewer として、一本化する方向で・・・。
	 * 
	 * 第12使徒レリエル(死に至る病、そして)
	 *   例によってテクスチャはなんちゃってですが(^_^;;;
	 *
	 * 使い方
	 * 1、画面クリックでインフォメーションウィンドウが切り替わります。
	 * 2、エンターキーで使徒が切り替わります。
	 * 
	 * Copyright(c) since 2010 Nekyo.
	 * @licence MIT licence
	 */
	import flash.display.Sprite;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.ui.Keyboard;
 	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.text.*;
	import org.papervision3d.materials.shaders.ShadedMaterial;

	// 必要なライブラリをインポートします
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.materials.special.CompositeMaterial;
	import org.papervision3d.materials.shaders.FlatShader;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.objects.primitives.Cylinder;
	import org.papervision3d.core.effects.view.ReflectionView;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.system.LoaderContext;

	//[SWF(backgroundColor=0xccffff)]
	[SWF(backgroundColor=0x334466)]

	public class AngelViewer extends ReflectionView {
		private var _ramiel:Sphere;			// ラミエル本体
		private var _leliel:Sphere;			// レリエル本体
		private var _almisael:Cylinder;		// アルミサエル本体

		private var _info:Sprite;			// インフォメーションウィンドウ
		private var _disp_state:int = 0;	// 表示ステータス
		private var _light:PointLight3D;	// 光源

		/**
		 * ラミエルを返す。
		 * @param	light 光源
		 * @return ラミエル
		 */
		public function Ramiel(light:PointLight3D):Sphere {
			// コアを作成
			var core:Sphere = new Sphere(new ColorMaterial(0xff0000), 40, 8, 8);
			core.y = 300;

			// 本体を作成
			var fmat:FlatShadeMaterial = new FlatShadeMaterial(light, 0x1414ff, 0x000055);
			fmat.fillAlpha = 0.8;	// とりあえず透過 80% 位で
			var material: CompositeMaterial = new CompositeMaterial();
			material.addMaterial(new WireframeMaterial(0xffffff));
			material.addMaterial(fmat);

			var body:Sphere = new Sphere(material, 200, 4, 2);
			core.addChild(body);	// 球面を3Dシーンに表示
			return core;
		}

		/**
		 * アルミサエルを返す。
		 * @param	light 光源
		 * @return  アルミサエル
		 */
		public function Almisael(light:PointLight3D):Cylinder {
			// 本体を作成
			var material:WireframeMaterial = new WireframeMaterial(0xffffff);
			material.doubleSided = true;
			var core:Cylinder = new Cylinder(material, 500, 10, 180, 1, 500, false, false);
			core.y = 300;
			return core;
		}

		/**
		 * レリエルを返す。
		 * @param	light 光源
		 * @return レリエル
		 */
		public function Leliel(light:PointLight3D, bitmapData:BitmapData):Sphere {
			// コアを作成
			var bitmapMat:BitmapMaterial = new BitmapMaterial(bitmapData);
			var fmat:FlatShader = new FlatShader(light, 0xffffff, 0x808080);
			var mat:ShadedMaterial = new ShadedMaterial(bitmapMat, fmat, 0);
			var core:Sphere = new Sphere(mat, 160, 30, 20);
			core.y = 300;
			return core;
		}

		/**
		 * インフォメーションウィンドウ
		 * @return インフォメーションウィンドウ
		 */
		public function InfomationWindow():Sprite {
			var infowin:Sprite = new Sprite();

			var txtFormat:TextFormat = new TextFormat();
			txtFormat.font = "Arial";

			var text1:TextField = new TextField();
			text1.selectable = false;
			text1.defaultTextFormat = txtFormat;
			text1.borderColor = 0xffffff;
			text1.border = true;
			text1.x = 5;
			text1.y = 5;
			text1.autoSize = "left";
			text1.htmlText = " <font color='#FFFFFF' size='10'><b>SUBJECT:<b></font> \n"
				+ " <font color='#FFFFFF' size='14'><b>ANGEL</b></font>";
			infowin.addChild(text1);

            text1 = new TextField();
			text1.borderColor = 0xffffff;
			text1.border = true;
			text1.selectable = false;
			text1.defaultTextFormat = txtFormat;
			text1.x = viewport.width - 58;
			text1.y = 5;
			text1.autoSize = "left";
			text1.htmlText = " <font color='#FFFFFF' size='20'><b>LIVE</b></font> \n";
			infowin.addChild(text1);
			
			for (var y:int = 0; y <= viewport.height; y += 100) {
				for (var x:int = 170; x < viewport.width; x += 200) {
					text1 = new TextField();
					text1.selectable = false;
					text1.defaultTextFormat = txtFormat;
					text1.x = x - (y / 100 % 2) * 100;
					text1.y = y;
					text1.autoSize = "left";
					text1.htmlText = "<font color='#FFFFFF' size='40'>×</font>\n";
					infowin.addChild(text1);
				}
			}
			return infowin;
		}

		/**
		 * コンストラクタ
		 */		
		public function AngelViewer() {
			camera.y = 600;	// カメラ位置

			// 床の作成
			var col:ColorMaterial = new ColorMaterial(0xffffff, 0.5);
			var co:CompositeMaterial = new CompositeMaterial();
			co.addMaterial(col);
			
			var floor:Plane = new Plane(co, 2000, 2000, 12, 12);
			floor.pitch( -90);
			scene.addChild(floor);	// 床を3Dシーンに表示

			// ライトの設定。手前、上の方。
			_light = new PointLight3D();
			_light.x = 0;
			_light.y = 1000;
			_light.z = -1000;

			// ラミエル
			_ramiel = Ramiel(_light);
			scene.addChild(_ramiel);

			// アルミサエル
			_almisael = Almisael(_light);
			_almisael.visible = false;
			scene.addChild(_almisael);

			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, initHandler);
			loader.load(new URLRequest(
				"http://lh3.ggpht.com/_XAjHEdaLqjE/S9HR1kiT6_I/AAAAAAAAAK8/7NKKG65E2zQ/leliel_skin.png				"
				), new LoaderContext(true));

			_info = InfomationWindow();
			addChild(_info);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			addEventListener(MouseEvent.CLICK, _onClick);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, _onKey);
		}

		/**
		 * 画像読み込み完了イベント処理
		 * @param e イベント
		 */
		private function initHandler(event:Event):void {
			var bitmap:Bitmap = event.target.content as Bitmap;
			// レリエル
			_leliel = Leliel(_light, bitmap.bitmapData);
			_leliel.visible = false;
			scene.addChild(_leliel);
		}

		/**
		 * マウスクリックでインフォメーションウィンドウを切り替える。
		 * @param	e
		 */
		private function _onClick(e:MouseEvent):void {
			_info.visible = !_info.visible;
		}

		/**
		 * エンターキーで使徒を切り替える。
		 * @param	e
		 */
		private function _onKey(e:KeyboardEvent):void {
			if (e.keyCode != Keyboard.ENTER) return;
			_disp_state++;

			switch (_disp_state) {
				case 1:
					_ramiel.visible = false;	// ラミエル消し
					_leliel.visible = true;		// レリエル表示
					break;
				case 2:
					_leliel.visible = false;	// レリエル消し
					_almisael.visible = true;	// アルミサエル表示
					break;
				case 3:
					_almisael.visible = false;	// アルミサエル消し
					_ramiel.visible = true;		// ラミエル出し

					_disp_state = 0;			// カウンタ初期化
					break;
			}
		}

		/**
		 * フレーム処理
		 */
		private function onEnterFrame(e:Event):void {
			switch (_disp_state) {
			case 0:
				_ramiel.rotationY -= mouseY / -100;
				_ramiel.rotationY += mouseX / -100;
				break;
			case 1:
				_leliel.rotationY -= mouseY / -100;
				_leliel.rotationY += mouseX / -100;
				break;
			case 2:
				_almisael.rotationY -= mouseY / -100;
				_almisael.rotationY += mouseX / -100;
				break;
			}
			singleRender();
		}
	}
}