关于聊天模块点击非富文本,支持人物走路的问题,今天在群里和大伙讨论了一下,其中有个兄弟的方案是这样的:
方案一:
1、用一个文本框TF1将聊天信息显示出来;
2、将富文本(超级链接文本)存储在一个数组;
3、用一个TextField去显示一个富文本,然后盖在原富文本上面;
4、将TF1文本框的mouseEnabled设置为false。
对于这个方案,我觉得能够实现,原理和 图文混排 一样。但是要管理那么多 tf,比较消耗性能,也很繁琐。
经过尝试,我用自己的方法实现了此功能,方法非常简单。
方案二:
描述:聊天窗背景是一个MC(panel),所有的聊天信息用一个tf来显示。
1、用panel和tf侦听鼠标点击事件,对tf侦听LINK事件;
2、panel和tf用同一个函数响应,然后抛出一个自定义事件,在这个自定义事件里将MouseEvent作为参数携带;
3、在寻路代码里面侦听这个自定义事件,然后通过参数MouseEvent可以或许点击的舞台坐标,从而计算人物行走
的目的地。这样就实现了点击非富文本可以寻路的功能。
当然,不是这样做就完事了。这里还有个问题:点击富文本的时候,也会触发click鼠标事。,按照策划的要求,
点击富文本是不能寻路的。经测试发现,click事件发生在link事件之后。所以我在link事件里面将tf的click事件移除,
然后延迟100毫秒后再加上,这样就行了
下面是大致的代码:
1 package 2 { 3 import flash.display.Scene; 4 import flash.display.Sprite; 5 import flash.events.MouseEvent; 6 import flash.events.TextEvent; 7 import flash.text.TextField; 8 import flash.utils.setTimeout; 9 10 public class Text extends Sprite 11 { 12 private var _tf:TextField; 13 private var _panel:Sprite; 14 public function Text() 15 { 16 _tf = new TextField(); 17 _panel = new Sprite(); 18 //... 19 _tf.addEventListener(TextEvent.LINK,onLink); 20 _tf.addEventListener(MouseEvent.CLICK,onClick); 21 _panel.addEventListener(MouseEvent.CLICK,onClick); 22 } 23 24 private function onLink(e:TextEvent):void 25 { 26 // ... 27 //为了点击富文本,不触发click事件,所以临时移除 28 if(_tf.hasEventListener('click')) 29 _tf.removeEventListener(MouseEvent.CLICK,onClick); 30 setTimeout(setEvent,100); 31 } 32 33 private function setEvent():void 34 { 35 _tf.addEventListener(MouseEvent.CLICK,onClick); 36 } 37 38 private function onClick(e:MouseEvent):void 39 { 40 var event:SceneEvent = new ScneEvent();//自定义事件 41 event.data = e; 42 eventDispatcher(event); 43 } 44 } 45 }