
久しぶりにFIVe3Dの配布サイトみたら、
なんか奇麗な3Dキーボードのデモが増えていました。
ふと思いついたので、もうちょっとリアルな形で
自分も3Dテンキーデモをパク作成してみました。
デモとソース↓
最初にキーをマウスでプッシュしてフォーカスを与えてください。
テンキーや、キーボードの数字キーとも連動して動きます。
計算機機能はおまけ程度につけました、ちゃんと動かないので真剣に使わないでくださいw (^-^;
このテンキーはキーひとつを生成するSquareKeyクラスと、
SquareKeyをテンキーの数だけ生成するTenkey3Dクラスから成っています。
FIVe3Dはベクターベースの3D描画ライブラリで、
重なり順は考慮しないので、後ろにあるものから描画していく必要があります。
今回はキーは、影を出すためのbottom、
画面に見えてる3面のtop, front, sideのSprite3Dを組み合わせてキーひとつ分を作っています。
なので、右側からしか見下ろせません(^-^;;
同様に、キーを配置するTenkey3Dクラスでも、
後ろの方に配置されるキーから順番においていっています。
Tenkey3Dクラスで、"tenkeyDown"イベント、"tenkeyUp"イベントで、
どのキーが押されたかを検知できるようにしています。
- Tenkey3D.addTenkeyEventListener(type:String, listener:Function);
listenerは、入力されたキーの文字列を引数として呼び出されます。
↓以下テンキーを生成するソース、計算部は適当に作ったので・・・載せない(^-^;;;
キーひとつ分のSquareKeyクラス
- package
- {
- import five3D.display.DynamicText3D;
- import five3D.display.Sprite3D;
- import five3D.typography.HelveticaBold;
- import flash.events.Event;
- import flash.events.MouseEvent;
- import flash.filters.DropShadowFilter;
- public class SquareKey extends Sprite3D
- {
- private var top:Sprite3D;
- private var front:Sprite3D;
- private var side:Sprite3D;
- private var bottom:Sprite3D;
- public var sq_width:Number=100;
- public var sq_height:Number=100;
- public var sq_tall:Number=60;
- public var _key:String;
- public var _onKeyDown:Function = null;
- public var _onKeyUp:Function = null;
- public function SquareKey(key:String, width:Number, height:Number)
- {
- _key = key;
- sq_width = width;
- sq_height = height;
- var diff:Number = sq_tall*Math.tan(10 * Math.PI / 180);
- bottom = new Sprite3D;
- bottom.graphics3D.beginFill(0xCCCCCC);
- bottom.graphics3D.drawRect(0,0,sq_width + 2 * diff ,sq_height + 2 * diff);
- bottom.graphics3D.endFill();
- bottom.rotationX = -90;
- bottom.z = sq_height + diff;
- bottom.x = -diff;
- bottom.y = sq_tall;
- top = new Sprite3D;
- top.graphics3D.beginFill(0xFFFFFF);
- top.graphics3D.drawRect(0,0,sq_width,sq_height);
- top.graphics3D.endFill();
- top.rotationX = -90;
- top.z = sq_height;
- top.focusRect = false;
- var dropShadow:DropShadowFilter = new DropShadowFilter;
- dropShadow.blurX = 10;
- dropShadow.blurY = 10;
- dropShadow.color = 0x000000;
- dropShadow.inner = false;
- dropShadow.angle = 45;
- dropShadow.strength = 0.4;
- bottom.filters = [dropShadow];
- this.addChild(bottom);
- this.addChild(top);
- var keys:Array = key.split("\n");
- for(var i:Number=0;i<keys.length;i++){
- var letter:DynamicText3D = new DynamicText3D(HelveticaBold);
- if(key.length> 2) letter.size = 30;
- else letter.size = 50;
- letter.color = 0x666666;
- letter.text = keys[i];
- letter.x = 10;
- letter.y = 10 + 35 * i;
- top.addChild(letter);
- }
- front = new Sprite3D;
- front.graphics3D.beginFill(0xEEEEEE);
- front.graphics3D.moveTo(0, 0);
- front.graphics3D.lineTo(sq_width, 0);
- front.graphics3D.lineTo(sq_width+diff, sq_tall);
- front.graphics3D.lineTo(-diff, sq_tall);
- front.graphics3D.lineTo(0, 0);
- front.graphics3D.endFill();
- front.rotationX = -10;
- this.addChild(front);
- var sideBase:Sprite3D = new Sprite3D;
- side = new Sprite3D;
- side.graphics3D.beginFill(0xCCCCCC);
- side.graphics3D.moveTo(0,0);
- side.graphics3D.lineTo(sq_height, 0);
- side.graphics3D.lineTo(sq_height+diff, sq_tall);
- side.graphics3D.lineTo(-diff, sq_tall);
- side.graphics3D.lineTo(0, 0);
- side.graphics3D.endFill();
- side.rotationX = -10;
- sideBase.x = sq_width;
- sideBase.rotationY = -90;
- sideBase.addChild(side);
- this.addChild(sideBase);
- side = new Sprite3D;
- top.addEventListener(MouseEvent.MOUSE_DOWN, mousePressHandler);
- top.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
- top.addEventListener(MouseEvent.MOUSE_OUT, mouseUpHandler);
- top.useHandCursor = true;
- top.buttonMode = true;
- }
- private function mousePressHandler(event:Event):void{
- keydown();
- }
- private function mouseUpHandler(event:Event):void{
- keyup();
- }
- public function get key():String{
- return _key;
- }
- public function keydown():void{
- this.y = 13;
- if(this._onKeyDown != null) this._onKeyDown(this._key);
- }
- public function keyup():void{
- this.y = 0;
- if(this._onKeyUp != null) this._onKeyUp(this._key);
- }
- public function addKeyEventListener(type:String, listener:Function):void{
- if(type == "keydown"){
- this._onKeyDown = listener;
- }else if(type == "keyup"){
- this._onKeyUp = listener;
- }
- }
- }
- }
キーを並べるTenkey3Dクラス
- package {
- import five3D.display.Sprite3D;
- import flash.events.Event;
- import flash.events.KeyboardEvent;
- import flash.ui.Keyboard;
- public class Tenkey3D extends Sprite3D
- {
- private var keylist:Array;
- private var numlock_key:SquareKey;
- private var _onTenkeyDown:Function;
- private var _onTenkeyUp:Function;
- public function Tenkey3D()
- {
- keylist = new Array();
- var key_width:Number = 100 + 2 * 60*Math.tan(10 * Math.PI / 180);
- var key_base:Sprite3D = new Sprite3D;
- key_base.z = 120;
- this.addChild(key_base);
- numlock_key = new SquareKey("Num\nLock",100,100);
- key_base.addChild(numlock_key);
- numlock_key.z = key_width*4;
- var key_div:SquareKey = new SquareKey("/",100,100);
- key_base.addChild(key_div);
- key_div.z = key_width*4;
- key_div.x = key_width;
- keylist.push(key_div);
- var key_mul:SquareKey = new SquareKey("*",100,100);
- key_base.addChild(key_mul);
- key_mul.z = key_width*4;
- key_mul.x = key_width*2;
- keylist.push(key_mul);
- var key_sub:SquareKey = new SquareKey("-",100,100);
- key_base.addChild(key_sub);
- key_sub.z = key_width*4;
- key_sub.x = key_width*3;
- keylist.push(key_sub);
- var key_7:SquareKey = new SquareKey("7",100,100);
- key_base.addChild(key_7);
- key_7.z = key_width*3;
- var key_8:SquareKey = new SquareKey("8",100,100);
- key_base.addChild(key_8);
- key_8.z = key_width*3;
- key_8.x = key_width;
- var key_9:SquareKey = new SquareKey("9",100,100);
- key_base.addChild(key_9);
- key_9.z = key_width*3;
- key_9.x = key_width*2;
- keylist.push(key_7);
- keylist.push(key_8);
- keylist.push(key_9);
- var key_4:SquareKey = new SquareKey("4",100,100);
- key_base.addChild(key_4);
- key_4.z = key_width*2;
- var key_5:SquareKey = new SquareKey("5",100,100);
- key_base.addChild(key_5);
- key_5.z = key_width*2;
- key_5.x = key_width;
- var key_6:SquareKey = new SquareKey("6",100,100);
- key_base.addChild(key_6);
- key_6.z = key_width*2;
- key_6.x = key_width*2;
- keylist.push(key_4);
- keylist.push(key_5);
- keylist.push(key_6);
- var key_add:SquareKey = new SquareKey("+", 100, 220);
- key_base.addChild(key_add);
- key_add.z = key_width*2;
- key_add.x = key_width*3;
- keylist.push(key_add);
- var key_1:SquareKey = new SquareKey("1",100,100);
- key_base.addChild(key_1);
- key_1.z = key_width;
- var key_2:SquareKey = new SquareKey("2",100,100);
- key_base.addChild(key_2);
- key_2.z = key_width;
- key_2.x = key_width;
- var key_3:SquareKey = new SquareKey("3",100,100);
- key_base.addChild(key_3);
- key_3.z = key_width;
- key_3.x = key_width*2;
- keylist.push(key_1);
- keylist.push(key_2);
- keylist.push(key_3);
- var key_0:SquareKey = new SquareKey("0",220,100);
- key_base.addChild(key_0);
- keylist.push(key_0);
- var key_dot:SquareKey = new SquareKey(".",100,100);
- key_base.addChild(key_dot);
- key_dot.x = key_width*2;
- keylist.push(key_dot);
- var key_enter:SquareKey = new SquareKey("Enter",100,220);
- key_base.addChild(key_enter);
- key_enter.x = key_width*3;
- keylist.push(key_enter);
- this.addEventListener(KeyboardEvent.KEY_DOWN, keydownHandler);
- this.addEventListener(KeyboardEvent.KEY_UP, keyupHandler);
- this.addEventListener(Event.ENTER_FRAME, enterHandler);
- for(var i:Number = 0; i <keylist.length; i++){
- var skey:SquareKey = keylist[i];
- skey.addKeyEventListener("keydown", tenkeyDownHandler);
- }
- }
- private function tenkeyDownHandler(key:String):void{
- if(this._onTenkeyDown != null) this._onTenkeyDown(key);
- }
- private function keyConvert(keyCode:Number):String{
- var key_str:String = null;
- if(keyCode == 48 || keyCode == Keyboard.NUMPAD_0){
- key_str = "0";
- }else if(keyCode == 190 || keyCode == Keyboard.NUMPAD_DECIMAL){
- key_str = ".";
- }else if(keyCode == 49 || keyCode == Keyboard.NUMPAD_1){
- key_str = "1";
- }else if(keyCode == 50 || keyCode == Keyboard.NUMPAD_2){
- key_str = "2";
- }else if(keyCode == 51 || keyCode == Keyboard.NUMPAD_3){
- key_str = "3";
- }else if(keyCode == 52 || keyCode == Keyboard.NUMPAD_4){
- key_str = "4";
- }else if(keyCode == 53 || keyCode == Keyboard.NUMPAD_5){
- key_str = "5";
- }else if(keyCode == 54 || keyCode == Keyboard.NUMPAD_6){
- key_str = "6";
- }else if(keyCode == 55 || keyCode == Keyboard.NUMPAD_7){
- key_str = "7";
- }else if(keyCode == 56 || keyCode == Keyboard.NUMPAD_8){
- key_str = "8";
- }else if(keyCode == 57 || keyCode == Keyboard.NUMPAD_9){
- key_str = "9";
- }else if(keyCode == 191 || keyCode == Keyboard.NUMPAD_DIVIDE){
- key_str = "/";
- }else if(keyCode == 186 || keyCode == Keyboard.NUMPAD_MULTIPLY){
- key_str = "*";
- }else if(keyCode == 189 || keyCode == Keyboard.NUMPAD_SUBTRACT){
- key_str = "-";
- }else if(keyCode == 187 || keyCode == Keyboard.NUMPAD_ADD){
- key_str = "+";
- }else if(keyCode == Keyboard.ENTER || keyCode == Keyboard.NUMPAD_ENTER){
- key_str = "Enter";
- }else if(keyCode == Keyboard.BACKSPACE || keyCode == Keyboard.DELETE ||
- keyCode == Keyboard.ESCAPE || keyCode == Keyboard.numLock ){
- key_str = "clear";
- }
- return key_str;
- }
- private function keydownHandler(event:KeyboardEvent):void{
- var key_str:String = this.keyConvert(event.keyCode);
- if(key_str){
- for(var i:Number=0; i<this.keylist.length;i++){
- if(keylist[i].key == key_str){
- keylist[i].keydown();
- }
- }
- }
- }
- public function pressKey(key_str:String):void{
- for(var i:Number=0; i<this.keylist.length;i++){
- if(keylist[i].key == key_str){
- keylist[i].keydown();
- keylist[i].keyup();
- }
- }
- }
- private function keyupHandler(event:KeyboardEvent):void{
- var key_str:String = this.keyConvert(event.keyCode);
- if(key_str){
- for(var i:Number=0; i<this.keylist.length;i++){
- if(keylist[i].key == key_str){
- keylist[i].keyup();
- }
- }
- }
- }
- private function enterHandler(event:Event):void{
- if(Keyboard.numLock) numlock_key.keydown();
- else numlock_key.keyup();
- }
- public function addTenkeyEventListener(type:String, listener:Function):void{
- if(type == "tenkeyDown"){
- this._onTenkeyDown = listener;
- }else if(type == "tenkeyUp"){
- this._onTenkeyUp = listener;
- }
- }
- }
- }
- Newer: Flashで色を次々に、スムーズに変える
- Older: ベジェ曲線と、すごい単純な波の表現(2)
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://parpue.net/web/355/trackback
- Listed below are links to weblogs that reference
- FIVe3Dで3Dテンキー from parpue.net


