前のエントリで作成した、
ビンゴ景品用くじ引きパネルを、
結婚パーティー本番で、スタンドアローンで動かしたかったので、Air化してみました。
→Airとは?参考
http://www.atmarkit.co.jp/fwcr/rensai2/airwidget01/airwidget01_1.html
相変わらずBox2Dの3Dテキストの日本語フォント問題は残っていますが、
とりあえずXMLファイルをドロップして表示させるように変更しました。
これでパーティー本番の環境で、ローカルファイルセキュリティがー!とかって焦る心配ない!
Airが入ってねーとかって焦る心配はある。
また、ビンゴの景品用ということで、
今ビンゴのどの数字が出てきているか表示するような機能も追加しました。
これがあればきっとビンゴがもりあがるね!きっと!
参考までにAirファイルとドロップする用のXMLをおいておきます。
panelsair.air
panels.xml
相変わらずエラーは起きないものとして作ってます。運用回避!
↓ソース全部等
今回はFlex 3 BuilderでFlex 3 プロジェクトのデスクトップアプリケーションとして作成しました。
mxmlにファイルのドロップ処理などを加え、
さらにmxmlファイルからSpriteを継承したPanelsクラスをaddChildしています。
Spriteクラスは直接addChildできないようなのでUIComponentを間に挟みました。
mxmlファイル
- <?xml version="1.0" encoding="utf-8"?>
- <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" borderColor="#F2F0F0" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #FFFFFF]" width="1000" height="800" creationComplete="setupPanel()">
- <mx:Canvas x="10" y="10" width="978" height="757" id="canvas" backgroundColor="#FFFFFF">
- <mx:Canvas x="10" y="620" width="958" height="137" id="bingoNum" backgroundColor="#F0F5FB">
- </mx:Canvas>
- <mx:Canvas x="189" y="10" width="600" height="650" id="panelArea">
- <mx:Label x="121" y="211" text="Drug XML file to Me!" width="358" fontSize="27" id="drugme"/>
- </mx:Canvas>
- <mx:Button x="84" y="590" label="+" width="47" id="plusButton" click="onPlusClick()"/>
- <mx:Button x="139" y="590" label="-" width="42" id="minusButton" click="onMinusClick()"/>
- <mx:TextInput x="10" y="590" width="66" id="binum"/>
- </mx:Canvas>
- <mx:Script>
- <![CDATA[
- import mx.core.UIComponent;
- import Panels;
- import flash.desktop.*;
- import flash.display.Bitmap;
- import flash.filesystem.File;
- import mx.controls.Label;
- private var panels:Panels;
- private var bingoNumList:Array;
- public function setupPanel():void{
- bingoNumList = new Array;
- var myUIComponent:UIComponent = new UIComponent();
- panels = new Panels;
- myUIComponent.addChild(panels);
- panelArea.addChild(myUIComponent);
- canvas.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, onCanvasDragEnter);
- canvas.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, onCanvasDragDrop);
- }
- // キャンバスにドラッグされた際呼び出されるリスナ
- private function onCanvasDragEnter(event:NativeDragEvent):void {
- if (event.clipboard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
- NativeDragManager.acceptDragDrop(canvas);
- }
- }
- // キャンバスにドロップされた際呼び出されるリスナ
- private function onCanvasDragDrop(event:NativeDragEvent):void {
- var fileList:Array = event.clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
- if (fileList.length> 1) {
- return;
- }
- var file:File = fileList[0];
- var stream:FileStream = new FileStream();
- try {
- stream.open(file, FileMode.READ);
- var str:String = stream.readUTFBytes(stream.bytesAvailable);
- panels.loadXML(str);
- drugme.visible = false;
- } catch (error:IOError) {
- trace("(-_-;;");
- } finally {
- stream.close();
- }
- }
- private function onPlusClick(){
- if(this.binum.text == "") return;
- var num:Label = new Label;
- num.setStyle("fontSize", 28);
- num.setStyle("color", 0x6481F5);
- num.text = this.binum.text;
- binum.text == "";
- var i = this.bingoNumList.length;
- // 時間がなかったのでアホな改行処理・・・4行あればいいかなって・・・・
- num.x = i * 50;
- if(i> 56){
- num.x -= 50 * 57;
- num.y = 90;
- }else if(i> 37){
- num.x -= 50 * 38;
- num.y = 60;
- }else if(i> 18){
- num.x -= 50 * 19;
- num.y = 30;
- }
- this.binum.text = "";
- this.bingoNumList.push(num);
- this.bingoNum.addChild(num);
- }
- private function onMinusClick(){
- if(bingoNumList.length == 0) return;
- var num = bingoNumList.pop();
- this.bingoNum.removeChild(num);
- }
- ]]>
- </mx:Script>
- </mx:WindowedApplication>
Panelsクラス
- package {
- import caurina.transitions.Tweener;
- import five3D.display.DynamicText3D;
- import five3D.display.Scene3D;
- import five3D.display.Sprite3D;
- import five3D.typography.HelveticaBold;
- import five3D.typography.HiraginoProW6Bold;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.MouseEvent;
- /**
- * @author Default
- */
- public class Panel extends Sprite {
- private var scene:Scene3D;
- private var sprite3D:Sprite3D;
- private var head:Sprite3D;
- private var back:Sprite3D;
- private var headTf:DynamicText3D;
- private var backTf:DynamicText3D;
- private var isHead:Boolean = true;
- private var bgColor:Number;
- private var panel_width:Number;
- private var panel_height:Number;
- public function Panel(width:Number = 100, height:Number = 100, name:String = "test", fontSize:Number = 12, bgColor:Number = 0xFF00FF ) {
- scene= new Scene3D();
- this.addChild(scene);
- this.bgColor = bgColor;
- this.panel_width = width;
- this.panel_height = height;
- sprite3D = new Sprite3D;
- sprite3D.x = width / 2;
- sprite3D.y = height / 2;
- head = new Sprite3D;
- back = new Sprite3D;
- head.graphics3D.beginFill(0xEEEEEE);
- head.graphics3D.drawRoundRect( -panel_width/2, -panel_height/2, panel_width, panel_height, 10, 10);
- head.graphics3D.endFill();
- head.z = -1;
- sprite3D.addChild(head);
- back.graphics3D.beginFill(0xAAAACC);
- back.graphics3D.drawRoundRect( -panel_height/2, -panel_height/2, panel_width, panel_height, 10, 10);
- back.graphics3D.endFill();
- back.z = 1;
- back.rotationY = 180;
- sprite3D.addChild(back);
- headTf = new DynamicText3D(HiraginoProW6Bold);
- headTf.size = fontSize;
- headTf.color = 0x333333;
- headTf.text = name.toString();
- headTf.y = -fontSize/2;
- headTf.z = 0;
- headTf.x = -width /2 + 10;
- head.addChild(headTf);
- // まだ数字は載せない
- backTf = new DynamicText3D(HelveticaBold);
- backTf.size = 80;
- backTf.color = 0x333333;
- backTf.y = -50;
- backTf.z = 0;
- backTf.x = -20;
- back.addChild(backTf);
- scene.addChild(sprite3D);
- this.addEventListener(Event.ENTER_FRAME, onEnterHandler);
- }
- private function onEnterHandler(event:Event):void{
- //sprite3D.rotationY += 2;
- var rotationY:Number = sprite3D.rotationY;
- if (rotationY> -90 && rotationY <= 90) {
- head.visible = true;
- back.visible = false;
- }else {
- head.visible = false;
- back.visible = true;
- }
- }
- public function reverse():void{
- var toRotation:Number;
- if(isHead){
- isHead = false;
- toRotation = 180;
- }else{
- isHead = true;
- toRotation = 360;
- }
- Tweener.addTween(sprite3D, {rotationY:toRotation, time:1, transition:"easeOutQuad"});
- }
- public function moveTo(x, y):void{
- Tweener.addTween(this, {x:x, y:y, time:1, transition:"easeOutQuad"});
- }
- public function clickReversable():void{
- this.addEventListener(MouseEvent.CLICK, clickHandler);
- this.buttonMode = true;
- this.useHandCursor = true;
- }
- private function clickHandler(event:Event):void{
- this.reverse();
- }
- public function set number(num:Number):void{
- if(num> 9) this.backTf.x = -48;
- if(isHead) reverse();
- this.backTf.text = num.toString();
- back.graphics3D.clear();
- back.graphics3D.beginFill(this.bgColor);
- back.graphics3D.drawRoundRect( -panel_width/2, -panel_height/2, panel_width, panel_height, 10, 10);
- back.graphics3D.endFill();
- }
- }
- }
panelクラスは前の記事のものと変更ありません。初のAir化、なんとなく完了
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://parpue.net/web/flash/235/trackback
- Listed below are links to weblogs that reference
- FIVe3Dでくじ引き用パネルを作ってみた(2) AIR化 from parpue.net



