使徒ビューア(ラミエル→レリエル→アルミサエル)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();
}
}
}