Adobe Acrobat 3D, JavaScript i animacje, część 3

No Comments

No stało się, kończymy naszą cudowną serię z najlepszym pod słońcem oprogramowaniem.
Wybaczcie mi sarkazm, ale dotychczas wydawało mi się, iż Adobe to poważna firma, wypuszczająca poważne oprogramowanie. Niestety.
Ale ja nie o tym miałem…

Jako, że kończymy, trzeba by opisać nasz model i utworzyć ładny interfejs. Na początek utwórzmy w którymś miejscu pole tekstowe. Nazwijmy je np. Text1, nadajmy odpowiedni wygląd, atrybut read only i jako domyślną wartość wpiszmy nazwę pierwszego wariantu produktu, który ma się pokazać po otwarciu dokumentu. Czyli w naszym przypadku “zatyczka, wklad”.
W tym polu tekstowym będą się pojawiać kolejne nazwy wariantów, w momencie kiedy animacja do nich przejdzie.

Teraz utwórzmy w widocznym miejscu przycisk, który będzie głównym obiektem naszego – jakże rozbudowanego – interfejsu. Nadajmy mu jakąś nazwę, przykładowo Button1 i napis (Caption), np. “Pokaż inną wersję”, aby użytkownik miał choć mgliste pojęcie o jego zastosowaniu.

Po kliknięciu tego przycisku ma się ukazywać popup-menu z wyborem wariantu.

Musimy się do tego odpowiednio przygotować. W skrypcie dokumentu, w miejscu deklaracji, umieszczamy dotychczas wspomniane funkcje i obiekty:

  • in_array()
  • extAnim()
  • animList()
  • myPoint()
  • playMe()

oraz skrypt dodający animacje do listy oraz sprawdzenie i przypisanie wartości zmiennej actual.

Musimy jeszcze utworzyć funkcję, która będzie deaktywować nasz przycisk w trakcie trwania animacji (kombinowanie ze zmianą animacji w trakcie trwania sekwencji jest niebezpieczne – wierzcie mi, przerabiałem to):

// funkcja wlaczajace/wylaczajaca przycisk
function buttonCheck()
{
  // jesli nie istnieje lista animacji, wyjdz
  if(myPoint.anim == null)
    return false;
  // jesli ktoras animacja jest uruchomiona, zablokuj przycisk i zakoncz
  for(var a = 0; a < myPoint.anim.length; a++)
    if(myPoint.anim[a][0].getRunning())
    {
      this.getField("Button1").readonly = true;
      return false;
    }
  // zadna animacja nie jest uruchomiona, odblokuj przycisk i usun timer
  this.getField("Button1").readonly = false;
  // pokaż aktualną nazwę produktu
  this.getField("Text1").value = actual;
  app.clearInterval(button_timeout);
}

Pod zdarzenie Mouse Up przycisku (por. “Adobe Acrobat 3D, JavaScript i animacje. Dodatek.”) podpinamy odpowiedni skrypt. Na początku blokowanie przycisku i zerowanie movieIndex:

button_timeout = app.setInterval("buttonCheck()", 10);
var movieIndex = 0;

Teraz tworzenie menu. Jest to proste, jak budowa cepa. W dokumentacji pod popUpMenuEx jest wszystko dokładnie opisane (jak na Adobe).

Przed samym utworzeniem menu, należy ustalić, co w owym menu będzie i która pozycja ma być nieaktywna (obecnie wybrana). W tym celu tworzymy szybką tablicę wariantów:

// tworzenie menu z listy wszystkich produktow
items = new Array();
for(var a = 0; a < myList.points.length; a++)
{
  // nie wyswietlamy produktow "przejsciowych"
  if(myList.points[a].substring(0, 1) != '*')
  {
    var newItem = {};
    newItem.cName = myList.points[a];
    // aktualnie wybrany produkt w menu ma dodatkowe wlasciwosci:
    if(myList.points[a] == actual)
    {
      newItem.bMarked  = true;   // zaznaczony
      newItem.bEnabled = false;  // nieaktywny
      // (domyslnie bMarked == false, bEnabled == true)
    }
    items.push(newItem);
  }
}

Następnie finalizujemy akcję, czyli odpalamy menu i jeśli użytkownik coś wybierze, obliczamy ścieżkę i odpalamy sekwencję animacji:

 
// wyswietlenie menu
var cRtn = app.popUpMenuEx.apply(app, items);
 
// jesli wybrano pozycje menu
if(cRtn != null)
{
  // poczatek tablicy "tu bylem"
  var been = new Array();
  been.push(actual);
 
  // na wszelki wypadek resetowanie statycznej listy punktow. To powinno wejsc w nawyk
  myPoint.way = new Array();
  // TU OBLICZANA JEST NAJKROTSZA SCIEZKA
  graph = new myPoint(actual, null, 0, been, cRtn);
 
  // ustawienie "aktualnego" produktu na wlasnie wybrany
  actual = cRtn;
 
  // funkcja uruchamiajaca kolejne animacje
  anim_timeout = app.setInterval("playMe()", 10);
}

i… to by było na tyle!

Ktokolwiek będzie musiał przejść tę samą drogę przez mękę, mam nadzieję, że będzie miał przeze mnie ułatwione zadanie…

Leave a Reply

Your email address will not be published. Required fields are marked *