![]() |
|
||||||||||
|
|
|
|||||
|
у меня для этой задачи служит такой классик:
package src.utils { import com.greensock.TweenLite; import flash.display.DisplayObjectContainer; import flash.display.InteractiveObject; import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; import flash.text.TextFormat; import flash.utils.Dictionary; import flash.utils.clearTimeout; import flash.utils.setTimeout; public class BubbleText { private static const BUBBLE_COLOR:uint = 0xffffcc; private static const TIMER_TIME:uint = 700; private var _bubbleTimeout:uint; private static var _instance:BubbleText; private static var _stage:DisplayObjectContainer; private var _bubbleObjects:Dictionary = new Dictionary(); private var _textDescription:TextField = new TextField();; private var _textSprite:Sprite = new Sprite(); public function BubbleText(itIsSingleton:PrivateSingleton) { _textSprite.addChild(_textDescription); } public static function gi():BubbleText { if (!_instance) _instance = new BubbleText(new PrivateSingleton()); return _instance; } public static function init(s:DisplayObjectContainer):void { _stage = s; } public function registerObject(object:Sprite, description:String):void { _bubbleObjects[object] = {target:object, description:description}; if (!_stage.hasEventListener(MouseEvent.MOUSE_OVER)) { _stage.addEventListener(MouseEvent.MOUSE_OVER, mouseOverOutHandler, true); _stage.addEventListener(MouseEvent.MOUSE_OUT, mouseOverOutHandler, true); } } private function mouseOverOutHandler(event:MouseEvent):void { var target:Sprite; var check_mc:InteractiveObject = event.target as InteractiveObject; while (check_mc != event.currentTarget as InteractiveObject) { var bubbleObject:Object = _bubbleObjects[check_mc as Sprite]; if (bubbleObject) { target = bubbleObject.target; break; } check_mc = check_mc.parent; } if (!target) return; switch(event.type) { case MouseEvent.MOUSE_OVER: target.addEventListener(MouseEvent.MOUSE_MOVE, mouseOverOutHandler); _bubbleTimeout = setTimeout(displayBubble, TIMER_TIME, target); break; case MouseEvent.MOUSE_MOVE: removeBubble(); _bubbleTimeout = setTimeout(displayBubble, TIMER_TIME, target); break; case MouseEvent.MOUSE_OUT: removeBubble(); target.removeEventListener(MouseEvent.MOUSE_MOVE, mouseOverOutHandler); break; } } private function removeBubble():void { clearTimeout(_bubbleTimeout); _textSprite.graphics.clear(); _textDescription.text = ''; if(_stage.getChildByName(_textSprite.name)) _stage.removeChild(_textSprite); } private function displayBubble():void { var target:Sprite = arguments[0]; _textDescription.defaultTextFormat = new TextFormat('Verdana'); _textDescription.autoSize = TextFieldAutoSize.CENTER; _textDescription.text = _bubbleObjects[target].description; _textDescription.x = 0; _textDescription.y = 0; var gap:uint = 10; _textSprite.graphics.lineStyle(0, 0, 1, true); _textSprite.graphics.beginFill(BUBBLE_COLOR); _textSprite.graphics.drawRoundRect(_textDescription.x-gap, _textDescription.y-gap, _textDescription.width+gap*2, _textDescription.height+gap*2, 10); _textSprite.x = _stage.mouseX; _textSprite.y = _stage.mouseY + 40; if ((_textSprite.x + _textSprite.width) > _stage.stage.stageWidth) _textSprite.x = _stage.mouseX - _textSprite.width + 30 if ((_textSprite.y + _textSprite.height) > _stage.stage.stageHeight) _textSprite.y = _stage.mouseY - _textSprite.height// + 30 _stage.addChild(_textSprite); _textSprite.alpha = 0; TweenLite.to(_textSprite, 0.5, {alpha:1}); } } } class PrivateSingleton { public function PrivateSingleton() {} }
__________________
while(live()) { hope(); } |
|
|||||
|
Цитата:
Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
Цитата:
Если уж на то пошло, тогда мне больше нравится такой вариант: package { public class MySingleton { private static var _instance:MySingleton; //Переменная доступа private static var _isConstructing:Boolean; public function MySingleton() { if (!_isConstructing) throw new Error("Singleton, use MySingleton.instance"); } public static function get instance():MySingleton { if (_instance == null) { _isConstructing = true; _instance = new MySingleton(); _isConstructing = false; } return _instance; } } } А что такое? Детская травма?)
__________________
while(live()) { hope(); } |
|
|||||
|
Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
|
Цитата:
И ещё вопрос по теме для всех. Какой кайф создавать синглтоны и инстансы, когда можно обращаться непосредственно к паблик методам статического класса из любого места программы? Что мешает написать 'Имя класса'.'имя публичного статического метода'() и получить всё, что нужно? |
|
|||||
|
Цитата:
Если дополнить конструктор вот так: То будет уже лучше
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
Регистрация: Oct 2006
Сообщений: 2,283
|
Это что защита для многопоточности?
![]() |
|
|||||
|
Это как раз приватизация конструктора так сказать)
кайф, чтобы у тебя был объектик.=) Так и на сердце спокойней, и диспатчить можно из него, и интерфейсы применять к нему, и удалять. И в целом приятнее. Добавлено через 2 минуты caseyryan пожалуй! Хотя кем жеж это надо быть, чтобы изнутри этого класса пытаться создавать множество инстансов)) Эдак себя бить себя по рукам постоянно надо. ) А извне то все равно больше одного не создашь.
__________________
while(live()) { hope(); } |
|
|||||
|
Цитата:
Туплю. Я не обратил внимание, что там флаг снова ставится в false сразу же после создания. Да, способ хороший. п.с. Малость офтоп, но мне нравится реализация синглтона в C# в Unity using UnityEngine; public class Singleton<T> : MonoBehaviour where T : MonoBehaviour { private static T _instance; private static object _lockObject = new object(); public static T Instance { get { if (applicationIsQuitting) { return null; } lock(_lockObject) { if (_instance == null) { _instance = (T) FindObjectOfType(typeof(T)); if ( FindObjectsOfType(typeof(T)).Length > 1 ) { return _instance; } if (_instance == null) { GameObject singleton = new GameObject(); _instance = singleton.AddComponent<T>(); singleton.name = "(singleton) "+ typeof(T).ToString(); DontDestroyOnLoad(singleton); } } return _instance; } } } private static bool applicationIsQuitting = false; public void OnDestroy () { applicationIsQuitting = true; } } И можно уже обращаться к нему Очень удобная штука, и мне ее катастрофически нехватает в as3 теперь)
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
Регистрация: Oct 2006
Сообщений: 2,283
|
статичный класс будет жить все время, пока работает приложение, а синглтоны можно создавать и удалять когда угодно.
Цитата:
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Класс не может диспатчить события.
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:57. |
|
|
« Предыдущая тема | Следующая тема » |
|
|