|
|
|||||
Качество кода.
Недавняя тема вдохновила меня на выкладывание своего
Если что, Уверен, сейчас посыпется волна суровых критиков и фанатов MVC, который я не использую не потому, что он для меня слишком непонятный или сложный, на самом деле я его вполне понимаю и одобряю, но не использую из принципов. Если что, App - главный класс приложения, который имеет одинаковые константы и паблик переменные во всех проектах. Поэтому критика того, что консоль обращается к App не принимается. Чтобы было понятно, с чем имеем дело, то вот скриншот консоли. P.S. Для фона TextField тоже хотел задать альфу, но не нашёл для этого метода. Если знаете, как, то прошу подсказать.
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 22.05.2014 в 04:06. |
|
|||||
Цитата:
2) Добавляешь под TF спрайт и рисуешь фон в нем по размерам TF с заданной альфой 3) Профит п.с. В лом качать и открывать код. Лучше сюда выкладывать в теги as3
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Цитата:
S.as package com.general { import flash.text.TextFormat; import flash.text.TextFormatAlign; import flash.text.Font; import flash.text.TextField; import flash.display.DisplayObject; public class S { public static const RED:uint = 0xd04242; public static const GREEN:uint = 0x4ade51; public static const DARK_GREEN:uint = 0x68ab51; public static const BLACK:uint = 0x000000; public static const ORANGE:uint = 0xeba326; public static const DARK_ORANGE:uint = 0xdc8620; public static const YELLOW:uint = 0xebe426; public static const LIGHT_BLUE:uint = 0xa9fff8; public static const BLUE:uint = 0x4ac5ff; public static const DARK_BLUE:uint = 0x6a93de; public static const SIREN_BLUE:uint = 0xba7ffe; public static const VIOLET:uint = 0x7d27ff; public static const WHITE:uint = 0xf0fae3; public static const CONSOLAS:int = 0; public static const FINAL_FRONTIER:int = 1; public static function getTextFormat(fontName:int):TextFormat { var font:Font; switch (fontName) { case CONSOLAS: font = new Consolas_font(); break; case FINAL_FRONTIER: font = new FinalFrontier_font(); break; } var tf:TextFormat = new TextFormat(); tf.font = font.fontName; tf.size = 20; tf.align = TextFormatAlign.RIGHT; return tf; } public static function getRedText(font:int):TextFormat { var tf:TextFormat = getTextFormat(font); tf.color = RED; return tf; } public static function getWhiteText(font:int):TextFormat { var tf:TextFormat = getTextFormat(font); tf.color = WHITE; return tf; } public static function getText(color:uint, font:int, align:String, size:Number):TextFormat { var tf:TextFormat = getTextFormat(font); tf.color = color; tf.align = align; tf.size = size; return tf; } public static function appendPadding(tf:DisplayObject, width:int, height:int, padding:int):void { tf.height = height - padding * 2; tf.width = width - padding * 2; tf.x += padding; tf.y += padding; } } } package com.general { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFormatAlign; import flash.events.MouseEvent; import flash.geom.ColorTransform; public class LiteButton extends Sprite { private const BUTTON_COLOR:uint = 0x384434; private const BUTTON_BORDER_COLOR:uint = 0x172113; private const TEXT_COLOR:uint = 0x9ca987; private const ORIGINAL_CT:ColorTransform = new ColorTransform(1,1,1); private const OVER_CT:ColorTransform = new ColorTransform(1.1, 1.1, 1.1); private const HOLD_CT:ColorTransform = new ColorTransform(0.9, 0.9, 0.9); private var _tf:TextField; private var _onClick:Function; private var _over:Boolean; public function LiteButton(caption:String = "", width:int = 75, height:int = 25, onClick:Function = null) { trace("... LiteButton initialized."); _onClick = onClick; drawBackground(width, height); drawTextField(caption); super.buttonMode = true; addListeners(); } public function setCaption(caption:String):void { _tf.text = caption; } private function addListeners():void { super.addEventListener(MouseEvent.MOUSE_DOWN, darkerColor); super.addEventListener(MouseEvent.MOUSE_UP, returnColor); super.addEventListener(MouseEvent.ROLL_OVER, brighterColor); super.addEventListener(MouseEvent.ROLL_OUT, returnColorFromRoll); super.addEventListener(MouseEvent.CLICK, handleClick); } private function handleClick(e:MouseEvent):void { _onClick(); } private function darkerColor(e:MouseEvent):void { super.transform.colorTransform = HOLD_CT; } private function brighterColor(e:MouseEvent):void { _over = true; super.transform.colorTransform = OVER_CT; } private function returnColor(e:MouseEvent):void { if(_over) super.transform.colorTransform = OVER_CT; else super.transform.colorTransform = ORIGINAL_CT; } private function returnColorFromRoll(e:MouseEvent):void { _over = false; super.transform.colorTransform = ORIGINAL_CT; } private function drawBackground(w:int, h:int):void { graphics.lineStyle(1, BUTTON_BORDER_COLOR, 0.7); graphics.beginFill(BUTTON_COLOR, 0.6); graphics.drawRect(0, 0, w, h); graphics.endFill(); } private function drawTextField(text:String):void { _tf = new TextField(); _tf.defaultTextFormat = S.getText(TEXT_COLOR, S.CONSOLAS, TextFormatAlign.CENTER, 12); _tf.mouseEnabled = false; _tf.text = text; _tf.width = super.width; _tf.height = super.height; addChild(_tf); } } } package com.general { import flash.display.Sprite; import flash.text.TextField; import flash.events.MouseEvent; import flash.events.Event; import com.engine.core.App; public class ScrollBar extends Sprite { private const MIN_DRAG_HEIGHT:int = 9; private var _tf:TextField; private var _drag:Sprite; private var _width:int; private var _height:int; public function ScrollBar(tf:TextField, width:int, height:int) { trace("... ScrollBar initialized."); super(); _tf = tf; _width = width; _height = height; _drag = new Sprite(); drawBackground(); drawDrag(); updateDrag(); _drag.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); _tf.addEventListener(Event.SCROLL, updateDrag); } private function drawDrag():void { _drag.graphics.lineStyle(1, 0x435249, 0.7); _drag.graphics.beginFill(0xb9e6ca, 0.6); _drag.graphics.drawRect(0, 0, _width, _height); _drag.graphics.endFill(); } private function startDragging(e:MouseEvent):void { _drag.removeEventListener(MouseEvent.MOUSE_DOWN, startDragging); _tf.removeEventListener(Event.SCROLL, updateDrag); stage.addEventListener(MouseEvent.MOUSE_MOVE, updateDragging); stage.addEventListener(MouseEvent.MOUSE_UP, stopDragging); } private function updateDragging(e:MouseEvent):void { if(mouseY > _drag.height / 2 && mouseY < _height - _drag.height / 2) _drag.y = mouseY - _drag.height / 2; else { if(mouseY <= _drag.height / 2) _drag.y = 0; else _drag.y = _height - _drag.height; } _tf.scrollV = Math.round(_tf.maxScrollV * ((_drag.y) / (_height - _drag.height))); } private function stopDragging(e:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, updateDragging); stage.removeEventListener(MouseEvent.MOUSE_UP, stopDragging); _drag.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); _tf.addEventListener(Event.SCROLL, updateDrag); } private function drawBackground():void { super.graphics.lineStyle(1, 0x0d3d1f, 0.7); super.graphics.beginFill(0x749380, 0.6); super.graphics.drawRect(0, 0, _width, _height); super.graphics.endFill(); super.cacheAsBitmap = true; } public function updateDrag(e:Event = null):void { _drag.scaleY = 1 - _tf.maxScrollV / _tf.height; if(_drag.scaleY < 0.05) { _drag.scaleY = 1; _drag.height = MIN_DRAG_HEIGHT; } _drag.cacheAsBitmap = true; _drag.y = _tf.scrollV / _tf.maxScrollV * (_height - _drag.height); addChild(_drag); } } } package com.general { import flash.display.Sprite; import com.engine.core.App; import flash.text.TextField; import flash.text.TextFormatAlign; import flash.text.TextFieldType; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.events.Event; public class Console extends Sprite { private const CONSOLE_VERSION:String = "Developed by SuriTheAngel. Version: 0.3"; private const CONSOLE_HEIGHT:int = 200; private const PADDING:int = 5; private const SCROLLBAR_WIDTH:int = 10; private const FONT_SIZE:int = 10; private const MAX_MESSAGES:int = 250; private const PROMPT_LINE_HEIGHT:int = 20; private const CLEAR_BTN_OFFSET:int = 5; private var _messages:Vector.<String>; private var _background:Sprite; private var _scrollBar:ScrollBar; private var _logField:TextField; private var _paused:Boolean; private var _pauseBtn:LiteButton; private var _clearBtn:LiteButton; private var _promptField:TextField; public function Console() { _messages = new Vector.<String>(); _messages.push(CONSOLE_VERSION); //Рисуем задний фон. _background = new Sprite(); _background.graphics.lineStyle(1, 0x0d3d1f, 0.7); _background.graphics.beginFill(0x415046, 0.6); _background.graphics.drawRect(0, 0, App.SCR_W - 1, CONSOLE_HEIGHT - 1); _background.graphics.endFill(); //Само окошко консоли, куда будут выводиться сообщения лога. _logField = new TextField(); _logField.defaultTextFormat = S.getText(0xFFFFFF, S.CONSOLAS, TextFormatAlign.LEFT, FONT_SIZE); S.appendPadding(_logField, App.SCR_W - SCROLLBAR_WIDTH, CONSOLE_HEIGHT - PROMPT_LINE_HEIGHT, PADDING); //Скроллбар _scrollBar = new ScrollBar(_logField, SCROLLBAR_WIDTH, _logField.height - PADDING * 2); _scrollBar.x = App.SCR_W - 1 - SCROLLBAR_WIDTH; _scrollBar.y += PADDING; //Нижняя панель консоли (user_prompt) _clearBtn = new LiteButton("Clear", 90, PROMPT_LINE_HEIGHT, clear); _clearBtn.x = App.SCR_W - _clearBtn.width - CLEAR_BTN_OFFSET; _clearBtn.y = CONSOLE_HEIGHT - _clearBtn.height - PADDING; _pauseBtn = new LiteButton("Pause", 90, PROMPT_LINE_HEIGHT, playPause); _pauseBtn.x = _clearBtn.x - _pauseBtn.width - PADDING; _pauseBtn.y = _clearBtn.y; _promptField = new TextField(); _promptField.defaultTextFormat = S.getText(S.WHITE, S.CONSOLAS, TextFormatAlign.LEFT, 12); _promptField.background = true; _promptField.backgroundColor = 0x364a2f; _promptField.borderColor = 0x23331d; _promptField.border = true; _promptField.width = _pauseBtn.x - PADDING * 2; _promptField.height = PROMPT_LINE_HEIGHT; _promptField.x = PADDING; _promptField.y = _pauseBtn.y; _promptField.type = TextFieldType.INPUT; _promptField.addEventListener(KeyboardEvent.KEY_DOWN, type); //Добавляем элементы на сцену //Верхняя часть консоли super.addChild(_background); super.addChild(_logField); super.addChild(_scrollBar); //Нижняя часть консоли super.addChild(_clearBtn); super.addChild(_pauseBtn); super.addChild(_promptField); super.addEventListener(Event.ADDED_TO_STAGE, focus); super.addEventListener(Event.REMOVED_FROM_STAGE, unfocus); } private function focus(e:Event):void { stage.focus = _promptField; } private function unfocus(e:Event):void { App.pStage.focus = App.pStage; _promptField.text = ""; } private function type(e:KeyboardEvent):void { if(e.keyCode == Keyboard.ENTER) { prompt(_promptField.text); _promptField.text = ""; } } public function log(message:String, color:uint = 0xFFFFFF):void { _messages.push("<font color=\"#"+color.toString(16).replace("0x", "") + "\">" + "<b>system: </b>" + message + "</font>"); if(!_paused) update(); } public function prompt(message:String):void { _messages.push("<font color=\"#" + S.LIGHT_BLUE.toString(16).replace("0x", "") + "\">" + "<b>user_prompt: </b>" + message + "</font>"); CommandPrompt.applyCommand(message); update(); } public function clear():void { _messages = null; _messages = new Vector.<String>(); update(); } private function playPause():void { if(!_paused) { _paused = true; _pauseBtn.setCaption("Resume"); } else { _paused = false; _pauseBtn.setCaption("Pause"); update(); } } private function update():void { if(_messages.length >= MAX_MESSAGES) { _messages.splice(0, 50); } var str:String = ""; for(var i:int = 0; i < _messages.length; i ++) { str += _messages[i]; if(i < _messages.length - 1) str += "\n"; } _logField.htmlText = str; _logField.scrollV = _logField.maxScrollV; _scrollBar.updateDrag(); } } } package com.general { import com.adobe.utils.StringUtil; import flash.display.StageDisplayState; import com.engine.core.App; import flash.display.StageScaleMode; public class CommandPrompt { public static function applyCommand(command:String):void { command = command.toLowerCase(); command = StringUtil.trim(command); if(command.indexOf("/") < 0) { App.console.log("Console doesn''t understand you.", S.RED); return; } var operator; if(command.indexOf(" ") > -1) operator = command.substring(0, command.indexOf(" ")).replace("/", ""); else operator = command.replace("/", ""); var property:String = StringUtil.trim(command.substr(command.indexOf(operator) + operator.length)); switch(operator) { case "set": set(property); break; default: App.console.log("Unknown command " + operator + ".", S.RED); break; } } private static function set(whatToSet:String):void { switch(whatToSet) { case "fullscreen": App.pStage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE; break; case "screen-scale-true": App.pStage.scaleMode = StageScaleMode.EXACT_FIT; break; case "screen-scale-false": App.pStage.scaleMode = StageScaleMode.SHOW_ALL; break; default: App.console.log("Unknown property " + whatToSet + ".", S.RED); break; } } } }
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 22.05.2014 в 14:22. |
|
|||||
[+4 06.05.14]
|
SuriTheAngel
по первому 1) class S 2) getTextFormat(fontName:int) // сам понимаешь , что тут написано? Вернуть текстФормат, основываясь не на ТЕКСТОВОМ ПОЛЕ, а на каком то имени шрифта, вопервых, во вторых имя шрифта почему то int. Не надо так 3)getRedText и т.п. , ничего не значащие методы, которые не нужны. Вместо них делается 1 метод getColoredText(color:int) 4) appendPadding(tfisplayObject - паддинг есть только у TF , ты же принимаешь DisplayObject. Правда в данном случае это не паддинг нифига, тогда неверное обозначение tf, вместо диплейОбж 2 Класс более менее, только коллбек onClick нафиг не нужен. Подписаться можно извне. А если он еще что то делает в этом классе, то 2 подписки. Одна внутри, другая снаружи. Console - тут лучше всего ( понятнее ) не focus, unfocus - а setFocus , removeFocus. Метод update я бы сделал открытым, бывают часто такие ситуации, когда нужно обновить извне. Последний читать не стал, отформотируй. Так по сути, конечно это съедобно, по сравнению с предидущим оратором, но - тут простейших view классы, посему особо обсуждать нечего, только лишь читаемость, о которой я пишу.
__________________
Марк Tween |
|
|||||
in4core, спасибо.
1) Это класс для инструментов работы со строками и текстом, и + цвета. Класс используется не только консолью, для удобства. Всё равно косяк? 2) Это сделано для удобного получения текстформата. Пример использования прост tf.defaultTextFormat = S.getText(S.FINAL_FRONTIER, S.SIREN_BLUE, TextFormatAlign.CENTER, 10); 3) + 4) + Цитата:
Цитата:
Цитата:
Да ёпта, хреновый парсер синтаксиса...
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 22.05.2014 в 14:05. |
|
|||||
listener
|
Плох тот флешер, кто не написал собственный логгер .
Убери из трейсов одинарные кавычки, форматирование на форуме на них спотыкается. Код как код, убористый, все линейно. Но лоска явно не хватает. Не понравилось именование. darkerColor () и иже с ними (ожидаем что-то типа clickHandler), appendPadding(), class S, set() и playPause(), _drag, type() - очень неудачные названия. Пихание наружного коллбека в буттон...эмм..не то, чтобы плохо, но вызывает диссонанс. Более ожидаемо (читай стандартно) для кнопки все-таки оповещеть родителя о клике событием. Потом, коллбэки вообще - это довольно радикальная альтернатива ивентам, не следуте торопиться на них подсаживаться. Ну, комментов подсыпать не мешало бы. Выделение секций приват/публик методов так же приветствуется. Логгер еще подразумевает и такую штуку, как лог-левел, можно подумать и над этим. Собственно, логгер - это благодатная тема для прокачки скила . оффтоп. Много раз тут советоваали "Совершенный код" Макконнела. От себя порекомендую "Практика программирования" (Керниган, Пайк). Эта книга в три раза меньше по объему, более сконцентрирована, практична и технична. Читается очень легко, структуирована так, что вполне может использоваться как спаравка. |
|
|||||
Цитата:
А что такое log-level?
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 22.05.2014 в 14:49. |
|
|||||
[+4 06.05.14]
|
Цитата:
log-level - название в принципе говорит само за себя. getStackTrace - посмотри логгер который я писал, если еще не удалили, там это все было.
__________________
Марк Tween |
|
|||||
Оффтоп - посоветуйте уроки по С# и Unity, можно книжку, можно видео, хоть что-то, что поможет научиться творить шедевры и сохранять порядок в C#
__________________
There is no thing in this world that is not simple. |
Часовой пояс GMT +4, время: 17:52. |
|
« Предыдущая тема | Следующая тема » |
|
|