2017-06-25

[Flash] Starling Feathers

[Flash] Starlingの学習 Feathersを学ぶ

環境:

  • Starling 2.1
  • Feathers 3.2.0
  • Adobe AIR SDK 22
  • FlashDevelop 5.2
  • Windows 7 64bit

[話者] Feathersについて学ぶぞ。

Install and HelloWorld

https://feathersui.com/ui-components/feathers-ui-3.2.0.zip を取得した。

  • feathers-ui-3.2.0\swc\feathers.swc
  • feathers-ui-3.2.0\themes\MetalWorksMobileTheme\swc\MetalWorksMobileTheme.swc

lib/ にcopy。[右クリック→Added To Stage]。

feathers-ui-3.2.0\examples\HelloWorld\source\feathers\examples\helloWorld\Main.as を入力してみる。

Main.as は従来と同じ。

package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import starling.core.Starling;
    
    /**
     * ...
     * @author foo
     */
    [SWF(width="480",height="480",frameRate="60",backgroundColor="#002143")]
    public class Main extends Sprite 
    {
        private var stln:Starling;
        public static var frameRate:uint = 0;
        
        public function Main() 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onContext3dCreated);
            stln = new Starling(Game, stage);
            stln.showStats = true;
            stln.antiAliasing = 0;
            stln.start();
        }
        
        private function onContext3dCreated(e:Event):void 
        {
            stage.stage3Ds[0].removeEventListener(Event.CONTEXT3D_CREATE, onContext3dCreated);

            if (Starling.context.driverInfo.toLowerCase().indexOf("software") != -1) {
                // GPU disable
                Starling.current.nativeStage.frameRate = 30;
            } else {
                // GPU enable
            }
            frameRate = Starling.current.nativeStage.frameRate;
        }
    }
}

Game.as

package 
{
    import feathers.controls.Button;
    import feathers.controls.TextCallout;
    import feathers.themes.MetalWorksMobileTheme;
    import starling.display.Sprite;
    import starling.events.Event;
    
    /**
     * ...
     * @author foo
     */
    public class Game extends Sprite 
    {
        private var btn:Button;
        
        public function Game() 
        {
            if (stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            addEventListener(Event.ENTER_FRAME, onGetGpuStyle);
        }
        
        private function onGetGpuStyle(e:Event):void  
        {
            if (Main.frameRate <= 0) return;
            removeEventListener(Event.ENTER_FRAME, onGetGpuStyle);
            
            addItem();
        }
        
        private function addItem():void 
        {
            new MetalWorksMobileTheme();
            
            btn = new Button();
            btn.label = 'Click Me';
            btn.addEventListener(Event.TRIGGERED, onButtonTriggered);
            addChild(btn);
            btn.validate();
            btn.x = Math.round((stage.stageWidth - btn.width) / 2);
            btn.y = Math.round((stage.stageHeight - btn.height) / 2);
        }
        
        private function onButtonTriggered(e:Event):void 
        {
            TextCallout.show('Feathers now\nYes', btn);
        }
    }
}

btn.validate();のvalidate()というのを実行しないと、座標がずれる。座標指定する前に実行するのがよいようだ。

公式の Components Explorer でUI部品一覧を見ることができる。

そこのNumericStepperとSliderを設置してみた。

Game.as

package 
{
    import feathers.controls.Button;
    import feathers.controls.NumericStepper;
    import feathers.controls.Slider;
    import feathers.controls.TextCallout;
    import feathers.themes.MetalWorksMobileTheme;
    import starling.display.Sprite;
    import starling.events.Event;
    import starling.text.TextField;
    import starling.text.TextFormat;
    
    /**
     * ...
     * @author foo
     */
    public class Game extends Sprite 
    {
        private var btn:Button;
        private var stp:NumericStepper;
        private var sld:Slider;
        private var stplabel:TextField;
        private var sldlabel:TextField;
        
        public function Game() 
        {
            if (stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            addEventListener(Event.ENTER_FRAME, onGetGpuStyle);
        }
        
        private function onGetGpuStyle(e:Event):void  
        {
            if (Main.frameRate <= 0) return;
            removeEventListener(Event.ENTER_FRAME, onGetGpuStyle);
            
            addItem();
        }
        
        private function addItem():void 
        {
            new MetalWorksMobileTheme();
            //new MinimalMobileTheme();
            
            btn = new Button();
            btn.label = 'Click Me';
            btn.addEventListener(Event.TRIGGERED, onButtonTriggered);
            addChild(btn);
            btn.validate();
            btn.x = Math.round((stage.stageWidth - btn.width) / 2);
            btn.y = Math.round((stage.stageHeight - btn.height) / 4 * 1);
            
            stp = new NumericStepper();
            stp.minimum = 0.0;
            stp.maximum = 1.0;
            stp.step = 0.1;
            stp.value = 0.3;
            stp.addEventListener(Event.CHANGE, onStepperChanged);
            addChild(stp);
            stp.validate();
            stp.x = Math.round((stage.stageWidth - stp.width) / 2);
            stp.y = Math.round((stage.stageHeight - stp.height) / 4 * 2);
            stplabel = new TextField(32, 32, stp.value.toString(), new TextFormat('Arial', 16, 0xFFFFFF));
            stplabel.x = stp.x;
            stplabel.y = stp.y + 32;
            addChild(stplabel);
            
            sld = new Slider();
            sld.minimum = 0.0;
            sld.maximum = 1.0;
            sld.step = 0.1;
            sld.value = 0.3;
            sld.addEventListener(Event.CHANGE, onSliderChanged);
            sld.validate();
            addChild(sld);
            sld.x = Math.round((stage.stageWidth - sld.width) / 2);
            sld.y = Math.round((stage.stageHeight - sld.height) / 4 * 3);
            sldlabel = new TextField(64, 64, getsldvalue(sld.value), new TextFormat('Arial', 16, 0xFFFFFF));
            sldlabel.x = sld.x;
            sldlabel.y = sld.y + 32;
            addChild(sldlabel);
        }
        
        private function getsldvalue(arg:Number):String
        {
            var a:Number = Math.round(arg * 10.0);
            var b:Number = Math.round(10 - a);
            var a2:String = a == 0 ? "0" : (a / 10).toString().substr(0, 3);
            var b2:String = b == 0 ? "0" : (b / 10).toString().substr(0, 3);
            trace('arg=' + arg + ', a=' + a + ', b=' + b + ', a2=' + a2 + ', b2=' + b2);
            return "A:" + a2 + "\nB:" + b2
        }
        
        private function onSliderChanged(e:Event):void 
        {
            sldlabel.text = getsldvalue(sld.value);
        }
        
        private function onStepperChanged(e:Event):void 
        {
            stplabel.text = stp.value.toString();
        }
        
        private function onButtonTriggered(e:Event):void 
        {
            var cot:TextCallout = TextCallout.show('Feathers now\nYes', btn);
            cot.fontStyles = new TextFormat('Arial', 24, 0xf8f8f8);
            addChild(cot);
        }
    }
}

[合いの手] 各種UserInterfaceをラクに作ることができるのか。

[話者] swfは787KBになったので掲載はやめておく。2つもライブラリー(Starling, Feathers)を使うと、ファイル容量も大きくなるものだな。

0 件のコメント:

コメントを投稿

人気記事