被困在交互式地图上

时间:2009-07-08 23:20:28

标签: xml map actionscript-2 tooltip externalinterface

所以,我在HTML / Flash混合交互式地图的截止日期前开始接触电线,并且它几乎没有完成。我一直在接近解决每个问题,只是为了发现更多的错误。当你看到这些作品时,大多数都很明显。我想至少压制大错,所以我非常感谢任何建议。请帮助!

基本上,我使用工具提示有两种方式:[0]传统上基于Flash的onMouseMove(工作正常),[1]非常规地从HTML列表中定位Flash电影中的一个点。工具提示很好,但由于Map移动和放大,它位于错误的位置。通过TweenLite进行扩展。 onMouseOver / onMouseOut事件也存在错误,其中onMouseOver再次触发onMouseOut,当它应该具有_alpha为0时,工具提示可见。

链接到作品:http://muralapts.com/test/neighborhood.php

---- BIG ISSUE#1: HTML onMouseOver再次触发onMouseOut,有效地“重新开启”我的工具提示。当Tooltip不会消失时真的看起来很烦人。没有错误,因此我无法弄清楚为什么onMouseOver会发射两次。似乎是一个HTML问题,而不是Flash问题。

---- BIG ISSUE#2:由于父剪辑被缩放,因此从页面左侧的HTML列表触发的工具提示显示在错误的位置与TweenLite一起移动。工具提示附加到_root,但是在几个容器剪辑(未在下面指定的路径)中“定位”一个点。我试图得到像这样的工具提示位置:

Tooltip._x = ( dot._x + parentClip._x ) * parentClip._xscale/100;
Tooltip._y = ( dot._y + parentClip._y ) * parentClip._yscale/100;

交互式地图详情:

  • XML内容动态生成 HTML和Flash地图数据(id,name, 链接,模糊,类别编号 [艺术, 购物等] ,列表编号 [内的数字 类别])。使用Magic Parser从Flash正在使用的相同XML文件中呈现HTML输出。

  • HTML / Javascript与自定义AS2对话 通过外部接口映射组件

  • 地图最初放大到140%并使用TweenLite移动到某个点

  • Flash电影中onRollOver的点显示带有地名的工具提示,更改点颜色

  • 放大/缩小按钮设置父剪辑_xscale + _yscale并使用TweenLite onUpdate录制

  • HTML的列表中的onMouseOver显示了具有地图数据的工具提示,但是在错误的位置,因为地图已经缩放&与TWEENLITE一起搬家。使用TweenLite onUpdate记录父剪辑的缩放+位置值。

  • 从HTML改变点的颜色onMouseOver,onMouseOut是“粘性的”(点保持黑色)

XML CODE:(显示一个类别+列表,还有更多)

 <category title="Arts &amp; Entertainment">
     <loc id="artsWest_mc" name="Arts West" website="http://www.artswest.org/" cat="0" num="0">
         <content><![CDATA[The Junction's thriving community playhouse &amp; art gallery.]]></content>
     </loc>
  </category>

HTML CODE:

 <script type="text/javascript"><!--
      function showTooltip(btnID,catNum,listNum) {
          thisMovie("map").showTooltip(btnID,catNum,listNum);
      }
      function removeTip(btnID, catNum, isExternal) {
          thisMovie("map").removeTip(btnID, catNum, true);
      }
      function thisMovie(movieName) {
          if (navigator.appName.indexOf("Microsoft") != -1) {
              return window[movieName]
          } else {
              return document[movieName]
          }
      }
      //--></script>

 <a onMouseOver="showTooltip( btnID, categoryNum, listingNum )" onMouseOut="removeTip()">Arts West</a>; 

闪断代码:

public function showTooltip( bt:MovieClip, catNum:Number, listNum:Number ){ //MOVES MAP & SHOWS TOOLTIP
      TweenLite.to(map_mc, 1, {_x:destX, _y:destY, ease:'easeOutQuad',
          onUpdate: trickTip, 
          onUpdateParams: [bt, contentArr[catNum].childNodes[listNum].attributes.name] 
       });

}
public function trickTip( btnID:MovieClip, btnName:String ){    //CALLED FROM EXTERNAL INTERFACE
      theTip.theText.text = btnName;
      theTip._x = ((btnID._x + btnID._parent._x) * (map_mc._xscale/100)) - (theTip._width *.75);

      theTip._y = ((btnID._y + btnID._parent._y) * (map_mc._yscale/100)) + 20;

      TweenLite.to(theTip, .01, {_alpha:99, overwrite:1});
}

public function removeTip( bt:MovieClip, catNum:Number ){
       TweenLite.to(theTip, .01, {_alpha:0, overwrite:1});
 }

3 个答案:

答案 0 :(得分:0)

使用MovieClip::localToGlobal作为职位问题......

import flash.geom.Point;

var pt:Point = new Point();
dot.localToGlobal(pt);//dot being the clip with the position you actually need ...
//pt.x and pt.y are the required positions now ...

关于奇怪的HTML行为,如果不调试自己,我无法帮助你...我不是那么多的专家... :-D

快速修复可能会延迟工具提示隐藏:

  • 一个先决条件是,您始终将活动对象存储在某个变量中,例如activeID ...
  • 当你得到一个mouseOut,然后设置一个超时...也许100-200毫秒...(做一个额外的函数,将从JS调用,基本上setTimeOut(removeTip, 100, bt, catNum)
  • 然后,通过一些未知的bug,mouseOver将在之后发送...如果mouseOver重新请求已经激活的对象,请忽略它...
  • 在超时提供暂停后,工具提示将被隐藏......
  • 确保删除该对象ID,否则,您将无法激活同一对象的工具提示两次而不激活其中的其他对象...所以将activeID = null放入removeTip

我希望,这更不清楚......

来自showTooltip的uTm调用技巧提示onUpdate对我来说似乎很奇怪...我认为你应该真的清理它...有一个函数,这是一个补间的更新函数,并且是从外部接口调用的,真是凌乱......现在更好地改变它,你知道它做了什么......

好吧,希望这会有所帮助......

格尔茨

back2dos

答案 1 :(得分:0)

关于BIG ISSUE#2:

我觉得我理解localToGlobal,但它正在为离开地图的每个点记录xy

父地图片段是760 x 916像素(屏蔽@ 400 x 600),但是我的代码输出是将每个点的“localToGlobal”x值记录在800到1600之间 - 离开舞台。

Flash影片中的OnMouseOver,每个dot._x记录在100到300之间,左边的父剪辑位于0,0 ...那么877来自哪里?是因为我动态地设置父剪辑的_x / _y动画并增加_xscale / _yscale(最初为140)?

_xscale / _yscale如何影响localToGlobal x坐标?

我添加了建议的代码,其中我启动了点(同时循环遍历XML层次结构) - 有2个循环,每个XML类别[i]和列出[g]。不可否认,我的代码变得复杂了。我尝试将Tooltip传递给我用于移动地图的相同“destX”值,但这不起作用 - 可能是因为我相对于地图本身传递值,而工具提示位于_root上。这是localToGlobal应该帮助的地方吗?

 /////* Map.as */////

 private function initMap() {
    // contentArr = XML Array
    for(var i:Number = 0; i < contentArr.length; i++){
       categories = contentArr[i].childNodes;
       numCategories = categories.length;

      for(var g:Number = 0; g < numCategories; g++){

         dotIDs = categories[g].attributes.id;  
         dot = map_mc[dotIDs];
              // link dot movieClips on Stage to each XML listing   

         dot.catNum = i; // category number - Arts [0], Shopping[1], etc.
         dot.listingNum = g; // each indiv. listing number

         pt = new Point(); // New code
         pt = eval('pt_' + i + '_' + g); //Appending cat/list numbers for unique ids
         ptArray.push(pt);
         ptArray['pt_' + i + '_' + g] = {x:dot._x, y:dot._y};
         dot.localToGlobal(ptArray['pt_' + i + '_' + g]);
         }
    }
 }

 // ˘˘being called from externalInterface
 public function showTooltip(bt, catNum, listNum){ 

      var newBT = eval(_root.mapContainer_mc.map_mc + '.' + bt); 
      // so I don't have to use the entire path in HTML
      goto(newBT, catNum, listNum); 
 }
 public function goto(bt, catNum, listNum){ // moves map, calls Tooltip.trickTip()
      destX = 0-(bt._x-(mask_mc._width/3));
      destY = 0-(bt._y-(mask_mc._height/3));

      if(destX < 10-(map_mc._width-mask_mc._width)) destX = 10-(map_mc._width-mask_mc._width);
      if(destY < 10-(map_mc._height-mask_mc._height)) destY = 10-(map_mc._height-mask_mc._height);
      if(destX > 10) destX = 10;
      if(destY > 10) destY = 10;

      TweenLite.to(map_mc, 1, {_x:destX, _y:destY, ease:'easeOutQuad', overwrite:3, 
      onUpdate:trickTip, 
      onUpdateParams:[ bt, 
                       catNum, 
                       listNum, 
     /* theText*/      contentArr[catNum].childNodes[listNum].attributes.name
                       ]
       });
 }

 /////* Tooltip.as */////

 public function trickTip(catNum:Number, listNum:Number, theText:String):Void {

      theTip._x = ptArray['pt_'+catNum+'_'+listNum].x; //Somewhere way off stage
      theTip._y = ptArray['pt_'+catNum+'_'+listNum].y;
 }

答案 2 :(得分:0)

嘿我不确定你的工具提示问题,但是我在不同的应用程序上使用相同的概念。我正在为一些增强现实3D模型提供一个工具提示,我有一个鼠标悬停问题,工具提示在鼠标输出上重复。我在flash中100%这样做,所以我知道它不是HTML问题。

无论如何,在谷歌搜索中发现了这一点,我想我会告诉你它也发生在我身上而且我不使用HTML。