Застрял на интерактивной карте - PullRequest
1 голос
/ 09 июля 2009

ТАК, я приступил к работе в крайний срок для создания гибридной интерактивной карты HTML / Flash, и она еще не закончена. Я продолжаю приближаться к решению каждой проблемы, только чтобы обнаружить больше ошибок. Большинство из них совершенно очевидно, когда вы смотрите на работу. Я хотел бы, по крайней мере, раздавить большие ошибки, поэтому я ОЧЕНЬ благодарен за любые предложения. ПОЖАЛУЙСТА, ПОМОГИТЕ!

По сути, я использую всплывающую подсказку двумя способами: [0] условно на основе Flash на основеMouseMove (работает нормально) и [1] нетрадиционно нацеливаюсь на точку в фильме Flash из списка HTML. Всплывающая подсказка подходит, но находится не в том месте из-за перемещения и масштабирования Карты через TweenLite. Также есть ошибки с событиями onMouseOver / onMouseOut, когда onMouseOver снова запускает onMouseOut, оставляя подсказку видимой, когда она должна иметь _alpha 0.

Ссылка на работу: http://muralapts.com/test/neighborhood.php

---- БОЛЬШАЯ ПРОБЛЕМА # 1: HTML onMouseOver снова запускает onMouseOut, эффективно «возвращая» мою подсказку. Действительно глючит, когда подсказка не исчезнет. Никаких ошибок, поэтому я не могу понять, почему onMouseOver запускается дважды. Кажется, это проблема HTML, а не проблема Flash.

---- БОЛЬШАЯ ПРОБЛЕМА № 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 карты (идентификатор, имя, ссылка, реклама, номер категории [Искусство, Покупки и т. Д.] , номер списка [число в категория]). Использует Magic Parser для визуализации HTML-вывода из того же XML-файла, который использует Flash.

  • HTML / Javascript взаимодействует с пользовательским AS2 компонент карты через внешний интерфейс

  • Карта Первоначально увеличивает масштаб до 140% и перемещается к определенной точке с помощью TweenLite

  • onRollOver точек в фильме Flash показывает всплывающую подсказку с названием места, изменяет цвет точки

  • Кнопки Zoom In / Out устанавливают родительский клип _xscale + _yscale и записывают с TweenLite onUpdate

  • onMouseOver списка в HTML показывает подсказку с данными карты, но в НЕПРАВИЛЬНОМ МЕСТЕ, так как карта была увеличена и перемещена с помощью TWEENLITE. Использование TweenLite onUpdate для записи масштаба родительского клипа + значений размещения.

  • Изменение цвета точки из HTML работает на MouseOver, «липкое» на MouseOut (точки остаются черными)

КОД XML: (показывает одну категорию + список, есть еще много)

 <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 КОД:

 <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>; 

FLASH CODE:

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 голосов
/ 10 июля 2009

О БОЛЬШОМ ВЫПУСКЕ № 2:

Я чувствую, что вроде как понимаю localToGlobal, но он записывает x и y для каждой точки, которая находится далеко от карты.

Родительский фрагмент карты имеет размер 760 x 916 пикселей (при маске @ 400 x 600), однако мой код выводит значение x каждой точки "localToGlobal" между 800 и 1600 - далеко от рабочей области.

OnMouseOver во Flash-фильме, каждый dot._x записывается между 100 и 300, с родительским клипом в 0,0 в левом верхнем углу ... Так откуда же 877? Это связано с тем, что я динамически анимирую _x / _y родительского клипа и увеличиваю _xscale / _yscale (первоначально до 140)?

Как _xscale / _yscale влияет на координаты localToGlobal x?

Я добавил предложенный код, в котором я запускаю точки (одновременно проходя по иерархии XML) - есть 2 цикла, по одному для каждой категории XML [i] и список [g]. Правда, мой код усложнился. Я попытался передать Tooltip то же значение «destX», которое я использовал для перемещения карты, но это не сработало - возможно, потому что я передаю значения относительно самой карты, в то время как Tooltip находится на _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;
 }
0 голосов
/ 23 января 2010

Эй, я не совсем уверен, что у вас проблемы с всплывающей подсказкой, но я использую ту же концепцию в другом приложении. Я помещаю всплывающую подсказку на некоторые 3D-модели дополненной реальности, и у меня возникает проблема с мышью, когда всплывающая подсказка дублируется при нажатии мыши. Я делаю это на 100% во флэш-памяти, поэтому я знаю, что это не проблема HTML.

В любом случае, нашел это в поиске Google и подумал, что я дам вам знать, что это происходит и со мной, и я не использую HTML.

0 голосов
/ 09 июля 2009

используйте 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))
  • тогда, по какой-то неизвестной ошибке, mouseOver будет отправлено сразу после этого ... если mouseOver приходит повторно запросить объект, который уже активен, игнорировать его ...
  • после паузы, установленной тайм-аутом, всплывающая подсказка будет скрыта ...
  • убедитесь, что вы удалили этот идентификатор объекта, иначе вы не сможете активировать всплывающую подсказку для одного и того же объекта дважды, не активировав другой объект между ними ... поэтому поместите activeID = null в removeTip

Надеюсь, это менее понятно ...

эм вызов trickTip onUpdate из showTooltip кажется мне очень странным ... я думаю, вам действительно следует это убрать ... имея функцию, которая одновременно является функцией обновления для анимации и вызывается из внешнего интерфейса , действительно грязно ... лучше поменяй его сейчас, пока знаешь, что он делает ...

хорошо, надеюсь, это поможет ...

Greetz

back2dos

...