MouseOver и MouseOut для линка в тексте. Часть1

Ну вот наконец-то и мой первый пост на блогах, я очень надеюсь что эта информация окажется полезной. Некоторой части AS3 кодеров возможно известно, что у текстового линка в htmlText совершенно невозможно подписаться на MouseOver и MouseOut, а иногда так хочется при наведении на некую часть текста например в хинте к игре показать что-нибудь этакое. Конечно можно вручную подкладывать невидимые кнопки и т.п., ну а если часть текста заскролена? Что же делать в таком случае? Вот мое решение:

//вешаем ParseLink при создании текста (нужно сделать небольшую паузу например в 
//один фрейм после задания текста иначе это свойство будет пустым)

//дополнительно вызываем парсинг ссылок при скроле
hint_text.addEventListener(Event.SCROLL, ParseLinks);

const LINK_HOVER:String = "HOVER";
const LINK_OUT:String = "OUT";
const LINK_CLICK:String = "CLICK";
                
public function ParseLinks(e:Event):void
{
   //создаем массив из всех ссылок встречающихся в тексте
   for each(var match:String in matches)
   {
        /*передаем текст ссылки в функцию создающую невидимую
        кнопку на области в тексте где расположена ссылка*/ 
         createButton(match.replace(/.*?>(.*?)<.*/gi, '$1'));///

   }
}

private function createButton(_linkText:String):void 
{
    var index:Number = hint_text.text.indexOf(_linkText);
    var r:Rectangle = hint_text.getCharBoundaries(index);
    var r2:Rectangle = hint_text.getCharBoundaries(index +_linkText.length-1);
    if(!r2) return;
    r2.x += hint_text.x;
                        
    //делаем всю кнопку (как спрайт) только с возможностью добавить информацию о ссылке
    var textButton:MyButton = drawSprite(r2.x - r.x+r2.width, r.height, _linkText);
    textButton.x = r.x + hint_text.x;
    textButton.y = r.y + hint_text.y;
    //вешаем слушатели для событий мыши 
    textButton.addEventListener(MouseEvent.ROLL_OVER, handlingLinkEvents);
    textButton.addEventListener(MouseEvent.ROLL_OUT, handlingLinkEvents);
    textButton.addEventListener(MouseEvent.CLICK, handlingLinkEvents);
    textButton.buttonMode = true;   
}
        
        
private function drawSprite(w:Number, h:Number, _linkText:*):MyButton 
{
    var s:MyButton = new MyButton();
    s.lnk = _linkText;
    s.graphics.beginFill(0x000000, 0);
    s.graphics.drawRect(0, 0, w, h);
    stage.addChild(s);
    return s;
} 

private function handlingLinkEvents(e:MouseEvent):void 
{               
    var type:String;
    var mybtn:MyButton = e.currentTarget as MyButton;
    switch(e.type)
    {
        case MouseEvent.ROLL_OVER:
             type = LINK_HOVER;

        //вот здесь можно получить тот линк,
        //который передается при создании кнопки. 

        //Здесь можно вещать свое событие (я отнаследовался от EventDispatcher)
                                                        //например 
             break;

        case MouseEvent.ROLL_OUT:
             type = LINK_OUT;                   
             break;

        case MouseEvent.CLICK:
             type = LINK_CLICK;
             break;
     }  

}       


Код самой кнопки до безобразия прост:


package BoxShell{
        import flash.display.Sprite;
        public class MyButton extends Sprite
        {
                public var lnk:*; //переменная для текста ссылки
        }
}


Возможно кто-то предложит более изящное решение, если есть идеи, то обязательно пишите в комменты.

Всем удачи и хорошего настроения;)
  • +10

Комментарии (6)

+1
Не могу представить, зачем использовать в играх html текст ) Да и в коммерческих проектах он у нас мало где используется :)
0
Не скажи, местами html текст — круто.
0
ну да, местами :)
0
Примеры использования в студию. (Откомпилированные)

PS Парсеру от регэкспов поплохело, может воткнуть пробельчик где-нибудь, для красоты.
+1
Окошки с описанием медалек: www.addictinggames.com/action-games/skystorm.jsp
Окошки с описанием ачивментов: www.notdoppler.com/gibbets2.php
0
romamik парсеру уже слегка полегчало) Platon в коммерческих проектах без него точно никуда, да и вообще в любых, где требуется хотя бы минимальное форматирование текста, это как минимум удобно.
Smrdis спасибо, хорошие примеры.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.