ようやく本格的にAS3弄りはじめた。
んでカスタムクラスからstageにダイレクトでアクセスできないとかなにこれな状況でいきなり実家帰りたくなったりしたけどstageに間接的にアクセスするクラスをこしらえてどうにか踏ん張った次第。
やっぱDisplayListまわりがまだつかみきれなくて四苦八苦。
以下コード。
package { import flash.display.Stage; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.LoaderInfo; import flash.display.StageDisplayState; import flash.geom.Rectangle; class StageUtil { private static var _stage:Stage; public function StageUtil() { } public static function init(stage:Stage):void { _stage = stage; } public static function noScale():void { checkRef(); _stage.scaleMode = StageScaleMode.NO_SCALE; } public static function showAll():void { checkRef(); _stage.scaleMode = StageScaleMode.SHOW_ALL; } public static function topLeft():void { checkRef(); _stage.align = StageAlign.TOP_LEFT; } public static function noScaleAndTopLeft():void { checkRef(); _stage.scaleMode = StageScaleMode.NO_SCALE; _stage.align = StageAlign.TOP_LEFT; } public static function lowQuality():void { checkRef(); stage.quality = StageQuality.LOW; } public static function mediumQuality():void { checkRef(); stage.quality = StageQuality.MEDIUM; } public static function highQuality():void { checkRef(); stage.quality = StageQuality.HIGH; } public static function get mouseX():Number { checkRef(); return stage.mouseX; } public static function get mouseY():Number { checkRef(); return stage.mouseY; } public static function get stageWidth():Number { checkRef(); return stage.stageWidth; } public static function get stageHeight():Number { checkRef(); return stage.stageHeight; } public static function get centerX():Number { checkRef(); return stage.stageWidth * 0.5; } public static function get centerY():Number { checkRef(); return stage.stageHeight * 0.5; } public static function get stageRect():Rectangle { checkRef(); return new Rectangle(0, 0, stage.stageWidth, stage.stageHeight); } public static function fullScreen():void { checkRef(); stage.displayState = StageDisplayState.FULL_SCREEN; } public static function normal():void { checkRef(); stage.displayState = StageDisplayState.NORMAL; } public static function set frameRate(value:int):void { checkRef(); stage.frameRate = frameRate; } public static function get frameRate():int { checkRef(); return stage.frameRate; } public static function contextMenuShow():void { checkRef(); _stage.showDefaultContextMenu = true; } public static function contextMenuHide():void { checkRef(); _stage.showDefaultContextMenu = false; } public static function get stage():Stage { checkRef(); return _stage; } private static function checkRef():void { if (_stage == null) { throw new Error("Stageの参照がありません。はじめにStageUtil.init()を実行して下さい。") } } } }
使い方ははじめにドキュメントクラスとかそのままstageにアクセスできるところでStageUtil.init(stage)って具合にStageの参照を渡しとく。(静的クラスなのでインスタンス化は必要なし。いきなりStageUtil.init(stage)でおけ。)
後はもうどのクラスのどこからでもStageUtil経由でStageにアクセスできる。ついでに頻繁に使いそうなセッティングを関数化しといたのでメソッド実行するだけで設定できる。
各メソッド毎回stageの参照の有無チェックしてるんだけど、_stageが空だったらエラー出るからいらんのかな?とか、そもそももっと楽な方法でstageの参照とれんじゃねぇの?とかまだまだ模索状態。