New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. ·...

76

Transcript of New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. ·...

Page 1: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości
Page 2: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszejpublikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innympowoduje naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymiich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacjebyły kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie,ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor orazWydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkodywynikłe z wykorzystania informacji zawartych w książce.

Redaktor prowadzący: Michał Mrowiec

Projekt okładki: Studio Gravite / OlsztynObarek, Pokoński, Pazdrijowski, Zaprucki

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adreshttp://helion.pl/user/opinie?flacpoMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Kody źródłowe wybranych przykładów dostępne są pod adresem:ftp://ftp.helion.pl/przyklady/flacpo.zip

ISBN: 978-83-246-3065-3

Copyright © Helion 2013

Printed in Poland.

Page 3: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Spis tre�ciRozdzia� 1. Wprowadzenie ...............................................................................13

Dostępne biblioteki 3D ...................................................................................................................14Away3D ......................................................................................................................................14Alternativa3D ............................................................................................................................16Papervision3D ...........................................................................................................................18FIVe3D .......................................................................................................................................20Flare3D .......................................................................................................................................21Sandy3D .....................................................................................................................................23Sophie3D ....................................................................................................................................24

Wybór biblioteki 3D .......................................................................................................................25Pobieranie silnika Away3D ............................................................................................................26

Away3D FP9, FP10 czy może FP11? ......................................................................................27Pobieranie Away3D 3.6.0 z Away3D.com .............................................................................27Pobieranie Away3D 3.6.0 z github.com .................................................................................28Pobieranie Away3D 3.6.0 z SVN .............................................................................................28

Instalacja biblioteki Away3D .........................................................................................................31Konfiguracja w Adobe Flash CS4 i CS5 .................................................................................31Konfiguracja we FlashDevelop ................................................................................................32Konfiguracja w Adobe Flash Builder 4 ..................................................................................35

Podsumowanie ................................................................................................................................37

Rozdzia� 2. Podstawy biblioteki Away3D .......................................................... 39Podstawowe komponenty ..............................................................................................................39

View3D .......................................................................................................................................40Scene3D ......................................................................................................................................43Camera3D ..................................................................................................................................45Object3D ....................................................................................................................................46ObjectContainer3D ...................................................................................................................49

Podstawowa budowa aplikacji w Away3D ..................................................................................50Położenie obiektów w przestrzeni .................................................................................................53Układ współrzędnych w Away3D .................................................................................................54Podsumowanie ................................................................................................................................59

Poleć książkęKup książkę

Page 4: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

6 Flash i ActionScript. Aplikacje 3D od podstaw

Rozdzia� 3. Obiekty .........................................................................................61Base ....................................................................................................................................................62

Vertex ..........................................................................................................................................62Mesh ............................................................................................................................................65Segment ......................................................................................................................................68Face .............................................................................................................................................72

Sprites ................................................................................................................................................76Klasa bazowa ..............................................................................................................................77Sprite3D ......................................................................................................................................81MovieClipSprite ........................................................................................................................83DirectionalSprite .......................................................................................................................85

Primitives ..........................................................................................................................................87Przykład ......................................................................................................................................88AbstractPrimitive ......................................................................................................................94LineSegment ............................................................................................................................100Trident ......................................................................................................................................101Triangle .....................................................................................................................................102Plane ..........................................................................................................................................104GridPlane .................................................................................................................................106RegularPolygon .......................................................................................................................107Cube ..........................................................................................................................................109RoundedCube ..........................................................................................................................111Sphere .......................................................................................................................................112GeodesicSphere .......................................................................................................................114Torus .........................................................................................................................................115TorusKnot ................................................................................................................................116Cylinder ....................................................................................................................................118Cone ..........................................................................................................................................120SeaTurtle ...................................................................................................................................122Arrow ........................................................................................................................................123WirePlane .................................................................................................................................125WireCube .................................................................................................................................126WireCone .................................................................................................................................128WireCylinder ...........................................................................................................................129WireSphere ..............................................................................................................................130WireRegularPolygon ..............................................................................................................132WireTorus ................................................................................................................................133

Skybox .............................................................................................................................................134Skybox .......................................................................................................................................135Skybox6 .....................................................................................................................................138

Podsumowanie ..............................................................................................................................139

Poleć książkęKup książkę

Page 5: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Spis tre�ci 7

Rozdzia� 4. Materia�y ....................................................................................143Przygotowanie zasobów dla aplikacji .........................................................................................144

Dodawanie plików do zasobów w programie Adobe Flash ..............................................144Odwoływanie się do zasobów w kodzie źródłowym aplikacji ..........................................147

Przykład ..........................................................................................................................................150Linie .................................................................................................................................................164

WireframeMaterial .................................................................................................................164WireColorMaterial .................................................................................................................165

Kolor ...............................................................................................................................................167ColorMaterial ..........................................................................................................................167EnviroColorMaterial ..............................................................................................................168

Bitmapy ...........................................................................................................................................170BitmapMaterial ........................................................................................................................170BitmapFileMaterial .................................................................................................................172EnviroBitmapMaterial ............................................................................................................174GlassMaterial ...........................................................................................................................175TransformBitmapMaterial .....................................................................................................178

Animowane ....................................................................................................................................181MovieMaterial .........................................................................................................................181AnimatedBitmapMaterial ......................................................................................................183VideoMaterial ..........................................................................................................................185

Mieszanie materiałów ...................................................................................................................187Podsumowanie ..............................................................................................................................188

Rozdzia� 5. �wiat�o ....................................................................................... 191Rodzaje świateł ..............................................................................................................................192

Klasa bazowa dla przykładów ................................................................................................192AmbientLight3D .....................................................................................................................194PointLight3D ...........................................................................................................................196DirectionalLight3D .................................................................................................................199

Materiały reagujące na światło ....................................................................................................202Klasa bazowa dla przykładów ................................................................................................202PhongColorMaterial ...............................................................................................................204ShadingColorMaterial ............................................................................................................206PhongBitmapMaterial ............................................................................................................207WhiteShadingBitmapMaterial ..............................................................................................209PhongMovieMaterial ..............................................................................................................210Dot3BitmapMaterial ...............................................................................................................212Dot3BitmapMaterialF10 ........................................................................................................214Dot3MovieMaterial ................................................................................................................216PhongMultiPassMaterial ........................................................................................................218

Podsumowanie ..............................................................................................................................220

Poleć książkęKup książkę

Page 6: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

8 Flash i ActionScript. Aplikacje 3D od podstaw

Rozdzia� 6. Modele i animacje ......................................................................... 2233ds Max ....................................................................................................................................224Maya ..........................................................................................................................................224LightWave ................................................................................................................................225Blender ......................................................................................................................................226MilkShape 3D ..........................................................................................................................227CharacterFX .............................................................................................................................228Google SketchUp .....................................................................................................................229PreFab3D ..................................................................................................................................230

Low poly i High poly .....................................................................................................................231Format plików obsługiwanych w Away3D ................................................................................232

3DS ............................................................................................................................................232ASE ............................................................................................................................................232OBJ ............................................................................................................................................232DAE ...........................................................................................................................................232MD2 ..........................................................................................................................................233AWD .........................................................................................................................................233AS ..............................................................................................................................................233

Konwertowanie modelu do klasy ActionScript ........................................................................233Klasa AS3Exporter ..................................................................................................................233Eksport z programu PreFab3D .............................................................................................241Eksport z programu Blender .................................................................................................244Eksport z programu Autodesk 3ds Max ..............................................................................246

Stosowanie modeli 3D w Away3D ..............................................................................................248Przykładowa aplikacja ............................................................................................................2483DS ............................................................................................................................................263OBJ ............................................................................................................................................266ASE ............................................................................................................................................268DAE ...........................................................................................................................................269MD2 ..........................................................................................................................................271AWD .........................................................................................................................................273

Stosowanie animacji modeli ........................................................................................................275AnimationData i AnimationDataType ................................................................................275AnimationLibrary ...................................................................................................................277Animator i AnimatorEvent ...................................................................................................277Zastosowanie animacji w przykładzie ..................................................................................279

Podsumowanie ..............................................................................................................................280

Poleć książkęKup książkę

Page 7: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Spis tre�ci 9

Rozdzia� 7. Praca z obiektami ........................................................................ 283Biblioteki do animacji ...................................................................................................................284

Pobieranie i instalacja biblioteki GreenSock Tweening Platform ....................................284Wybór biblioteki GreenSock Tweening Platform ..............................................................285Implementacja TweenMax ....................................................................................................285

Klasa bazowa ..................................................................................................................................286Przemieszczanie .............................................................................................................................294

Właściwości ..............................................................................................................................294Metody ......................................................................................................................................295

Obracanie .......................................................................................................................................301Właściwości ..............................................................................................................................302Metody ......................................................................................................................................303

Skalowanie ......................................................................................................................................309Właściwości ..............................................................................................................................309Metody ......................................................................................................................................310

Macierz transformacji ...................................................................................................................311Czym jest macierz transformacji? .........................................................................................311Tworzenie macierzy transformacji .......................................................................................312

Modyfikowanie powierzchni obiektu .........................................................................................313PathExtrusion ..........................................................................................................................313HeightMapModifier ................................................................................................................319Elevation i SkinExtrude ..........................................................................................................325Explode i Merge .......................................................................................................................331

Podsumowanie ..............................................................................................................................337

Rozdzia� 8. Interaktywno�� ........................................................................... 339Używanie klawiatury .....................................................................................................................340

Klasa KeyboardEvent ..............................................................................................................340Klasa Keyboard ........................................................................................................................341Klasa KeyLocation ...................................................................................................................343Sterowanie statkiem kosmicznym w przestrzeni ................................................................344

Używanie myszy ............................................................................................................................352MouseEvent .............................................................................................................................352Obracanie i skalowanie statku kosmicznego .......................................................................353MouseEvent3D ........................................................................................................................359Metody dla zdarzeń MouseEvent3D ....................................................................................361Malowanie na trójwymiarowych obiektach ........................................................................361Rozmieszczanie obiektów na planszy ...................................................................................367

Podsumowanie ..............................................................................................................................384

Poleć książkęKup książkę

Page 8: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

10 Flash i ActionScript. Aplikacje 3D od podstaw

Rozdzia� 9. Kamery ...................................................................................... 387Podstawy działania kamer w Away3D .......................................................................................388

Rejestrowanie sceny w Away3D ............................................................................................388Podstawowe pojęcia i właściwości kamer w Away3D ........................................................389

Rodzaje soczewek ..........................................................................................................................406Przykład ....................................................................................................................................406AbstractLens ............................................................................................................................414ZoomFocusLens i PerspectiveLens .......................................................................................415SphericalLens ...........................................................................................................................415OrthogonalLens .......................................................................................................................417

Rodzaje kamer ...............................................................................................................................418Camera3D ................................................................................................................................418TargetCamera3D .....................................................................................................................420HoverCamera3D .....................................................................................................................421SpringCam ...............................................................................................................................422

Przykładowe zastosowania kamer ...............................................................................................425Kamera z perspektywy pierwszej osoby ...............................................................................425Kamera z perspektywy osoby trzeciej ...................................................................................443Kamera stosowana w grach typu action RPG .....................................................................451

Podsumowanie ..............................................................................................................................461

Rozdzia� 10. D�wi�k ..................................................................................... 465Klasy obsługujące dźwięk .............................................................................................................465

Sound3D ...................................................................................................................................465SimplePanVolumeDriver .......................................................................................................467

Przykłady zastosowań ...................................................................................................................468Dźwięk 3D ................................................................................................................................468Kontrolowanie obiektów dźwiękiem ....................................................................................477

Podsumowanie ..............................................................................................................................487

Rozdzia� 11. Tekst ........................................................................................ 489Przygotowanie czcionki ................................................................................................................490Sposoby wyświetlania tekstu ........................................................................................................492

Tekst płaski ..............................................................................................................................492Tekst przestrzenny ..................................................................................................................496Materiały dla tekstu ................................................................................................................497Tekst jako BitmapData ...........................................................................................................498Tekst w obiekcie MovieClip ..................................................................................................499

Deformowanie tekstu ....................................................................................................................499Podsumowanie ..............................................................................................................................503

Poleć książkęKup książkę

Page 9: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Spis tre�ci 11

Rozdzia� 12. Optymalizacja ............................................................................ 505Statystyki aplikacji .........................................................................................................................506

Away3D Project stats ..............................................................................................................506AwayStats .................................................................................................................................508Hi-ReS-Stats .............................................................................................................................509

Wyświetlanie zawartości ..............................................................................................................510Sposoby przycinania widoku .................................................................................................510Stosowanie filtrów ...................................................................................................................516Ogólne wskazówki ..................................................................................................................521

Obiekty ............................................................................................................................................522Stosowanie obiektów LOD ....................................................................................................522Stosowanie narzędzia Weld ...................................................................................................527Ogólne wskazówki ..................................................................................................................530

Tekstury i światło ..........................................................................................................................531Ogólne wskazówki ..................................................................................................................531

Rozdzia� 13. Wi�cej zabawy z 3D .................................................................. 533Fizyka i kolizje ...............................................................................................................................534

Wykrywanie kolizji w Away3D .............................................................................................534Dodatkowe silniki fizyki .........................................................................................................538

Rzeczywistość rozszerzona ...........................................................................................................541FLARToolKit ...........................................................................................................................543FLARManager .........................................................................................................................544IN2AR .......................................................................................................................................545

Kontrolery ......................................................................................................................................546Xbox Kinect .............................................................................................................................546Wii Remote ..............................................................................................................................547

Stage3D ...........................................................................................................................................548O przygotowaniu środowiska do Stage3D słów kilka ........................................................548Co to jest Stage3D? ..................................................................................................................555Gdzie umieszczony jest Stage3D? .........................................................................................556Ograniczenia związane ze Stage3D .......................................................................................557Jak korzystać ze Stage3D? ......................................................................................................558Podstawowe pojęcia związane ze Stage3D ...........................................................................559Podstawowy szkielet dla aplikacji korzystającej ze Stage3D .............................................563

AGAL ..............................................................................................................................................565Co to jest AGAL? .....................................................................................................................566Podstawowe komendy języka AGAL ...................................................................................566

Poleć książkęKup książkę

Page 10: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

12 Flash i ActionScript. Aplikacje 3D od podstaw

Rejestry w języku AGAL ........................................................................................................567Zastosowanie kodu AGAL wraz z ActionScript .................................................................570

Away3D 4.x ....................................................................................................................................578Instalacja biblioteki .................................................................................................................579Podstawowy przykład z kulą ziemską ..................................................................................579

Skorowidz ....................................................................................................591

Poleć książkęKup książkę

Page 11: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8.Interaktywno��

Jedną z głównych zalet pisania aplikacji na platformę Flash jest to, że można two-rzyć ciekawe interaktywne gry i strony internetowe. W tego typu projektach więk-szość operacji wykonywanych jest za pomocą myszki, klawiatury i coraz częściejkamer. Jeżeli masz jakieś doświadczenie w realizacji tego typu projektów, z pewno-ścią łatwo połączysz zdobytą wiedzę z informacjami zawartymi w tym rozdziale.Jeżeli są to Twoje początki z aplikacjami tworzonymi na platformę Adobe FlashPlayer, nie przejmuj się, na tym etapie wiesz już wystarczająco dużo.

Tym, co łączy zwykłe dwuwymiarowe aplikacje z projektami bazującymi na biblio-tece Away3D, jest to, że w obu przypadkach można korzystać z urządzeń takichjak mysz czy klawiatura. Stosując szereg standardowych metod, zdarzeń z Action-Script 3.0 oraz Away3D, można zaprogramować odpowiednie operacje, którewywoływane będą przez ingerencję użytkownika.

Czytając ten rozdział, dowiesz się:

� Jak obsługuje się zdarzenia wciśnięcia i zwolnienia klawisza klawiatury.

� Czym są i jakie role odgrywają klasy KeyboardEvent, Keyboard oraz KeyLocation.

� Jak sterować trójwymiarowym obiektem za pomocą klawiatury.

� Czym jest klasa MouseEvent3D.

� W jakich sytuacjach i jak stosować MouseEvent oraz MouseEvent3D.

� Jak przemieszczać trójwymiarowe obiekty przy użyciu myszki.

� Jak malować po powierzchni trójwymiarowych obiektów.

Poleć książkęKup książkę

Page 12: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

340 Flash i ActionScript. Aplikacje 3D od podstaw

U�ywanie klawiaturyW większości gier i innych aplikacji niekiedy obiekty sterowane są za pomocąklawiatury. W aplikacjach Flash do wykrywania czynności wykonywanych przezużytkownika na klawiaturze stosuje się obiekt zdarzenia KeyboardEvent.

Klasa KeyboardEvent

Klasa KeyboardEvent, ponieważ reprezentuje obiekt zdarzenia, zlokalizowana jestw pakiecie flash.events. Ma ona dwie stałe: KeyboardEvent.KEY_DOWN i KeyboardEvent.KEY_UP, które określają przypadki wciśnięcia i zwolnienia klawisza na klawiaturze.Aby móc korzystać z tych zdarzeń, należy metodę addEventListener wywołać naobiekcie stage, tak jak to pokazano poniżej:

stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);stage.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);

Samo wywołanie detektora nie wystarczy do podjęcia konkretnych akcji. W cielemetody wywoływanej podczas wystąpienia zdarzenia należy rozpoznać, któryklawisz zmienił swój stan. Do tego celu służą dwie właściwości: keyCode i charCode.Pierwsza zwraca wartość numeryczną odpowiadającą numerowi klawisza, a drugaokreśla wartość liczbową kodu znaku wciśniętego klawisza.

Istnieje zasadnicza różnica między wartościami tych właściwości. Polega ona natym, że kod klawisza jest przypisany do konkretnego klawisza fizycznego, natomiastkod znaku jest przypisany do konkretnego znaku. Czyli jeśli na przykład chcemywykorzystać klawisz 5 na klawiaturze numerycznej i w górnym rzędzie, należy od-wołać się do wartości właściwości charCode.

Domyślny zestaw kodów znaków UTF-8 zawiera w swoim zbiorze identyfikatorydla każdego ze znaków z osobna, odróżnia tym samym wielkość liter.

Na klawiaturze umieszczone są również klawisze specjalne, takie jak Ctrl, Alt czyShift. Do określenia, czy któryś z tych klawiszy zmienił swój stan, służą specjalnewłaściwości: ctrlKey, altKey i shiftKey. Wartości tych właściwości są typu Boolean,gdzie true oznacza, że klawisz jest wciśnięty.

Tabele 8.1, 8.2 oraz 8.3 zawierają metody, właściwości i stałe klasy KeyboardEvent.

Poleć książkęKup książkę

Page 13: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 341

Tabela 8.1. Właściwości klasy KeyboardEvent

Nazwa Rodzaj Wartość domyślna Opis

altKey Boolean false Określa, czy klawisz Alt jest wciśniętyctrlKey Boolean false Określa, czy klawisz Ctrl jest wciśniętycontrolKey Boolean false Określa, czy klawisz Control jest wciśniętycommandKey Boolean false Określa, czy klawisz Command jest wciśniętyshiftKey Boolean false Określa, czy klawisz Shift jest wciśniętycharCode uint Wartość liczbowa kodu znaku wciśniętego klawiszakeyCode uint Wartość liczbowa odpowiadająca numerowi

klawisza na klawiaturzekeyLocation uint Położenie klawisza na klawiaturze

Tabela 8.2. Metody klasy KeyboardEvent

Nazwa Opis

KeyboardEvent(type:String, bubbles:Boolean,cancelable:Boolean, charCodeValue:uint,keyCodeValue:uint, keyLocationValue:uint,ctrlKeyValue:Boolean, altKeyValue:Boolean,shiftKeyValue:Boolean, controlKeyValue:Boolean,commandKeyValue:Boolean)

Konstruktor

updateAfterEvent Określa, czy po zakończeniuprzetwarzania zdarzenia obraz powinienbyć zrenderowany, jeżeli listawyświetlania została zmodyfikowana

Tabela 8.3. Stałe klasy KeyboardEvent

Nazwa Opis

KEY_DOWN Definiuje zdarzenie wciśnięcia klawiszaKEY_UP Definiuje zdarzenie zwolnienia wciśniętego klawisza

Klasa Keyboard

Keyboard jest klasą typu final, umieszczoną w pakiecie flash.ui. Ma ona zdefiniowa-ne kody większości znaków w postaci stałych publicznych. Do jej metod oraz wła-ściwości można odwoływać się bez tworzenia obiektu. Dzięki tym cechom Keyboardstanowi swego rodzaju słownik do stosowania w instrukcjach warunkowych takichjak if czy switch.

Poleć książkęKup książkę

Page 14: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

342 Flash i ActionScript. Aplikacje 3D od podstaw

switch(event.charCode){ case Keyboard.UP: trace('Wci�ni�to klawisz górnej strza�ki'); break; case Keyboard.DOWN: trace('Wci�ni�to klawisz dolnej strza�ki'); break; case Keyboard.LEFT: trace('Wci�ni�to klawisz lewej strza�ki'); break; case Keyboard.RIGHT: trace('Wci�ni�to klawisz prawej strza�ki'); break;}

Tabele 8.4 i 8.5 zawierają metody i właściwości klasy Keyboard. Ważniejsze odnich są jednak stałe umieszczone w tabeli 8.6. Keyboard ma dużą liczbę stałych,dlatego przedstawiono tylko niektóre z nich.

Tabela 8.4. Właściwości klasy Keyboard

Nazwa Rodzaj Wartość domyślna Opis

capsLock Boolean false Określa, czy klawisz Caps Lock jestwciśnięty

hasVirtualKeyboard Boolean false Określa, czy udostępniona jestklawiatura wirtualna

numLock Boolean false Określa, czy klawisz Num Lock jestwciśnięty

physicalKeyboardType String Określa rodzaj klawiatury

Tabela 8.5. Metody klasy Keyboard

Nazwa Opis

isAccessible():Boolean Określa, czy ostatnio wciśnięty klawisz jest dostępny dla innychplików SWF

Tabela 8.6. Stałe klasy Keyboard

Nazwa Opis

A … Z Klawisze alfabetyczneNUMBER_0 … NUMBER_9 Klawisze numeryczne umieszczone w górnym rzędzieNUMPAD_0 … NUMPAD_9 Klawisze numeryczne umieszczone na klawiaturze numerycznejF1 … F12 Klawisze funkcyjneENTER Klawisz EnterESCAPE Klawisz EscCONTROL Klawisz CtrlBACKSPACE Klawisz BackspaceSPACE Klawisz spacjiLEFT Klawisz lewej strzałki

Poleć książkęKup książkę

Page 15: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 343

Tabela 8.6. Stałe klasy Keyboard (ciąg dalszy)

Nazwa Opis

RIGHT Klawisz prawej strzałkiUP Klawisz górnej strzałkiDOWN Klawisz dolnej strzałki

Klasa KeyLocation

W tabeli 8.1 punktu „Klasa KeyboardEvent” wspomniano o tym, że właściwośćkeyLocation określa położenie wciskanego lub zwalnianego klawisza. W sytuacjigdy dany klawisz ma swoje duplikaty w innych miejscach na klawiaturze, zasto-sowanie tej właściwości pozwala na odróżnienie na przykład lewego i prawegoklawisza Ctrl, co umożliwia przypisanie każdemu innych działań. Do określeniawartości właściwości keyLocation klasy KeyboardEvent służą stałe klasy KeyLocation.

Zlokalizowana w pakiecie flash.ui klasa KeyLocation — tak samo jak Keyboard —jest klasą z przypisanym atrybutem final. KeyLocation można traktować jakomały słownik, który ma w swoich zasobach określenia dostępnych pozycji naklawiaturze.

if(event.charCode == Keyboard.CONTROL && event.keyLocation ==�KeyLocation.LEFT){ trace('Wci�ni�to lewy Ctrl');}else if(event.charCode == Keyboard.CONTROL && event.keyLocation ==�KeyLocation.RIGHT){ trace('Wci�ni�to prawy Ctrl');}else{ trace('Wci�ni�to inny klawisz');}

Ponieważ klasa KeyLocation nie ma swoich metod i właściwości, tylko stałe okre-ślające położenie, w tym punkcie uwzględniono jedną tabelę 8.7.

Tabela 8.7. Stałe klasy KeyLocation

Nazwa Opis

D_PAD Określa, czy wciśnięty klawisz znajduje się na panelu kierunkowymLEFT Określa, czy wciśnięty klawisz znajduje się po lewej stronie klawiaturyRIGHT Określa, czy wciśnięty klawisz znajduje się po prawej stronie klawiatury

Poleć książkęKup książkę

Page 16: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

344 Flash i ActionScript. Aplikacje 3D od podstaw

Tabela 8.7. Stałe klasy KeyLocation (ciąg dalszy)

Nazwa Opis

NUM_PAD Określa, czy wciśnięty klawisz znajduje się na klawiaturze numerycznej lub w jejwirtualnym odpowiedniku

STANDARD Określa, czy pozycja klawisza nie została określona w konkretnych pozycjach

Sterowanie statkiem kosmicznym w przestrzeni

Skoro poznaliśmy klasy obsługujące interakcje użytkownika z użyciem klawiatury,przyszedł czas na zastosowanie zdobytej wiedzy w praktyce. Do tego celu wykorzy-stamy możliwość sterowania futurystycznym pojazdem w przestrzeni kosmicznej.Aplikacja ta składa się z dwóch warstw. Pierwsza to przestrzeń trójwymiarowa,w której porusza się pojazd, druga warstwa to element interfejsu użytkownika,w którym widoczne są aktualna prędkość pojazdu oraz spis klawiszy i akcji, jakiewywołują. Całość przedstawiono na rysunku 8.1.

Rysunek 8.1. Zrzut ekranu z aplikacji sterowania statkiem kosmicznym

Widoczny statek kosmiczny to jeden z darmowych modeli w formacie 3DS, któresą dostępne w sieci. W pozycji początkowej pojazd ten skierowany jest dziobemw stronę osi Z. Gdy wciskamy klawisze lewej i prawej strzałki, obiekt obraca się

Poleć książkęKup książkę

Page 17: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 345

wokół osi Z. Natomiast klawiszami strzałki górnej i dolnej odpowiednio podnosi sięi opuszcza dziób. Wprawienie w ruch statku kosmicznego następuje po wciśnięciuklawisza spacji. Zwroty i skręty uzależnione są od kąta nachylenia pojazdu i prędkości,z jaką się porusza. Standardowo prędkość jest równa 50, lecz można ją zwięk-szyć, wciskając klawisz A, lub zmniejszyć klawiszem Z. Aby szybko zredukowaćprędkość do jej standardowej wartości, wystarczy użyć klawisza C. W sytuacji gdystracimy pojazd z pola widzenia, można przywrócić go do pozycji początkowej,wciskając klawisz X, lub namierzyć kamerą jego pozycję, używając klawisza T.

Ponieważ kamery zostaną omówione dopiero w rozdziale 9. „Kamery”, skorzy-stamy ze standardowej, utworzonej wraz z widokiem.

Teraz przepisz i skompiluj kod źródłowy tego przykładu, a następnie zajmiemy sięomawianiem jego poszczególnych fragmentów.

package{ import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.geom.Vector3D; import flash.ui.Keyboard; // import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.loaders.Loader3D; import away3d.loaders.Max3DS; import com.greensock.TweenMax; public class KeyboardEventsExample extends Sprite { private var view:View3D; private var speed:Number = 5; private var shipLoader:Loader3D; private var ship:ObjectContainer3D; private var leftArrowDown:Boolean = false; private var rightArrowDown:Boolean = false; private var upArrowDown:Boolean = false; private var downArrowDown:Boolean = false; private var spaceDown:Boolean = false; private var trackShip:Boolean = false; private var speedMonitor:Monitor;

public function KeyboardEventsExample():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); }

Poleć książkęKup książkę

Page 18: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

346 Flash i ActionScript. Aplikacje 3D od podstaw

private function init(e:Event = null):void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; removeEventListener(Event.ADDED_TO_STAGE, init); addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(Event.RESIZE, onResize); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

view = new View3D(); view.x = stage.stageWidth * .5; view.y = stage.stageHeight * .5; addChild(view); view.camera.z = -100;

speedMonitor = new Monitor(); speedMonitor.txt.text = String(speed * 10); addChild(speedMonitor);

loadShipModel(); onResize(); }

private function onResize(e:Event = null):void { universe.x = stage.stageWidth * .5; universe.y = stage.stageHeight * .5; view.x = stage.stageWidth * .5; view.y = stage.stageHeight * .5; speedMonitor.y = stage.stageHeight - 100; speedMonitor.x = 100; }

private function loadShipModel():void { ship = new ObjectContainer3D(); shipLoader = Max3DS.load('../../resources/models/max3ds/spaceship/ �spaceship.3DS'); shipLoader.rotationY = -90; shipLoader.rotationX = 90; shipLoader.position = new Vector3D(0, 0, 0); ship.addChild(shipLoader); view.scene.addChild(ship); }

private function onKeyDown(e:KeyboardEvent):void { if (e.keyCode == Keyboard.C) { speed = 5; speedMonitor.txt.text = String(speed * 10);

Poleć książkęKup książkę

Page 19: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 347

} if (e.keyCode == Keyboard.A) { speed += .5; speedMonitor.txt.text = String(speed * 10); } if (e.keyCode == Keyboard.Z) { speed -= .5; speedMonitor.txt.text = String(speed * 10); } if (e.keyCode == Keyboard.LEFT) leftArrowDown = true; if (e.keyCode == Keyboard.RIGHT) rightArrowDown = true; if (e.keyCode == Keyboard.UP) upArrowDown = true; if (e.keyCode == Keyboard.DOWN) downArrowDown = true if (e.keyCode == Keyboard.SPACE) spaceDown = true; }

private function onKeyUp(e:KeyboardEvent):void { if (e.keyCode == Keyboard.LEFT) leftArrowDown = false; if (e.keyCode == Keyboard.RIGHT) rightArrowDown = false; if (e.keyCode == Keyboard.UP) upArrowDown = false; if (e.keyCode == Keyboard.DOWN) downArrowDown = false if (e.keyCode == Keyboard.SPACE) spaceDown = false; if (e.keyCode == Keyboard.X) { trackShip = false; view.camera.lookAt(new Vector3D(0, 0, 0)); TweenMax.to(ship, 1, { x:0, y:0, z:0, rotationY:0, rotationX:0, �rotationZ:0 } ); }

if (e.keyCode == Keyboard.T) { trackShip = !trackShip; } }

private function onEnterFrame(e:Event):void { if (spaceDown) ship.moveForward(speed); if (leftArrowDown) ship.roll(-5); if (rightArrowDown) ship.roll(5); if (upArrowDown) ship.pitch(5); if (downArrowDown) ship.pitch( -5);if (trackShip) view.camera.lookAt(ship.scenePosition); view.render(); } }}

Poleć książkęKup książkę

Page 20: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

348 Flash i ActionScript. Aplikacje 3D od podstaw

W tym przykładzie skorzystaliśmy z podstawowych klas języka ActionScript 3.0między innymi do obsługi zdarzeń użycia klawiatury, słownika kodów klawiszyoraz wyświetlenia interfejsu.

import flash.display.MovieClip;import flash.events.KeyboardEvent;import flash.ui.Keyboard;

Z Away3D poza widokiem użyliśmy klas służących do ładowania i umieszczaniana scenie zewnętrznych obiektów 3D. W tym konkretnym przypadku modeliw formacie 3DS.

import away3d.containers.ObjectContainer3D;import away3d.containers.View3D;import away3d.loaders.Loader3D;import away3d.loaders.Max3DS;

Dodatkowo do ustawienia statku w pozycji zerowej sceny skorzystaliśmy z bi-blioteki TweenMax.

import com.greensock.TweenMax;

W klasie KeyboardEventsExample na początku zdefiniowaliśmy potrzebne obiektyi zmienne. Jako obiekt reprezentujący model 3D statku kosmicznego wykorzy-staliśmy obiekt klasy Loader3D i nazwaliśmy go shipLoader. Wewnętrzne ustawieniapozycji modelu uzależnione są od tego, jak został on wyeksportowany. Dlategowłaśnie zawartość obiektu shipLoader umieścimy w kontenerze o nazwie ship, abyw jego wnętrzu dokonywać zmian.

Obiekt o nazwie speedMonitor klasy Monitor to reprezentant obiektu interfejsu.Kolejne linijki to zmienne stosowane do obsługi pojazdu. Zmienna speed to stopieńzmiany prędkości statku, z kolei trackShip określa, czy kamera ma śledzić obiektstatku, czy nie. Zmienne: leftArrowDown, rightArrowDown, upArrowDown, downArrowDownoraz spaceDown określają, czy wybrany klawisz został wciśnięty.

private var view:View3D;private var shipLoader:Loader3D;private var ship:ObjectContainer3D;private var speedMonitor:Monitor;private var speed:Number = 5;private var trackShip:Boolean = false;private var leftArrowDown:Boolean = false;private var rightArrowDown:Boolean = false;private var upArrowDown:Boolean = false;private var downArrowDown:Boolean = false;private var spaceDown:Boolean = false;

W konstruktorze uruchamiamy metodę init(), z chwilą gdy obiekt stage zostaniezainicjowany.

Poleć książkęKup książkę

Page 21: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 349

if (stage) init();else addEventListener(Event.ADDED_TO_STAGE, init);

W metodzie init() w pierwszych dwóch linijkach usunęliśmy detektor zdarzeniaEvent.ADDED_TO_STAGE i utworzyliśmy nowy dla Event.ENTER_FRAME. W kolejnychlinijkach ustawiliśmy właściwości dla okna aplikacji i dodaliśmy kolejne reje-stratory zdarzeń dla obiektu stage. Pierwszy z nich uruchamia metodę onResize()z każdą zmianą rozmiarów okna. Kolejne dwa słuchają zdarzeń wciśnięciai zwolnienia klawiszy klawiatury.

removeEventListener(Event.ADDED_TO_STAGE, init);addEventListener(Event.ENTER_FRAME, onEnterFrame);stage.scaleMode = StageScaleMode.NO_SCALE;stage.align = StageAlign.TOP_LEFT;stage.addEventListener(Event.RESIZE, onResize);stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

W dalszej części metody init() stworzyliśmy widok Away3D i zmieniliśmy po-zycję kamery na osi Z, tak aby przybliżyć ją do obiektu statku kosmicznego.

view = new View3D();addChild(view);view.camera.z = -100;

Po utworzeniu widoku dodaliśmy obiekt speedMonitor, który przedstawia listę do-stępnych klawiszy i prędkość pojazdu. Wyświetloną w panelu użytkownika pręd-kość początkową uzyskaliśmy z iloczynu wartości zmiennej speed i liczby 10.

speedMonitor = new Monitor();speedMonitor.txt.text = String(speed * 10);addChild(speedMonitor);

Na końcu init() wywołujemy metodę loadShipModel() i onResize(), aby ustawićwszystkie obiekty w odpowiednim miejscu.

loadShipModel();onResize();

W metodzie onResize() centrujemy widok Away3D oraz obiekt typu movieClipo nazwie universe. Obiekt universe to gwieździste tło, które zostało bezpośrednioumieszczone w głównym oknie aplikacji. Z kolei obiekt interfejsu użytkownikaumieszczamy w lewym dolnym rogu okna.

universe.x = stage.stageWidth * .5;universe.y = stage.stageHeight * .5;view.x = stage.stageWidth * .5;view.y = stage.stageHeight * .5;speedMonitor.y = stage.stageHeight - 100;speedMonitor.x = 100;

Poleć książkęKup książkę

Page 22: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

350 Flash i ActionScript. Aplikacje 3D od podstaw

Metoda loadShipModel() służy do pobrania modelu z konkretnej lokalizacjii umieszczenia go na scenie. W pierwszej kolejności stworzyliśmy obiekt klasyObjectContainer3D o nazwie ship, który będzie służył jako kontener dla pobranegomodelu. Następnie pobierany jest model w formacie 3DS za pomocą klasy Max3DSi jej metody load.

Po załadowaniu zmieniliśmy kąt nachylenia statku na osi Y oraz X i ustawiliśmy je-go pozycję w miejscu zerowym kontenera. Na końcu umieściliśmy obiekt na scenie.

ship = new ObjectContainer3D();shipLoader = Max3DS.load('models/spaceship/spaceship.3ds');shipLoader.rotationY = -90;shipLoader.rotationX = 90;shipLoader.position = new Vector3D(0, 0, 0);ship.addChild(shipLoader);view.scene.addChild(ship);

W sytuacji gdy model pochodzi z nieznanych źródeł, warto wcześniej sprawdzićw Away3D, jak prezentuje się on na scenie. Może dojść do tego, że jego skala i pozycjanie odpowiadają konkretnym potrzebom. W takiej sytuacji, jeżeli nie mamy możliwościedytowania modelu, można umieścić go w kontenerze ObjectContainer3D i w jegownętrzu skorygować skalę bądź kąty nachylenia, na końcu ustawiając jego pozycję.Dzięki temu unikniemy konieczności przestawiania całej sceny i kamery, abyuzyskać oczekiwany efekt.

Metoda onKeyDown() w całości składa się z instrukcji warunkowych. W tym miejscusprawdzane są wartości klawiszy i przypisywane odpowiednie akcje bądź wartościzmiennym określającym stan używanych klawiszy.

W sytuacji gdy wartość keyCode zdarzenia KeyboardEvent równa jest Keyboard.C,prędkość redukowana jest do wartości początkowej.

if (e.keyCode == Keyboard.C){ speed = 5; speedMonitor.txt.text = String(speed * 10);}

Z kolei gdy wartość keyCode zdarzenia KeyboardEvent równa jest Keyboard.A, prędkośćstatku zwiększa się o 0.5.

if (e.keyCode == Keyboard.A){ speed += .5; speedMonitor.txt.text = String(speed * 10);}

Zmniejszenie prędkości następuje po wciśnięciu klawisza Z, którego wartośćkeyCode równa jest Keyboard.Z.

Poleć książkęKup książkę

Page 23: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 351

if (e.keyCode == Keyboard.Z){ speed -= .5; speedMonitor.txt.text = String(speed * 10);}

Aby zachować ciągłość akcji sterowania statkiem, nie modyfikujemy w tym miejscujego pozycji, lecz przypisujemy wartość typu Boolean właściwościom, które w meto-dzie onEnterFrame() będą wskazywały na wciskane przez użytkownika klawisze.

Zdarzenie KeyboardEvent.KEY_DOWN uruchamiane jest jedynie przy zmianie stanu,w jakim znajduje się klawisz, dlatego zapisanie zmiany pozycji w metodzie onKey-Down() spowodowałoby pojedyncze przejście dla każdego wciśniętego klawisza.

if (e.keyCode == Keyboard.LEFT) leftArrowDown = true;if (e.keyCode == Keyboard.RIGHT) rightArrowDown = true;if (e.keyCode == Keyboard.UP) upArrowDown = true;if (e.keyCode == Keyboard.DOWN) downArrowDown = trueif (e.keyCode == Keyboard.SPACE) spaceDown = true;

W metodzie onKeyUp() również zawarliśmy instrukcje warunkowe if, ale tutajsprawdzaliśmy stan klawisza i przypisywaliśmy odpowiedniej zmiennej wartośćfalse. Nie mogliśmy wszystkim naraz przypisać wartości false, ponieważ mogłobyto przerwać ciągłość innej akcji.

if (e.keyCode == Keyboard.LEFT) leftArrowDown = false;if (e.keyCode == Keyboard.RIGHT) rightArrowDown = false;if (e.keyCode == Keyboard.UP) upArrowDown = false;if (e.keyCode == Keyboard.DOWN) downArrowDown = falseif (e.keyCode == Keyboard.SPACE) spaceDown = false;

W przypadku wystąpienia warunku, w którym wciśnięty jest klawisz X, zapisaliśmyzmianę wartości zmiennej trackShip na false oraz skierowaliśmy kamerę w stronęśrodka sceny. Poza tym korzystając z klasy TweenMax, stworzyliśmy animację, w któ-rej statek kosmiczny powraca do swojej pierwotnej pozycji.

if (e.keyCode == Keyboard.X){ trackShip = false; view.camera.lookAt(new Vector3D(0, 0, 0)); TweenMax.to(ship, 1, { x:0, y:0, z:0, rotationY:0, rotationX:0,rotationZ:0 } );}

W warunku wciśnięcia klawisza T zapisaliśmy zmianę wartości trackShip na prze-ciwną do aktualnie ustawionej.

if (e.keyCode == Keyboard.T){ trackShip = !trackShip;}

Poleć książkęKup książkę

Page 24: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

352 Flash i ActionScript. Aplikacje 3D od podstaw

W metodzie onEnterFrame(), która jest stale wywoływana, użyliśmy wszystkichzmiennych, których wartości zmieniają się w metodach onKeyDown() oraz onKeyUp().W zależności od tego, która ze zmiennych równa jest wartości true, wykonywa-na jest akcja obrotu bądź przesunięcia. Dodatkowo jeżeli wartość trackShip równajest true, kamera przy każdym odświeżeniu ustawia się w kierunku pozycji statku.

if (spaceDown) ship.moveForward(speed);if (leftArrowDown) ship.roll(-5);if (rightArrowDown) ship.roll(5);if (upArrowDown) ship.pitch(5);if (downArrowDown) ship.pitch(-5);if (trackShip) view.camera.lookAt(ship.scenePosition);view.render();

U�ywanie myszyW poprzednim podrozdziale pokazaliśmy, jak z użyciem klawiatury manipulowaćtrójwymiarowymi obiektami umieszczonymi na scenie. Poparliśmy to przykłademsterowania pojazdem kosmicznym. Jak jednak wiadomo, w aplikacjach Flash czę-ściej stosuje się mysz komputerową niż klawiaturę. Dlatego w tym podrozdzialeprzyjrzymy się możliwym sposobom zastosowania tego urządzenia wraz z bi-blioteką Away3D.

MouseEvent

Jak wiemy, w języku ActionScript 3.0 dostępna jest klasa MouseEvent, której obiektobsługuje zdarzenia związane z myszą. W zwykłych aplikacjach dwuwymiaro-wych zdarzeń myszy można nasłuchiwać na obiektach potomnych względemklasy InteractiveObject, czyli prawie na każdym widocznym obiekcie. Niestety,na obiektach trójwymiarowych umieszczonych na scenie Away3D nie ma możli-wości bezpośredniego stosowania zdarzeń klasy MouseEvent. Mimo to są sytuacje,w których można połączyć stosowanie klasy MouseEvent z obiektami trójwymia-rowymi. Pierwszy sposób polega na zastosowaniu klasy MovieClipSprite, którąpoznaliśmy w rozdziale 3. „Obiekty”. Jak pamiętamy, wyświetlana w obiekcie kla-sy MovieClipSprite tekstura ma postać obiektu klasy DisplayObject. Skutkiem tegona powierzchni tej tekstury można korzystać ze zdarzeń MouseEvent. Nie tylkona obiekcie klasy MovieClipSprite można stosować zdarzenia MouseEvent. Otóżw rozdziale 4. „Materiały” poznaliśmy klasy MovieMaterial, PhongMovieMaterial orazDot3MovieMaterial, dla których źródłem wyświetlanej grafiki są obiekty klas Spriteoraz MovieClip. Jak wiemy, bezpośrednio na obiekcie zarówno klasy Sprite, jaki MovieClip można wywołać zdarzenia MouseEvent, ale gdy używamy ich wewnątrz

Poleć książkęKup książkę

Page 25: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 353

któregoś z wyżej wymienionych materiałów, są one niedostępne dla wskaźnikamyszy. Jest to normalny stan, który można zmienić, nadając właściwości inte-ractive wybranego materiału wartość true.

Inny sposób wykorzystania zdarzeń MouseEvent do modyfikowania obiektów 3Dpolega na pobieraniu współrzędnych wskaźnika myszy i przekazywaniu ich dosceny Away3D. Wykrywając zmianę pozycji kursora myszki w oknie aplikacji,można na obiekcie umieszczonym w przestrzeni trójwymiarowej wykonaćczynności takie jak skalowanie, przesunięcie czy też obrót. W przykładzie umiesz-czonym w kolejnym punkcie tego podrozdziału odniesiemy się do tego sposobuinterakcji z użyciem myszki komputerowej.

Obracanie i skalowanie statku kosmicznego

Widocznym elementem w tym przykładzie będzie jedynie model statku ko-smicznego zastosowany wcześniej w punkcie „Sterowanie statkiem kosmicznymw przestrzeni”. Pozycją początkową dla pojazdu będzie środek przestrzeni trój-wymiarowej. Sam model zostanie skierowany dziobem wzdłuż osi Z. Poruszająckursorem, będzie można doprowadzić model do różnych pozycji i wymiarów.Przykładowe ustawienia zaprezentowano na rysunku 8.2.

Rysunek 8.2. Przykładowe ustawienia pozycji i wymiarów modelu

Poleć książkęKup książkę

Page 26: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

354 Flash i ActionScript. Aplikacje 3D od podstaw

Aby zmienić pozycję modelu statku kosmicznego, należy wcisnąć lewy przyciskmyszy i trzymając go, poruszać kursorem w różne strony okna aplikacji. Wciśnięciei trzymanie przycisku powoduje zmianę wartości jednej ze zmiennych, która jestwarunkiem podejmowania działań obrotu. Bez tego każde poruszenie kursorem,nawet nieplanowe, powodowałoby modyfikacje.

Aby dodatkowo przy poruszaniu kursorem kontrolować wymiary modelu, należyużyć klawisza Ctrl. Cały mechanizm wyjaśnimy przy omawianiu kodu źródłowegotego przykładu. Teraz przepisz i skompiluj następujący kod.

package{ import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.geom.Vector3D; // import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.loaders.Loader3D; import away3d.loaders.Max3DS; public class MouseEventExample extends Sprite { private var view:View3D; private var shipLoader:Loader3D; private var ship:ObjectContainer3D; private var mouseDown:Boolean = false; private var ctrlDown:Boolean = false; private var xPos:Number; private var yPos:Number; private var ease:Number = .3;

public function MouseEventExample():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); }

private function init(e:Event = null):void { stage.quality = StageQuality.LOW; stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; removeEventListener(Event.ADDED_TO_STAGE, init); addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(Event.RESIZE, onResize);

Poleć książkęKup książkę

Page 27: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 355

stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); // view = new View3D(); addChild(view); view.camera.z = -50; // ship = new ObjectContainer3D(); shipLoader = Max3DS.load(' ../../resources/models/max3ds/spaceship/ �spaceship.3DS'); shipLoader.rotationY = -90; shipLoader.rotationX = 90; shipLoader.position = new Vector3D(0, 0, 0); ship.addChild(shipLoader); view.scene.addChild(ship); // onResize(); }

private function onMouseDown(e:MouseEvent):void { mouseDown = true; }

private function onMouseUp(e:MouseEvent):void { mouseDown = false; }

private function onKeyDown(e:KeyboardEvent):void { if (e.keyCode == Keyboard.CONTROL) ctrlDown = true; }

private function onKeyUp(e:KeyboardEvent):void { if (e.keyCode == Keyboard.CONTROL) ctrlDown = false; }

private function onResize(e:Event = null):void { view.x = stage.stageWidth * .5; view.y = stage.stageHeight * .5; }

private function onEnterFrame(e:Event):void { xPos = stage.mouseX - stage.stageWidth * .5; yPos = stage.mouseY - stage.stageHeight * .5;

Poleć książkęKup książkę

Page 28: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

356 Flash i ActionScript. Aplikacje 3D od podstaw

if (mouseDown && !ctrlDown) { ship.rotationY += (xPos * .5 - ship.rotationY) * ease; ship.rotationX += (yPos * .5 - ship.rotationX) * ease; } else if (mouseDown && ctrlDown) { ship.scale(Math.sqrt(xPos * xPos + yPos * yPos)*.01); }

view.render(); } }}

W tym przykładzie najważniejszą dla nas klasą z pakietu flash jest oczywiścieMouseEvent. Z Away3D, tak samo jak w poprzednich przykładach tego rozdziału,skorzystaliśmy z modelu 3DS. Dlatego potrzebowaliśmy klas Loader3D, Max3DSi ObjectContainer3D do umieszczenia modelu statku na scenie.

Na początku ciała klasy MouseEventExample zdefiniowaliśmy obiekt widoku Away3D,obiekty służące do pobrania i wyświetlenia modelu 3DS oraz kilka zmiennych.Pierwsza w kolejności mouseDown przyjmuje wartości typu Boolean i określa, czylewy przycisk myszy jest wciśnięty. Jeżeli jest, to wartość tej właściwości równasię true. Kolejną zmienną, którą dodaliśmy, jest ctrlDown. Jej wartość również jesttypu Boolean i określa, czy został wciśnięty klawisz Ctrl. Właściwości xPos oraz yPosto zmienne liczbowe, które określają odległość pozycji kursora od środka oknaaplikacji. Ich wartości są modyfikowane przy każdym odświeżeniu stołu monta-żowego. Ostatnia zmienna ease odpowiada za złagodzenie przejścia między pozy-cjami bądź wymiarami modelu pojazdu. Jej wartość w trakcie uruchamiania orazużywania programu nie zmienia się, dlatego można zdefiniować ją jako wartośćstałą.

private var view:View3D;private var shipLoader:Loader3D;private var ship:ObjectContainer3D;private var mouseDown:Boolean = false;private var ctrlDown:Boolean = false;private var xPos:Number;private var yPos:Number;private var ease:Number = .3;

Podobnie jak w poprzednich konstruktorach dla klas przykładów, i tutaj, gdy obiektstage jest gotowy, uruchamiamy metodę init().

if (stage) init();else addEventListener(Event.ADDED_TO_STAGE, init);

Poleć książkęKup książkę

Page 29: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 357

Na początku metody init() ustawiliśmy jakość generowanego obrazu na pozio-mie LOW. W następnej kolejności wyłączyliśmy skalowanie okna oraz wyrównaliśmystół montażowy do lewego górnego rogu. Dzięki temu aplikacja będzie działałapłynniej i przy powiększeniu okna zwiększymy obszar działania kursora.

stage.quality = StageQuality.LOW;stage.scaleMode = StageScaleMode.NO_SCALE;stage.align = StageAlign.TOP_LEFT;

W kolejnych linijkach kodu metody init() usunęliśmy detektor zdarzenia Event.ADDED_TO_STAGE i utworzyliśmy szereg nowych. Kolejność, z jaką je dodaliśmy,jest przypadkowa. Pierwszy detektor odpowiada za nasłuchiwanie zdarzeniaEvent.ENTER_FRAME i wywołanie metody onEnterFrame(). W drugiej kolejności dodali-śmy detektor dla zmiany rozmiarów okna aplikacji Event.RESIZE. Kolejne dwadetektory nasłuchują zdarzeń MouseEvent.MOUSE_DOWN oraz MouseEvent.MOUSE_UP,które odpowiadają za kliknięcie i puszczenie przycisku myszki. Podobne zadanieprzydzieliliśmy detektorom zdarzeń KeyboardEvent.KEY_DOWN i KeyboardEvent.KEY_UP,z tą różnicą, że one wskazują na kliknięcie bądź zwolnienie klawisza na klawiaturze.

removeEventListener(Event.ADDED_TO_STAGE, init);addEventListener(Event.ENTER_FRAME, onEnterFrame);stage.addEventListener(Event.RESIZE, onResize);stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

Po ustaleniu detektorów zdarzeń stworzyliśmy i dodaliśmy obiekt widoku biblio-teki Away3D. Dodatkowo przybliżyliśmy kamerę do pozycji -50 na osi Z, tak abystatek w swojej początkowej pozycji był dobrze widoczny.

view = new View3D();addChild(view);view.camera.z = -50;

Gdy widok został dodany, stworzyliśmy obiekt statku kosmicznego, korzystającz ustawień z poprzednich przykładów tego rozdziału. Po pobraniu modelu zapomocą klasy Max3DS obróciliśmy go tak, aby dziobem, zwrócony był w stronę osi Z.Następnie umieściliśmy go w kontenerze o nazwie ship i dodaliśmy go do sceny.

ship = new ObjectContainer3D();shipLoader = Max3DS.load('models/spaceship/spaceship.3ds');shipLoader.rotationY = -90;shipLoader.rotationX = 90;shipLoader.position = new Vector3D(0, 0, 0);ship.addChild(shipLoader);view.scene.addChild(ship);

Na końcu bloku kodu metody init() odwołaliśmy się do metody onResize().

Poleć książkęKup książkę

Page 30: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

358 Flash i ActionScript. Aplikacje 3D od podstaw

Kolejnymi metodami, które zapisaliśmy w klasie MouseEventExample, są onMouseDown()oraz onMouseUp(). Gdy wciśnięty jest lewy przycisk myszki, wywoływana jest meto-da onMouseDown(), w której właściwości mouseDown przypisywana jest wartość true.

Z kolei po puszczeniu przycisku myszy wartość mouseDown() zostaje zmieniona nafalse w metodzie onMouseUp().

Idąc tym torem, zapisaliśmy metody onKeyDown() oraz onKeyUp(), które uruchamia-ne są z każdym wciśnięciem i zwolnieniem klawisza na klawiaturze. Jednak niekażde wywołanie tych metod powoduje zmiany. Wewnątrz obu metod zastoso-waliśmy instrukcję warunkową if. Obie filtrują kody wciskanych i zwalnianychklawiszy w celu wychwycenia wartości numerycznej odpowiadającej numerowiklawisza Ctrl. Jeżeli klawisz ten zostanie wciśnięty, to w metodzie onKeyDown()zmienna ctrlDown zmieni swoją wartość na true. Z kolei po puszczeniu przyciskuCtrl w metodzie onKeyUp() zmienna ctrlDown zmieni swoją wartość na false.

Przy każdej zmianie rozmiaru okna uruchamiana jest metoda onResize(). W jejciele zapisaliśmy wyśrodkowanie widoku view w oknie programu.

view.x = stage.stageWidth * .5;view.y = stage.stageHeight * .5;

Na końcu klasy MouseEventExample zapisaliśmy metodę onEnterFrame(), wywoły-waną przy każdym wystąpieniu zdarzenia Event.ENTER_FRAME. W pierwszychdwóch linijkach wpisaliśmy formuły wyliczające różnicę między współrzędnymikursora i współrzędnymi środka okna aplikacji.

xPos = stage.mouseX - stage.stageWidth * .5;yPos = stage.mouseY - stage.stageHeight * .5;

Następnie zapisaliśmy instrukcje if, które sprawdzają wartości zmiennych mouseDownoraz ctrlDown. W pierwszym przypadku sprawdzamy, czy wartość mouseDown jestrówna true, a wartość ctrlDown równa false. Jeżeli warunek zachodzi, to wcześniejzdefiniowane odległości xPos i yPos zostaną użyte do zmiany kątów nachyleniamodelu na osiach X i Y. Parametr ease służy jako mnożnik łagodzący przejściemiędzy pozycjami.

if (mouseDown && !ctrlDown){ ship.rotationY += (xPos * .5 - ship.rotationY) * ease; ship.rotationX += (yPos * .5 - ship.rotationX) * ease;}

Jeżeli wartości właściwości mouseDown i ctrlDown są równe true, to każda zmianawspółrzędnych kursora spowoduje zmianę wymiarów obiektu. Im dalej od środkabędzie skierowany kursor, tym większą skalę będzie miał model statku kosmicznego.Aby obliczyć tę odległość, musieliśmy użyć właściwości xPos i yPos. Bezpośrednio

Poleć książkęKup książkę

Page 31: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 359

w metodzie scale() obiektu ship obydwie te wartości podnieśliśmy do kwadratui dodaliśmy. Następnie wyliczyliśmy pierwiastek z tej sumy i pomnożyliśmy goprzez 0.01. W ten sposób, bazując na współrzędnych pozycji kursora, uzyskamydługość wektora, którą będziemy skalowali obiekt ship.

else if (mouseDown && ctrlDown){ ship.scale(Math.sqrt(xPos * xPos + yPos * yPos)*.01);}

Na końcu metody onEnterFrame() odświeżamy widok metodą render().

MouseEvent3D

We wcześniejszych przykładach tego podrozdziału pokazaliśmy, że można zapomocą MouseEvent stworzyć interakcje użytkownika ze środowiskiem Away3D.Problem polega na tym, że przedstawione sposoby nie odnosiły się bezpośredniodo obiektów trójwymiarowych, tylko do obiektów klas pochodnych względemInteractiveObject. Na szczęście biblioteka Away3D ma swoją implementację pełnejobsługi zdarzeń myszki w postaci klasy MouseEvent3D.

Zlokalizowana w pakiecie away3d.events klasa MouseEvent3D jest odpowiednikiemstandardowego MouseEvent, tylko że w tym przypadku ma ona zastosowanie bezpo-średnio na obiektach umieszczonych w przestrzeni trójwymiarowej, niezależnie odich rodzaju i materiału, którym są pokryte. W swoich zasobach klasa MouseEvent3Dma stałe, które definiują większość zdarzeń znanych z MouseEvent, między innymiMouseEvent3D.MOUSE_DOWN, MouseEvent3D.MOUSE_UP czy też MouseEvent3D.MOUSE_MOVE.Każde ze zdarzeń MouseEvent3D wywołuje się bezpośrednio na obiekcie, na którymma ono być rejestrowane. Działa to na tych samych zasadach jak w przypadkuzwykłych obiektów DisplayObject.

Obj3d.addEventListener(MouseEvent3D.MOUSE_DOWN, onMouseDown);

Oczywiście zamiast odwoływać się do obiektu zdarzenia, można wpisać samąpostać String, którą reprezentuje stała obiektu MouseEvent3D. Powyższy przykładdodania detektora w tym przypadku wyglądałby następująco:

Obj3d.addEventListener("mouseDown3d", onMuseDown);

Tabele 8.8 i 8.9 zawierają metody i właściwości klasy MouseEvent3D. W tabeli 8.10wypisane zostały stałe odpowiadające konkretnym zdarzeniom.

Poleć książkęKup książkę

Page 32: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

360 Flash i ActionScript. Aplikacje 3D od podstaw

Tabela 8.8. Właściwości klasy MouseEvent3D

Nazwa Rodzaj Wartość domyślna Opis

ctrlKey Boolean false Określa, czy klawisz Ctrl jest wciśniętyelementVO ElementVO Obiekt typu ElementVO, na którym wywołano

zdarzeniematerial Material Materiał obiektu 3D, na którym wywołano

zdarzenieObject Object3D Obiekt 3D, na którym wywołano zdarzeniesceneX Number Współrzędna x na sceniesceneY Number Współrzędna y na sceniesceneZ Number Współrzędna z na sceniescreenX Number Współrzędna x w widokuscreenY Number Współrzędna y w widokuscreenZ Number Współrzędna z w widokushiftKey Number false Określa, czy klawisz Shift jest wciśniętyuv UV Współrzędne UV wewnątrz obiektu, na którym

wywołano zdarzenieview View3D Obiekt widoku, w którym wywołano zdarzenie

Tabela 8.9. Metody klasy MouseEvent3D

Nazwa Opis

MouseEvent3D(type:String) Konstruktorclone():Event Tworzy kopię obiektu MouseEvent3D

Tabela 8.10. Stałe klasy MouseEvent3D

Nazwa Wartość domyślna Opis

MOUSE_DOWN ‘mouseDown3d’ Zdarzenie wciśnięcia przycisku myszy na trójwymiarowymobiekcie

MOUSE_MOVE ‘mouseMove3d’ Zdarzenie poruszania kursorem na trójwymiarowymobiekcie

MOUSE_OUT ‘mouseOut3d’ Zdarzenie opuszczenia kursora z trójwymiarowego obiektulub któregokolwiek z obiektów w nim umieszczonych

MOUSE_OVER ‘mouseOver3d’ Zdarzenie najechania kursorem na trójwymiarowy obiektlub którykolwiek z obiektów w nim umieszczonych

MOUSE_UP ‘mouseUp3d’ Zdarzenie puszczenia przycisku myszy na trójwymiarowymobiekcie

Poleć książkęKup książkę

Page 33: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 361

Tabela 8.10. Stałe klasy MouseEvent3D (ciąg dalszy)

Nazwa Wartość domyślna Opis

ROLL_OVER ‘rollOut3d’ Zdarzenie najechania kursorem na trójwymiarowy obiektROLL_OUT ‘rollOver3d’ Zdarzenie opuszczenia kursora z trójwymiarowego obiektu

Metody dla zdarze MouseEvent3D

Obiekty klasy Object3D mają własne metody inicjujące detektory zdarzeń dlaMouseEvent3D. Każda z tych metod ma inną nazwę, która wskazuje na rodzaj zdarze-nia. Jako argument dla takiej metody należy podać jedynie nazwę metody, którama być wywołana po zajściu zdarzenia.

Tabela 8.11 zawiera spis nazw metod oraz zdarzeń, którym one odpowiadają.

Tabela 8.11. Metody obsługi zdarzeń MouseEvent3D

Nazwa metody Zdarzenie

addOnMouseDown MouseEvent3D.MOUSE_DOWN

addOnMouseMove MouseEvent3D.MOUSE_MOVE

addOnMouseOut MouseEvent3D.MOUSE_OUT

addOnMouseOver MouseEvent3D.MOUSE_OVER

addOnMouseUp MouseEvent3D.MOUSE_UP

addOnRollOut MouseEvent3D.ROLL_OUT

addOnRollOver MouseEvent3D.ROLL_OVER

Malowanie na trójwymiarowych obiektach

W tym punkcie wyjaśnimy, jak napisać aplikację umożliwiającą malowanie popowierzchni obiektów 3D.

Aby wykonać to zadanie, w pierwszej kolejności stworzymy obiekt ściany i wy-pełnimy go teksturą z ceglaną powierzchnią. Następnie do tego obiektu dodamydetektory zdarzeń poruszania kursorem, wciśnięcia i puszczenia przycisku myszy.Dodatkową zmienną typu Boolean sprawimy, że malowanie będzie trwało odmomentu wciśnięcia do zwolnienia przycisku myszy.

Sam proces rysowania umieścimy w metodzie obsługi zdarzenia Event.ENTER_FRAME.

Aby na powierzchni ściany były widoczne zmiany, skorzystamy z materiału typuMovieMaterial. Jego pierwszą warstwę wypełnimy wcześniej wspomnianą ceglaną

Poleć książkęKup książkę

Page 34: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

362 Flash i ActionScript. Aplikacje 3D od podstaw

teksturą. Kolejne rysunki będą skutkiem tworzenia nowych obiektów Sprite,w których metodą drawCircle() będziemy rysowali pojedyncze, półprzezroczysteczerwone koła.

Aby ustalić współrzędne kursora na obiekcie, skorzystamy ze wspomnianegow tabeli 8.8 obiektu UV.

Efekt, który uzyskamy po napisaniu i skompilowaniu przykładu, ilustruje rysu-nek 8.3.

Rysunek 8.3.Malowanie graffitina trójwymiarowejścianie

Teraz przepisz i skompiluj następujący kod. Następnie zajmiemy się omawianiemjego poszczególnych fragmentów.

package{ import flash.geom.Vector3D; import flash.events.Event; import flash.display.StageQuality; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display.Sprite; // import away3d.containers.View3D; import away3d.primitives.Cube; import away3d.core.utils.Cast; import away3d.materials.MovieMaterial; import away3d.primitives.data.CubeMaterialsData; import away3d.events.MouseEvent3D;

Poleć książkęKup książkę

Page 35: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 363

public class GraffitiExample extends Sprite { private var view:View3D; private var wall:Cube; private var cubeMaterials:CubeMaterialsData; private var drawingEnabled:Boolean = false;

public function GraffitiExample() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); }

private function init(e:Event = null):void { stage.quality = StageQuality.LOW; stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; removeEventListener(Event.ADDED_TO_STAGE, init); stage.addEventListener(Event.RESIZE, onResize); stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); // view = new View3D(); addChild(view); // cubeMaterials = new CubeMaterialsData(); cubeMaterials.front = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.back = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.top = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.bottom = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.left = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.right = new MovieMaterial(new brickTexture(), �{ interactive:true } ); wall = new Cube( { width:1024, height:512, depth:50, �cubeMaterials:cubeMaterials } ); wall.addOnMouseDown(onMouseDown); wall.addOnMouseUp(onMouseUp); wall.addEventListener(MouseEvent3D.MOUSE_MOVE, onMouseMove); view.scene.addChild(wall); // onResize(); }

private function onMouseDown(e:MouseEvent3D):void { drawingEnabled = true; }

Poleć książkęKup książkę

Page 36: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

364 Flash i ActionScript. Aplikacje 3D od podstaw

private function onMouseUp(e:MouseEvent3D):void { drawingEnabled = false; }

private function onMouseMove(e:MouseEvent3D):void { if (drawingEnabled) { var graff:Sprite = new Sprite(); graff.graphics.beginFill(0xFF0000, .5); graff.graphics.drawCircle(e.uv.u * (e.material as MovieMaterial). �movie.width, (e.material as MovieMaterial).movie.height - �e.uv.v * (e.material as MovieMaterial).movie.height, 10); graff.graphics.endFill(); (e.material as MovieMaterial).movie.addChild(graff); } }

private function onResize(e:Event = null):void { view.x = stage.stageWidth * .5; view.y = stage.stageHeight * .5; }

private function onEnterFrame(e:Event):void { wall.rotationY -= .1; view.render(); } }

}

Na początku bloku klasy GraffitiExample zdefiniowaliśmy obiekt widoku View3D,a następnie obiekt klasy Cube o nazwie wall. Jak wspomnieliśmy na początku tegopunktu, materiałem pokrywającym ścianę jest obiekt klasy MovieMaterial. W naszymprzykładzie nazwaliśmy go wallTexture. Jako źródło dla tego materiału posłużyłobiekt klasy brickTexture. Jest to element MovieClip dodany do biblioteki pliku fla.Po zdefiniowaniu wszystkich potrzebnych obiektów utworzyliśmy jeszcze jednązmienną o nazwie drawingEnabled, której wartość określa, czy można rysować popowierzchni ściany.

private var view:View3D;private var wall:Cube;private var wallTexture:MovieMaterial;private var textureMC:brickTexture;private var isDrawing:Boolean = false;

W konstruktorze uruchamiamy metodę init(), z chwilą gdy obiekt Stage zostaniezainicjowany.

Poleć książkęKup książkę

Page 37: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 365

if (stage) init();else addEventListener(Event.ADDED_TO_STAGE, init);

Gdy metoda init() zostanie wywołana, obiekt nasłuchujący zdarzenia Event.ADDED_TO_STAGE będzie zbędny, dlatego można go usunąć, stosując metodę removeEvent�Listener().

Dla szybszego działania aplikacji ustawiliśmy niską jakość wyświetlanego obrazu,stosując w tym celu wartość StageQuality.LOW. W kolejnych linijkach usunęliśmyskalowanie obiektów i wyrównaliśmy stół montażowy do lewego górnego rogu.Ostatnimi operacjami, jakie wykonaliśmy na obiekcie stage, było przypisanie imdetektorów zdarzeń reagujących na zmianę rozmiarów okna i odświeżanie wyświe-tlanego obrazu.

removeEventListener(Event.ADDED_TO_STAGE, init);stage.quality = StageQuality.LOW;stage.scaleMode = StageScaleMode.NO_SCALE;stage.align = StageAlign.TOP_LEFT;stage.addEventListener(Event.RESIZE, onResize);stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);

Po ustaleniu wszystkich opcji i dodaniu obiektów nasłuchujących zdarzeń Event.�RESIZE i Event.ENTER_FRAME stworzyliśmy i dodaliśmy widok bez ustalania jakich-kolwiek dodatkowych zmian wartości jego właściwości. Położenie zmieniamyw metodzie onResize().

view = new View3D(); addChild(view);

W kolejnych linijkach metody init() stworzyliśmy i uzupełniliśmy zawartośćobiektu klasy CubeMaterialsData o nazwie cubeMaterials. Każdemu z boków sześcianuprzypisaliśmy nowy materiał typu MovieMaterial. W każdym z tych materiałówźródłem wyświetlanego obrazu jest obiekt klasy brickTexture. Dodatkowo abyumożliwić malowanie na powierzchni tego materiału, ustawiliśmy wartość wła-ściwości interactive jako true.

cubeMaterials = new CubeMaterialsData(); cubeMaterials.front = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.back = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.top = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.bottom = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.left = new MovieMaterial(new brickTexture(), �{ interactive:true } ); cubeMaterials.right = new MovieMaterial(new brickTexture(), �{ interactive:true } );

Poleć książkęKup książkę

Page 38: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

366 Flash i ActionScript. Aplikacje 3D od podstaw

Po wykonaniu tych czynności stworzyliśmy obiekt klasy Cube o nazwie wall, w któ-rym właściwości cubeMaterials przypisaliśmy nasz obiekt cubeMaterials. Następniekorzystając z wcześniej poznanych metod addOnMouseDown(), addOnMouseUp() orazzwykłego addEventListener() dodaliśmy obiekt nasłuchujący zdarzeń MouseEvent3D.

wall = new Cube( { width:1024, height:512, depth:50,�cubeMaterials:cubeMaterials } );wall.addOnMouseDown(onMouseDown);wall.addOnMouseUp(onMouseUp);wall.addEventListener(MouseEvent3D.MOUSE_MOVE, onMouseMove);

Na końcu metody init() dodaliśmy obiekt ściany do sceny Away3D i wywołaliśmymetodę onResize() w celu ustawienia widoku na środku okna aplikacji.

view.scene.addChild(wall);onResize();

Metody onMouseDown() oraz onMouseUp() wywoływane są w sytuacji zajścia zdarzeniaMouseEvent3D. Po wciśnięciu przycisku myszki uruchamia się metoda onMouseDown(),w której właściwości mouseDown przypisywana jest wartość true. Z kolei przy pusz-czeniu przycisku myszy wywoływana jest metoda onMouseUp(), w której mouseDownzmienia swoją wartość na false.

Najważniejszą metodą w klasie GraffitiExample jest onMouseMove(). Kod zapisanyw jej ciele odpowiada za rysowanie wzorów na powierzchni tekstury obiektu wall.Aby malowanie było możliwe jedynie przy wciśniętym przycisku myszy, musie-liśmy w pierwszej kolejności zastosować instrukcję warunkową if, w którejsprawdzana jest wartość właściwości drawingEnabled.

Jeżeli wartość tej właściwości równa jest true, to wewnątrz instrukcji tworzonyjest nowy obiekt klasy Sprite.

var graff:Sprite = new Sprite();

Stosując odwołanie do obiektu graphics wewnątrz obiektu graff, można korzystaćz jego metod rysowania.

Do narysowania półprzezroczystego czerwonego koła użyliśmy metod beginFill()oraz drawCircle(). W metodzie beginFill() jako argument podaliśmy szesnastkowykod koloru czerwonego.

graff.graphics.beginFill(0xFF0000, .5);

Metoda drawCircle() przyjmuje trzy właściwości: x, y, oraz radius. Jako x podaliśmywartość właściwości u z obiektu UV i pomnożyliśmy ją przez szerokość tekstury.

e.uv.u * (e.material as MovieMaterial).movie.width;

Poleć książkęKup książkę

Page 39: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 367

Z kolei aby określić wartość argumentu y, musieliśmy od wysokości tekstury odjąćiloczyn tej wysokości i wartości właściwości v z obiektu UV. Dzięki temu współrzędnetekstury będą zgodne z ruchem kursora.

(e.material as MovieMaterial).movie.height - e.uv.v * (e.material asMovieMaterial).movie.height;

Etap rysowania zakończyliśmy metodą endFill(), po czym umieściliśmy nowoutworzony obiekt graff w wyświetlanym obiekcie klasy brickTexture.

graff.graphics.endFill();(e.material as MovieMaterial).movie.addChild(graff);

Warto wspomnieć o tym, że zapis (e.material as MovieMaterial).movie odwołujesię do źródła materiału, na którym aktualnie znajduje się kursor.

Rozmieszczanie obiektów na planszy

Przyjmijmy, że Twoim zadaniem jest napisanie strategicznej gry czasu rzeczywi-stego. Jednymi z kluczowych elementów takiej gry są:

� możliwość zmiany pozycji obiektów strategicznych,

� tworzenie oraz przemieszczanie jednostek bojowych.

Tymi konkretnymi zagadnieniami zajmiemy się w tym punkcie, a efekt, który uzy-skamy, kompilując kod źródłowy przykładu, przedstawia rysunek 8.4.

Rysunek 8.4.Rozmieszczanieobiektów na planszy

Poleć książkęKup książkę

Page 40: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

368 Flash i ActionScript. Aplikacje 3D od podstaw

Na rysunku 8.4 widzimy kawałek planszy pokryty teksturą ze sztucznym ukształto-waniem terenu tworzącym pole podzielone wyschniętym korytem rzeki. Na tejplanszy umieszczony jest jeden budynek, który w naszym scenariuszu pełnifunkcję fabryki pojazdów latających. Poza nim w powietrzu wiszą cztery wypro-dukowane statki kosmiczne.

Tworzenie tych latających obiektów następuje po kliknięciu na obiekt fabryki —pojazd pojawia się na jej platformie, po czym przemieszcza na losowo wybranąpozycję.

Najechanie kursorem na którykolwiek z modeli powoduje pojawienie się czer-wonej poświaty. Oznacza to, że na wybranym elemencie można wykonać akcjęzmiany pozycji.

Żeby zmienić pozycję wybranego obiektu, należy kliknąć na niego, trzymając wci-śnięty klawisz Ctrl.

Na podłożu planszy pojawi się niebieski celownik, tak jak to pokazano na rysun-ku 8.4. Celownik ten, podobnie jak w grach tego typu, wyznacza nowe miejsce do-celowe.

Aby wybrany obiekt zmienił swoją pozycję na nową, należy kliknąć lewy przyciskmyszy, trzymając wciśnięty klawisz Ctrl. W przypadku obiektu fabryki pozycjazmieniona zostanie natychmiastowo, ponieważ — w przeciwieństwie do obiektówstatków — nie stworzyliśmy animacji płynnego przejścia wygenerowanej za pomocąbibliotek TweenMax i TimelineMax. Wszystkie procesy, które zachodzą w kodzieźródłowym tego przykładu, omówimy za chwilę. Teraz przepisz ten kod i załącz gojako główną klasę programu. Do poprawnego działania aplikacji niezbędne sązasoby umieszczone w pliku fla.

package{ import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.filters.GlowFilter; import flash.geom.Vector3D; import flash.ui.Keyboard; // import away3d.core.base.Object3D; import away3d.core.utils.Cast; import away3d.core.render.Renderer; import away3d.primitives.Plane; import away3d.materials.MovieMaterial; import away3d.materials.BitmapMaterial;

Poleć książkęKup książkę

Page 41: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 369

import away3d.events.MouseEvent3D; import away3d.events.Loader3DEvent; import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.loaders.Loader3D; import away3d.loaders.Max3DS; // import com.greensock.TweenMax; import com.greensock.TimelineMax;

public class MouseEvent3DExample extends Sprite { private var view:View3D; private var pointer:Plane; private var pointerMC:Crosshair = new Crosshair(); private var board:ObjectContainer3D; private var ground:Plane; private var texture:BitmapMaterial; private var modelLoader:Loader3D; private var landingDock:ObjectContainer3D; private var fighter:ObjectContainer3D; private var animations:TimelineMax; private var leftArrowDown:Boolean = false; private var rightArrowDown:Boolean = false; private var upArrowDown:Boolean = false; private var downArrowDown:Boolean = false; private var selectedBuilding:Object3D; private var selectedVehicle:Object3D; private var ctrlDown:Boolean = false; private var zoomInDown:Boolean = false; private var zoomOutDown:Boolean = false; private var fighters:Vector.<Object3D> = new Vector.<Object3D>;

public function MouseEvent3DExample():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); }

private function init(e:Event = null):void { stage.quality = StageQuality.LOW; stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; removeEventListener(Event.ADDED_TO_STAGE, init); addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(Event.RESIZE, onResize); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); view = new View3D(); view.renderer = Renderer.BASIC; view.x = stage.stageWidth * .5;

Poleć książkęKup książkę

Page 42: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

370 Flash i ActionScript. Aplikacje 3D od podstaw

view.y = stage.stageHeight * .5; addChild(view); view.camera.zoom = 15; view.camera.y = 800; view.camera.lookAt(new Vector3D(0, 0, 0)); view.scene.addOnMouseMove(overScene);

pointer = new Plane( { width:34, height:34, �material:new MovieMaterial(pointerMC),pushfront:true } ); initBoard(); initBuildings(); onResize(); }

private function initBoard():void { board = new ObjectContainer3D(); texture = new BitmapMaterial(Cast.bitmap('terrain')); ground = new Plane(); ground.width = 512; ground.height = 512; ground.pushback = true; ground.material = texture; ground.addOnMouseDown(onGroundClick); board.addChild(ground); view.scene.addChild(board); }

private function overScene(e:MouseEvent3D):void { pointer.x = e.sceneX; pointer.z = e.sceneZ; }

private function onGroundClick(e:MouseEvent3D):void { trace(e.sceneX, e.sceneZ); if (ctrlDown && selectedBuilding) { selectedBuilding.alpha = 1; selectedBuilding.x = pointer.x; selectedBuilding.z = pointer.z; selectedBuilding = null; view.scene.removeChild(pointer); } else if (ctrlDown && selectedVehicle) { view.scene.removeChild(pointer); TweenMax.to(selectedVehicle, 1, { x:pointer.x, z:pointer.z, �onComplete:function() { selectedBuilding = null; } } ); } else{}

Poleć książkęKup książkę

Page 43: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 371

} private function initBuildings():void { modelLoader = Max3DS.load('../../resources/models/max3ds/ �landingDock/LandingDock.3DS'); modelLoader.addOnSuccess(onLandingDockSuccess); }

private function onLandingDockSuccess(e:Loader3DEvent):void { landingDock = new ObjectContainer3D(); landingDock.ownCanvas = true; landingDock.name = 'RED_landingDock'; landingDock.addChild(modelLoader.handle); landingDock.scale(.2); landingDock.x = 71; landingDock.z = 196; landingDock.y = 15; landingDock.rotationX = 90; landingDock.filters = [ new GlowFilter(0xFF0000, 0, 7, 7, 1, 1)]; view.scene.addChild(landingDock); landingDock.addOnMouseDown(landingDockOnMouseDown); landingDock.addOnRollOver(landingDockOnMouseRollOver); landingDock.addOnRollOut(landingDockOnMouseRollOut); }

private function landingDockOnMouseDown(e:MouseEvent3D):void { trace('landingDock:CLICK'); if (ctrlDown) { selectedBuilding = landingDock; selectedBuilding.alpha = .5; view.scene.addChild(pointer); pointerMC.gotoAndStop('move'); }else { modelLoader = Max3DS.load('../../resources/models/max3ds/ �spaceFighter01/spaceFighter01.3ds'); modelLoader.addOnSuccess(onModelLoaderSuccess); } }

private function landingDockOnMouseRollOver(e:MouseEvent3D):void { trace('landingDock:RollOver'); TweenMax.to(landingDock.filters[0], .5, { alpha:1 } ); }

private function landingDockOnMouseRollOut(e:MouseEvent3D):void { trace('landingDock:RollOut');

Poleć książkęKup książkę

Page 44: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

372 Flash i ActionScript. Aplikacje 3D od podstaw

TweenMax.to(landingDock.filters[0], .5, { alpha:0 } ); }

private function randomPosition(min:Number, max:Number):Number { return Math.floor(Math.random() * (1 + max - min)) + min; }

private function onModelLoaderSuccess(e:Loader3DEvent):void { var randomX:Number = landingDock.x - randomPosition(-150, 150); var randomZ:Number = landingDock.z - randomPosition(-150, 150); fighter = new ObjectContainer3D(); fighter.ownCanvas = true; fighter.addOnMouseDown(fighterOnMouseDown); fighter.addOnRollOver(fighterOnMouseRollOver); fighter.addOnRollOut(fighterOnMouseRollOut); fighter.name = fighter + fighters.length; fighter.filters = [new GlowFilter(0xFF0000, 0, 7, 7, 1, 1)]; fighter.addChild(modelLoader.handle); fighter.scale(.001); fighter.rotationX = 90; fighter.x = landingDock.x; fighter.y = 20; fighter.z = landingDock.z; view.scene.addChild(fighter); fighters.push(fighter); animations = new TimelineMax( { onComplete:onFighterReady } ); animations.append(TweenMax.to(fighter, 1, { scaleX:.1, �scaleY:.1, scaleZ:.1 } )); animations.append(TweenMax.to �(fighter, 2, { x:randomX, y: 60, z:randomZ } )); animations.play(); }

private function onFighterReady():void { trace('Fighter ready!'); }

private function fighterOnMouseDown(e:MouseEvent3D):void { trace('Fighter:CLICK'); if (ctrlDown) { selectedVehicle = e.target as ObjectContainer3D; view.scene.addChild(pointer); pointerMC.gotoAndStop('move'); } }

private function fighterOnMouseRollOver(e:MouseEvent3D):void

Poleć książkęKup książkę

Page 45: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 373

{ trace('Fighter:RollOver'); TweenMax.to(e.currentTarget.filters[0], .5, { alpha:1 } ); }

private function fighterOnMouseRollOut(e:MouseEvent3D):void { trace('Fighter:RollOut'); TweenMax.to(e.currentTarget.filters[0], .5, { alpha:0 } ); }

private function onResize(e:Event = null):void { view.x = stage.stageWidth * .5; view.y = stage.stageHeight * .5; }

private function onKeyDown(e:KeyboardEvent):void { if (e.keyCode == Keyboard.LEFT) leftArrowDown = true; if (e.keyCode == Keyboard.RIGHT) rightArrowDown = true; if (e.keyCode == Keyboard.UP) upArrowDown = true; if (e.keyCode == Keyboard.DOWN) downArrowDown = true; if (e.keyCode == Keyboard.CONTROL) ctrlDown = true; if (e.keyCode == 187) zoomInDown = true; if (e.keyCode == 189) zoomOutDown = true; } private function onKeyUp(e:KeyboardEvent):void { if (e.keyCode == 187) zoomInDown = false; if (e.keyCode == 189) zoomOutDown = false; if (e.keyCode == Keyboard.LEFT) leftArrowDown = false; if (e.keyCode == Keyboard.RIGHT) rightArrowDown = false; if (e.keyCode == Keyboard.UP) upArrowDown = false; if (e.keyCode == Keyboard.DOWN) downArrowDown = false; if (e.keyCode == Keyboard.CONTROL) { ctrlDown = false; if (selectedBuilding) { selectedBuilding.alpha = 1; selectedBuilding = null; view.scene.removeChild(pointer); } } }

private function onEnterFrame(e:Event):void { if (zoomInDown) { if (ctrlDown) view.camera.y += 5;

Poleć książkęKup książkę

Page 46: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

374 Flash i ActionScript. Aplikacje 3D od podstaw

else view.camera.zoom++; } if (zoomOutDown) { if (ctrlDown) view.camera.y -= 5; else view.camera.zoom--; } if (leftArrowDown) { if (ctrlDown) view.camera.rotationY++; else view.camera.x -= 10; } if (rightArrowDown) { if (ctrlDown) view.camera.rotationY--; else view.camera.x += 10; } if (upArrowDown) { if (ctrlDown) view.camera.rotationX++; else view.camera.z += 10; } if (downArrowDown) { if (ctrlDown) view.camera.rotationX--; else view.camera.z -= 10; } view.render(); }

}}

Jak w większości kodów źródłowych zawartych w tej książce, ustawiliśmy poziomjakości wyświetlania elementów, brak skalowania oraz wyrównanie stołu montażo-wego. Użyliśmy do tego celu klas StageAlign, StageQuality i StageScaleMode.

Jednym z istotnych elementów tego przykładu jest możliwość zmiany położeniaobiektów znajdujących się na planszy. Aby móc wyznaczyć nową pozycję natrzech osiach równocześnie, musieliśmy skorzystać z klasy Vector3D. Do samegoprzemieszczenia użyliśmy zdarzeń MouseEvent3D i animacji generowanych klasamiTweenMax i TimelineMax.

Ponieważ do zrealizowania tego przykładu skorzystaliśmy z modeli zapisanychw formacie 3DS, musieliśmy użyć kilku klas, aby wyświetlić je na scenie. W pierw-szej kolejności użyliśmy ogólnej klasy Loader3D, przechowującej model. Aby po-brać obiekt w formacie 3DS, skorzystaliśmy z klasy Max3DS. Skala oraz położeniezawartości modelu uzależnione są od zastosowanych podczas eksportu ustawień.Pobrany z określonej lokalizacji obiekt modelu umieściliśmy w kontenerze Object�Container3D, aby w jego wnętrzu dostosować obiekt modelu do ustawień sceny.

Poleć książkęKup książkę

Page 47: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 375

Wspomniane otoczenie stworzyliśmy za pomocą klasy Plane i nadaliśmy odpo-wiedni charakter powierzchni, stosując klasę Cast oraz BitmapMaterial.

Przy wybieraniu nowej pozycji dla obiektów za śladem kursora podąża niebieskicelownik. Podobnie jak w grach strategicznych, pokazuje on nowe docelowe poło-żenie na planszy. Do jego wykonania zastosowaliśmy obiekt klasy Plane oraz tek-sturę MovieMaterial. Źródłem dla tego materiału jest osadzony w zasobach plikufla element MovieClip.

Wewnątrz klasy MouseEvent3DExample zadeklarowaliśmy kilkanaście obiektówi zmiennych potrzebnych do prawidłowego funkcjonowania przykładu. Jak zwyklezaczęliśmy od zdefiniowania widoku Away3D.

Wskaźnikiem nowych pozycji jest obiekt klasy Plane o nazwie pointer. Dla źródłamateriału wykorzystaliśmy obiekt klasy Crosshair. Crosshair nie zawiera w sobieżadnych dodatkowych metod poza konstruktorem. Służy jedynie jako łącznikz elementem MovieClip z biblioteki pliku fla.

Tego typu połączenia mogą wydawać się zbędne. Jednak gdyby projekt w swoichzałożeniach wymagał dodatkowych operacji wykonywanych na wskaźniku, dobrzebyłoby umieścić je w osobnej klasie, takiej jak Crosshair, i odwoływać się do nichpoprzez obiekt tej klasy.

W następnej kolejności zadeklarowaliśmy obiekty potrzebne do wyświetleniaplanszy. Do stworzenia powierzchni zastosowaliśmy obiekt klasy Plane o nazwieground, a do pokrycia jej teksturą użyliśmy obiektu texture klasy BitmapMaterial.Przyjmując, że do samego otoczenia moglibyśmy dodać jeszcze inne elementy, wy-generowaną powierzchnię umieściliśmy w kontenerze board. W razie koniecznościmodyfikowania środowiska wystarczyłoby odwołanie się do tego obiektu.

W tym przykładzie za pobieranie modeli odpowiada obiekt o nazwie modelLoaderklasy Loader3D. W przypadku budynku fabryki pobrana zawartość umieszczana jestw kontenerze o nazwie landingDock. Z kolei każdy utworzony statek kosmicznyprzypisywany jest do obiektu fighter i dodawany do wektora Vector.<Object3D>o nazwie fighters.

Aby wyselekcjonować konkretny element z całej grupy dodanych modeli, zdefinio-waliśmy specjalne obiekty klasy Object3D o nazwach selectedBuilding i selected�Vehicle.

Do opanowania animacji złożonych z więcej niż jednej sekwencji posłużyliśmy sięobiektem animations klasy TimelineMax.

Poza samymi obiektami zadeklarowaliśmy również szereg zmiennych potrzebnychdo wykonywania operacji w konkretnych przypadkach. Wszystkie te właściwości

Poleć książkęKup książkę

Page 48: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

376 Flash i ActionScript. Aplikacje 3D od podstaw

przyjmują wartości typu Boolean i odpowiadają za kliknięcie poszczególnych kla-wiszy klawiatury.

Do określania stanu klawiszy strzałek zastosowaliśmy zmienne: leftArrowDown,rightArrowDown, upArrowDown oraz downArrowDown, których wartości domyślnie równesą false. W zależności od tego, który klawisz został wciśnięty, odpowiadającejzmiennej przypisujemy nową wartość równą true.

Za zmianę wartości właściwości ctrlDown odpowiada wciśnięcie lub zwolnienieklawisza Ctrl. Z kolei klawisze + i – umieszczone w bloku klawiszy alfanumerycz-nych regulują wartości właściwości zoomInDown oraz zoomOutDown.

W konstruktorze uruchamiamy metody init(), z chwilą gdy obiekt Stage zostaniezainicjowany.

if (stage) init();else addEventListener(Event.ADDED_TO_STAGE, init);

W metodzie init() w pierwszej kolejności wykonaliśmy wszystkie potrzebne ope-racje na obiekcie stołu montażowego. Ustawiliśmy jakość generowanego obrazu,wyrównanie oraz wyłączyliśmy skalowanie. Następnie dodaliśmy detektory dlazdarzeń zmiany rozmiaru, odświeżenia obrazu i użycia klawiatury.

stage.quality = StageQuality.LOW;stage.scaleMode = StageScaleMode.NO_SCALE;stage.align = StageAlign.TOP_LEFT;removeEventListener(Event.ADDED_TO_STAGE, init);addEventListener(Event.ENTER_FRAME, onEnterFrame);stage.addEventListener(Event.RESIZE, onResize);stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);

W dalszej części metody init() stworzyliśmy widok Away3D i zmieniliśmy usta-wienia kamery tak, aby obejmowała całą powierzchnię planszy.

Do renderowania widoku skorzystaliśmy z klasy BasicRenderer, której obiekt utwo-rzyliśmy, stosując odwołanie Renderer.BASIC. Przed umieszczeniem widoku na liściewyświetlanych obiektów wywołaliśmy metodę addOnMouseMove(), która przy zdarze-niu poruszania kursorem ma wywołać metodę overScene().

view = new View3D();view.renderer = Renderer.BASIC;view.scene.addOnMouseMove(overScene);addChild(view);view.camera.zoom = 15;view.camera.y = 800;view.camera.lookAt(new Vector3D(0, 0, 0));

Poleć książkęKup książkę

Page 49: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 377

Po dodaniu widoku w celach testowych umieściliśmy obiekt klasy Trident. Długośćjego ramion ustawiliśmy na poziomie 100 pikseli i zmieniliśmy wartość właściwościshowLetters na true.

Linijkę kodu dodającą oś Trident do sceny Away3D umieściliśmy w komentarzutak, aby nie wyświetlać obiektu trident bez potrzeby.

trident = new Trident(100, true);//view.scene.addChild(trident);

Dalej w metodzie init() stworzyliśmy wskaźnik pozycji, który wcześniej zdefi-niowaliśmy jako obiekt pointer. Jego wysokość oraz szerokość ustawiliśmy tak, abyzgadzały się z wymiarami źródła grafiki pointerMC. Ze względu na swoją rolę wskaź-nik jest zawsze widoczny na powierzchni planszy. Aby uzyskać taki efekt, niepodnieśliśmy obiektu na osi Y, tylko zastosowaliśmy właściwość pushfront. Przy-pisanie jej wartości true powoduje wyświetlenie siatki wybranego obiektu nadpozostałymi znajdującymi się w tej samej pozycji Y.

pointer = new Plane( { width:34, height:34, material:newMovieMaterial(pointerMC),pushfront:true } );

Na końcu metody init() odwołaliśmy się do dwóch metod tworzących potrzebnemodele oraz metody ustawiającej pozycję widoku.

initBoard();initBuildings();onResize();

W metodzie initBoard() poza stworzeniem planszy i nadaniem jej odpowiednichustawień ważne było zastosowanie metody uruchamiającej metodę onGroundClick()przy każdym kliknięciu na powierzchni planszy.

ground.addOnMouseDown(onGroundClick);

Metoda overScene() wywoływana jest w sytuacji poruszania kursorem w przestrzenisceny. W tym przypadku interesowały nas jedynie współrzędne osi X oraz Z,które przypisaliśmy do pozycji obiektu pointer.

pointer.x = e.sceneX;pointer.z = e.sceneZ;

W metodzie onGroundClick() zapisaliśmy proces przemieszczania wybranegoobiektu. Wewnątrz ciała metody w pierwszej kolejności znajdują się instrukcjewarunkowe, które sprawdzają, czy został wciśnięty klawisz Ctrl oraz jakiego rodzajujest kliknięty obiekt. Zdefiniowaliśmy dwie możliwe sytuacje. Pierwsza dotyczykliknięcia obiektu landingDock reprezentującego budynek fabryki. W tym przy-padku przejście między pozycjami jest natychmiastowe, ponieważ nie zastosowa-liśmy tutaj klasy TweenMax, tylko od razu przypisaliśmy właściwościom x i z nowe

Poleć książkęKup książkę

Page 50: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

378 Flash i ActionScript. Aplikacje 3D od podstaw

wartości pozycji wskaźnika pointer. Poza tym przywróciliśmy pierwotny stanprzezroczystości obiektu landingDock, wyczyściliśmy zawartość obiektu selected�Building i usunęliśmy ze sceny wskaźnik.

if (ctrlDown && selectedBuilding){ selectedBuilding.alpha = 1; selectedBuilding.x = pointer.x; selectedBuilding.z = pointer.z; selectedBuilding = null; view.scene.removeChild(pointer);}

Druga sytuacja określona w metodzie onGroundClick() dotyczy pojazdów latających,czyli obiektów fighter. W ich przypadku aby zmienić pozycję, stosuje się klasęTweenMax, w której właściwościom x i z przypisaliśmy nowe wartości położeniawskaźnika. Dodatkowo wewnątrz metody to() klasy TweenMax zapisaliśmy metodę,która zostanie wywołana na koniec animacji. Celem tej metody jest usunięcie zesceny obiektu pointer oraz wyczyszczenie odwołania do klikniętego pojazduw obiekcie selectedVehicle.

else if (ctrlDown && selectedVehicle){ TweenMax.to(selectedVehicle, 1, { x:pointer.x, z:pointer.z, onComplete:function() { view.scene.removeChild(pointer); selectedVehicle = null; } } );}

Aby pobrać z wybranej lokalizacji model fabryki w metodzie initBuildings(), sko-rzystaliśmy z obiektu modelLoader oraz klasy Max3DS. Dodatkowo użyliśmy de-tektora zdarzeń Loader3DEvent, aby przy zakończeniu pobierania wywołać meto-dę onLandingDockSuccess().

modelLoader =Max3DS.load('../../resources/models/max3ds/landingDock/LandingDock.3DS');modelLoader.addOnSuccess(onLandingDockSuccess);

Dopiero w metodzie onLandingDockSuccess() zapisaliśmy proces dodawania modeludo sceny Away3D. W pierwszej kolejności nadaliśmy mu nazwę oraz umieścili-śmy zawartość obiektu modelLoader w kontenerze landingDock. Ponieważ w swoichpierwotnych ustawieniach wymiary modelu są znacznie większe od wymiarówdodanej planszy, musieliśmy zastosować metodę scale() do zmniejszenia skaliobiektu landingDock.

landingDock = new ObjectContainer3D();landingDock.name = 'RED_landingDock';

Poleć książkęKup książkę

Page 51: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 379

landingDock.addChild(modelLoader.handle);landingDock.scale(.2);

W kolejnych linijkach ustawiliśmy model w wybranym miejscu i przypisaliśmymu filtr czerwonej poświaty, który będzie się pojawiał po każdym najechaniu kur-sora na obiekt.

landingDock.x = 71;landingDock.z = 196;landingDock.y = 15;landingDock.filters = [ new GlowFilter(0xFF0000, 0, 7, 7, 1, 1)];

Aby poświata była widoczna na obiekcie 3D, należy przypisać jego właściwościownCanvas wartość true.

Do rozpoznawania akcji myszy na powierzchni obiektu landingDock zastosowali-śmy trzy metody zdarzeń MouseEvent3D.

landingDock.addOnMouseDown(landingDockOnMouseDown);landingDock.addOnRollOver(landingDockOnMouseRollOver);landingDock.addOnRollOut(landingDockOnMouseRollOut);

Kliknięcie na obiekt landingDock powoduje uruchomienie metody landingDockOn�MouseDown(). W jej ciele sprawdzamy, czy wartość właściwości ctrlDown jest równatrue. Jeżeli warunek jest spełniony, to metoda ta spowoduje zmianę pozycjiobiektu fabryki i wyświetlenie wskaźnika.

if (ctrlDown){ selectedBuilding = landingDock; selectedBuilding.alpha = .5; view.scene.addChild(pointer); pointerMC.gotoAndStop('move');}

W sytuacji gdy wartość właściwości ctrlDown jest równa false, celem metodylandingDockOnMouseDown() jest stworzenie nowego obiektu statku kosmicznego.Proces ten zaczyna się podobnie jak tworzenie modelu fabryki. W pierwszej ko-lejności za pomocą klasy Max3DS pobierany jest z określonej lokalizacji modelSpaceFighter01.3DS. Następnie z chwilą zakończenia pobierania wywołujemy me-todę onModelLoaderSuccess().

else{ modelLoader = Max3DS.load('./models/sf/spaceships/SpaceFighter01.3DS'); modelLoader.addOnSuccess(onModelLoaderSuccess);}

Poleć książkęKup książkę

Page 52: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

380 Flash i ActionScript. Aplikacje 3D od podstaw

W metodzie onModelLoaderSuccess() zapisaliśmy cały proces tworzenia i pokazaniamodelu statku kosmicznego. Według scenariusza obiekt ma się pojawić na po-wierzchni budynku, zwiększyć swoją pozycję na osi Y i przenieść w przypadkowemiejsce wokół fabryki.

Żeby uzyskać taki efekt, w pierwszej kolejności zdefiniowaliśmy dwie zmiennenumeryczne: randomX i randomY, których wartości są różnicą pozycji modelu fabrykii losowej liczby z przedziału. Do wyznaczenia przypadkowej liczby napisaliśmyosobną metodę randomPosition(), którą omówimy później.

var randomX:Number = landingDock.x - randomPosition(-150, 150);var randomZ:Number = landingDock.z - randomPosition(-150, 150);

W dalszej części metody onModelLoaderSuccess() stworzyliśmy obiekt fighter, któryprzechowuje pobraną zawartość obiektu modelLoader.

fighter = new ObjectContainer3D();fighter.addChild(modelLoader.handle);

Kolejność definiowania właściwości nie ma tutaj większego znaczenia, dlatego za-częliśmy od dodania detektorów zdarzeń MouseEvent3D. Tak samo jak w przypadkuobiektu landingDock, na każdy ze statków kosmicznych będzie można kliknąć,najechać i opuścić kursorem powierzchnię modelu.

fighter.addOnMouseDown(fighterOnMouseDown);fighter.addOnRollOver(fighterOnMouseRollOver);fighter.addOnRollOut(fighterOnMouseRollOut);

Następnie dodaliśmy filtr czerwonej poświaty, który będzie się pojawiał, gdykursor znajdzie się na powierzchni modelu.

fighter.filters = [new GlowFilter(0xFF0000, 0, 7, 7, 1, 1)];

Ponieważ pojazd ma się wyłaniać z hangaru, dla animacji ustawiliśmy jego pozycjęzgodną z położeniem fabryki oraz skalę na poziomie jednej tysięcznej.

fighter.scale(.001);fighter.x = landingDock.x;fighter.y = 20;fighter.z = landingDock.z;

Po utworzeniu statku i przypisaniu jego właściwościom nowych współrzędnychdodaliśmy go do sceny oraz obiektu fighters.

view.scene.addChild(fighter);fighters.push(fighter);

Na końcu metody onModelLoaderSuccess() stworzyliśmy animację złożoną z dwóchetapów. W pierwszym powiększyliśmy skalę obiektu, co ma symbolizować jegopowstawanie, w drugiej zaś przenieśliśmy go do losowych pozycji x i z na wysokości100 pikseli.

Poleć książkęKup książkę

Page 53: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 381

animations = new TimelineMax( { onComplete:onFighterReady } );animations.append(TweenMax.to(fighter, 1, { scaleX:.4, scaleY:.4,�scaleZ:.4 } ));animations.append(TweenMax.to(fighter, 2, { x:randomX, y: 100,�z:randomZ } ));animations.play();

Do tworzenia animacji złożonej z kilku etapów najlepiej stosować klasę TimelineMax.Poszczególne fazy animacji dodaje się metodą append(), w której argumentem jestodwołanie do klasy TweenMax. Gotową sekwencję animacji można uruchomić,stosując metody play() lub restart().

Szczegóły dotyczące klasy TweenMax znajdują się na stronie:http://www.greensock.com/timelinemax/.

Metoda randomPosition(), jak wspomnieliśmy wcześniej, służy do wygenerowanialosowej liczby. Do wyliczenia tej wartości posłużyliśmy się metodami klasy Mathoraz przedziału liczbowego podanego w argumentach min i max.

return Math.floor(Math.random() * (1 + max - min)) + min;

W metodach landingDockOnMouseRollOver() i landingDockOnMouseRollOut() zapisali-śmy animację pokazywania i chowania poświaty. Aby płynnie przejść od jedne-go stanu do drugiego, skorzystaliśmy z klasy TweenMax, w której odwołujemy się dopierwszej pozycji z tablicy filters obiektu landingDock i zmieniamy wartość wła-ściwości alpha.

//landingDockOnMouseRollOverTweenMax.to(landingDock.filters[0], .5, { alpha:1 } );

//landingDockOnMouseRollOutTweenMax.to(landingDock.filters[0], .5, { alpha:0 } );

Na tej samej zasadzie zakodowaliśmy pojawianie się poświaty wokół obiektówfighter w metodach fighterOnMouseRollOver() i fighterOnMouseRollOut(). Jedyną róż-nicą jest odwołanie do wybranego obiektu. Ponieważ w tym przypadku liczba po-jazdów latających może być większa niż jeden, aby animacja dotyczyła konkretne-go obiektu, musieliśmy w klasie TweenMax użyć zapisu e.currentTarget.filters[0].

Metoda fighterOnMouseDown() odpowiada za pojawienie się wskaźnika i rozpoczęcieprocesu przemieszczania obiektu latającego. Żeby sprawdzić, czy użytkownik,klikając na obiekt, chce go przenieść w inne miejsce, zastosowaliśmy instrukcję ifsprawdzającą, czy zmienna ctrlDown jest równa true. Jeżeli ma ona wartość true,na scenie w pozycji kursora pojawia się wskaźnik. Żeby przejście dotyczyło kon-kretnego pojazdu, przypisaliśmy obiektowi selectedVehicle odwołanie do kliknię-tego pojazdu.

if (ctrlDown){

Poleć książkęKup książkę

Page 54: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

382 Flash i ActionScript. Aplikacje 3D od podstaw

selectedVehicle = e.target as ObjectContainer3D; view.scene.addChild(pointer); pointerMC.gotoAndStop('move');}

Przy każdej zmianie rozmiaru okna uruchamiana jest metoda onResize(). W jejciele zapisaliśmy wyśrodkowanie widoku view w oknie programu.

view.x = stage.stageWidth * .5;view.y = stage.stageHeight * .5;

Znane nam z wcześniejszych przykładów metody onKeyDown() oraz onKeyUp() słu-żą do sprawdzania, czy zaszły warunki zapisane w instrukcjach if, i przypisaniaodpowiedniej wartości poszczególnym właściwościom. W obu metodach tego przy-kładu sprawdzaliśmy akcje wciśnięcia i zwolnienia klawiszy strzałek, Ctrl orazznaków plusa i minusa znajdujących się w górnym rzędzie klawiatury. W metodzieonKeyUp() przy zwolnieniu klawisza Ctrl dodatkowo sprawdziliśmy, czy kursorznajdował się na obiekcie landingDock. Jeżeli tak, to musieliśmy zapisać powrót dopierwotnego stanu poziomu jego przezroczystości, wyczyścić zawartość obiektuselectedBuilding i usunąć wskaźnik ze sceny.

if (e.keyCode == Keyboard.CONTROL){ ctrlDown = false; if (selectedBuilding) { selectedBuilding.alpha = 1; selectedBuilding = null; view.scene.removeChild(pointer); }}

Na końcu zapisaliśmy metodę onEnterFrame(), która wywoływana jest przy każdymwystąpieniu zdarzenia Event.ENTER_FRAME. Zawiera ona w sobie kilka instrukcjiwarunkowych. W każdej z nich dodatkowo sprawdzamy, czy został wciśniętyklawisz Ctrl.

Zastosowanie kombinacji klawiszy pozwoliło nam uniknąć korzystania z większejich liczby.

Pierwsza instrukcja if sprawdza, czy wartość zmiennej zoomInDown równa jest true.Jeżeli warunek jest spełniony, to w zależności od stanu zmiennej ctrlDown wyko-nywana jest odpowiednia operacja. Gdy klawisz Ctrl jest wciśnięty, to kamerazmienia swoją pozycję na osi Y. W przeciwnym razie zwiększana jest wartośćwłaściwości zoom.

if (zoomInDown){ if (ctrlDown) view.camera.y += 5;

Poleć książkęKup książkę

Page 55: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 383

else view.camera.zoom++;}

W przypadku drugiej instrukcji if sprawdzana jest wartość zmiennej zoomOutDown.Gdy wartość tej właściwości jest równa true, to kamera może zmieniać swojąpozycję na osi Y lub zmniejszać wartość właściwości zoom.

if (zoomOutDown){ if (ctrlDown) view.camera.y -= 5; else view.camera.zoom--;}

Trzecia instrukcja if dotyczy zdarzenia wciśnięcia klawisza lewej strzałki. Jeżeliwarunek jest spełniony, to kamera może wykonywać obrót w lewą stronę lubzmniejszyć pozycję na osi X.

if (leftArrowDown){ if (ctrlDown) view.camera.rotationY--; else view.camera.x -= 10;}

Działania czwartej instrukcji warunkowej if są odwrotne do poprzedniej. Dotyczyona bowiem wciśnięcia klawisza prawej strzałki. Gdy wartość właściwości right�ArrowDown jest równa true, to kamera może obracać się w prawą stronę bądźzwiększać pozycję na osi X.

if (rightArrowDown){ if (ctrlDown) view.camera.rotationY++; else view.camera.x += 10;}

W piątej instrukcji if sprawdzana jest wartość zmiennej upArrowDown. Jeżeli waru-nek jest spełniony, to kamera może wykonywać obrót w górę lub zwiększyć po-zycję na osi Z.

if (upArrowDown){ if (ctrlDown) view.camera.rotationX++; else view.camera.z += 10;}

W ostatniej instrukcji if warunkiem jest wciśnięcie klawisza dolnej strzałki. Gdywartość właściwości downArrowDown jest równa true, to kamera może wykonać obrótw dół bądź zmniejszyć pozycję na osi Z.

if (downArrowDown){

Poleć książkęKup książkę

Page 56: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

384 Flash i ActionScript. Aplikacje 3D od podstaw

if (ctrlDown) view.camera.rotationX--; else view.camera.z -= 10;}

Na końcu metody onEnterFrame() wywołaliśmy odświeżenie wygenerowanego ob-razu metodą render().

Podsumowanie� Do kontrolowania obiektów można korzystać zarówno z myszki,

jak i klawiatury.

� Klasa KeyboardEvent reprezentuje zdarzenia związane z używaniemklawiatury. Rozpoznaje procesy wciśnięcia i zwolnienia klawisza.

� Aby wykrywać akcje klawiatury, należy dodać detektor bezpośredniodo obiektu klasy Stage.

� Do rozpoznawania wciśniętego klawisza służą właściwości keyCode i charCode.Pierwsza właściwość zwraca wartość numeryczną położenia klawiszana klawiaturze, a druga określa kod znaku wciśniętego klawisza.

� Przy kontrolowaniu zdarzeń użycia klawiatury przydatna jest klasa Keyboard,która między innymi ma zdefiniowane stałe określające kody standardowychznaków klawiszy.

� Klasa KeyLocation służy do określenia lokalizacji klawisza, ma stałeokreślające strefy standardowej klawiatury.

� W metodach wywołanych zdarzeniami klawiatury warto stosowaćdodatkowe zmienne o wartościach typu Boolean, określające statusposzczególnego klawisza. Jeśli stosujemy te zmienne w metodachwywołujących animację, będzie możliwe tworzenie konkretnych efektówdla różnych kombinacji wciśniętych klawiszy.

� Zdarzenia MouseEvent nie działają bezpośrednio na obiekcie trójwymiarowym.

� Na materiałach interaktywnych można stosować zdarzenia klasy MouseEvent.

� Właściwość interactive w materiałach służy do określenia, czy mają byćstosowane zdarzenia myszki.

� Zdarzenia MouseEvent wywoływane na obiekcie klasy Stage możnawykorzystać do zmiany kątów nachylenia poszczególnych obiektówna scenie.

Poleć książkęKup książkę

Page 57: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Rozdzia� 8. � Interaktywno�� 385

� Biblioteka Away3D ma własną klasę do obsługi zdarzeń myszy o nazwieMouseEvent3D.

� Stosując współrzędne UV, można umieszczać elementy w konkretnymmiejscu tekstury typu MovieMaterial.

� Aby filtry typu Blur lub Glow były widoczne na elementach, trzeba zastosowaćwłaściwość ownCanvas na wybranym obiekcie i przypisać mu wartość true.

Poleć książkęKup książkę

Page 58: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

386 Flash i ActionScript. Aplikacje 3D od podstaw

Poleć książkęKup książkę

Page 59: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

SkrowidzA

Adobe Flashimport pliku, 144okno Properties, 146tworzenie odwołania, 147

Adobe Flash Builder, 35Adobe Flash Player, 16AGAL, Adobe Graphics Assembly Language,

566Attribute Registers, 568Constant Registers, 568komendy, 567Output Registers, 568Temporary Registers, 568Texture Samplers Registers, 569Varying Registers, 569

Alternativa3D, 16animacja, 41, 181, 280, 284

biegu, 452modeli, 275

DAE, 275MD2, 275

obrotu, 53animowane tekstury, 216API Stage3D, 550, 556, 590aplikacje typu RIA, 35AR, Augmented Reality, 541argumenty konstruktora

AwayStats, 509BitmapCubeTexture, 586

Away3D, 14budowa aplikacji, 50dźwięk, 465filtry, 516

formaty plików, 232instalacja, 31integracja z Adobe Flash, 31, 35integracja z FlashDevelop, 33kamery, 387komponenty, 39–50materiały, 143–187modele, 223modele 3D, 248obiekty, 61–138światło, 191–219układ współrzędnych, 54źródła, 28

Away3D 3.6.0, 27Away3D 4.x, 578, 585–590

Bbiblioteka

Adobe Tween, 284Alternativa3D, 16AS3Dmod, 24Away3D, 14FIVe3D, 20Flare3D, 21FLARManager, 24, 544FLARToolkit, 20, 22, 543GoASAP, 284GreenSock Tweening Platform, 284GTwen, 284IN2AR, 545JiglibFlash, 20–22Minko, 37ND3D, 37Papervision3D, 18

Poleć książkęKup książkę

Page 60: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

592 Flash i ActionScript. Aplikacje 3D od podstaw

bibliotekaSandy3D, 23Sophie3D, 24Stardust, 22Tweener, 284TweenLite, 284TweenMax, 24, 284Tweensy, 284WOW, 24Yogurt3D, 37

biblioteki3D, 14bezpłatne, 37do animacji, 284

bitmapy, 170błąd wgrywania tekstur, 264

CCamera3D, 39, 46, 59, 387, 418cieniowanie

Phong, 220płaskie, 220z symulacją zniekształceń, 220

Context3D, 559CPU, Central Processing Unit, 15czas reakcji kamery, 424czcionki, 490czułość obrotu kamery, 433

Ddetektor zdarzeń, 93, 234, 399dodawanie

obsługi Flash Playera, 551plików, 144

dokładność odwzorowania, 320, 325dźwięk, 465

3D, 468SimplePanVolumeDriver, 467Sound3D, 465

EEclipse, 35edytor kodu, 32efekt

deformacji tekstu, 504głębi ostrości, 405rybiego oka, 415

eksportowanie modelu, 241z Autodesk 3ds Max, 246z Blendera, 244z PreFab3D, 241

FFace, 559filtr, 385, 516

FogFilter, 517MaxPolyFilter, 520ZDepthFilter, 519

FIVe3D, 20Flare3D, 21Flash Player 11, 548Flex SDK, 35focus, 391, 461format COLLADA, 232formaty plików, Patrz plikiformaty modeli, 15, 24fov, Field of View, 389, 461FPP, First Person Perspective, 422funkcja

collisionDetected(), 535hit(), 535trace(), 56

Ggenerowanie mapy normalnych, 213głębia ostrości, 402, 405, 461głośność dźwięku, 487GPU, Graphics Processing Unit, 15, 27

Poleć książkęKup książkę

Page 61: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Skorowidz 593

graAlmax Race, 21BattleCell, 422Cafe World, 15Half-Life, 227Logoleptic, 23Pepsi Music Challenge, 19Quake 2, 233Tanki Online, 16Yellow Planet, 22

gry typuFPP, 422RPG, 451

HHD, High Definition, 215High poly, 231

Iimplementacja

kamery FPP, 435, 441kamery HoverCamera3D, 457kamery SpringCam, 449TweenMax, 285

importowanieklas, 160modelu, 241plików, 145

informacje o stanie aplikacji, 506inicjalizacja sceny, 43instalowanie

Away3D, 31Away3D 4.x, 578GreenSock Tweening Platform, 284

interfejs programu3ds Max, 224Blender, 227CharacterFX, 229Google SketchUp, 230Lightwave Modeler, 226Maya, 225MilkShape 3D, 228PreFab3D, 231

Jjęzyk

ActionScript 3.0, 14, 284, 570AGAL, 565haXe, 32MXML, 35

Kkamera, 45, 59, 387

Camera3D, 45, 418focus, 391FPP, 426głębia ostrości, 402HoverCamera3D, 421, 451, 460lens, 406perspektywa osoby trzeciej, 443perspektywa pierwszej osoby, 425pole widzenia, 389SpringCam, 422, 443, 463TargetCamera3D, 420, 462w action RPG, 451Xbox Kinect, 546zoom, 390

kąt nachylenia, 432klasa

AbstractLens, 414, 462AbstractLight, 220AbstractPrimitive, 94, 140ActionScript, 233AGALMiniAssembler, 570, 576AmbientLight3D, 194, 220AnimatedBitmapMaterial, 184AnimationData, 258, 276, 281AnimationDataType, 277, 281AnimationLibrary, 277, 281Animator, 278, 281AnimatorEvent, 279Arrow, 123arrowhead, 96AS3Exporter, 233, 281AS3ExporterExample, 235Ase, 268AwayStats, 508

Poleć książkęKup książkę

Page 62: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

594 Flash i ActionScript. Aplikacje 3D od podstaw

klasaAWData, 274BasicExample, 51bazowa, 77, 192, 286BitmapFileMaterial, 172, 281BitmapMaterial, 170, 207Building, 473Car, 444, 449Camera3D, 46, 418CameraPropertiesPanel, 392Cast, 149, 188Clipping, 512ClippingExample, 511ColorMaterial, 167, 504Collada, 270CompositeMaterial, 187Cone, 120Context3D, 559, 565Context3DProgramType, 564Context3DVertexBufferFormat, 564coordinateSystemExample, 58Cube, 109CubeMaterialsData, 109Cylinder, 118DepthOfFieldSprite, 402DirectionalLight3D, 199, 220DirectionalSprite, 85, 139DisplayObject, 352DofCashe, 461DoFExample, 403Dot3BitmapMaterial, 221Dot3BitmapMaterialF10, 214Dot3MovieMaterial, 216Elevation, 325, 338ElevationExample, 327ElevationReader, 536EnviroBitmapMaterial, 174EnviroColorMaterial, 168Event, 52Explode, 331, 338ExplosionExample, 332Face, 72, 139faceExample, 73FiltersExample, 516

FogFilter, 517FPP, 426, 431fppExample, 441FrustumClipping, 514GeodesicSphere, 114, 140GlassMaterial, 175GraffitiExample, 364, 366GridPlane, 106HeightMapModifier, 319, 338HeightMapModifierExample, 322Hi-ReS-Stats, 509HoverCamera3D, 421IndexBuffer3D, 561Init, 99, 140Keyboard, 341KeyboardEvent, 340, 384KeyboardEventsExample, 345KeyLocation, 343, 384LensExample, 409LensPanel, 407Light3DExample, 192LineSegment, 100, 140Loader3D, 268, 529LODObject, 526LODObjectExample, 523MaterialsExample, 150, 160, 203Matrix, 311Matrix3D, 337Max3DS, 263, 529MaxPolyFilter, 520Md2, 272Merge, 331, 338Mesh, 65, 70, 139ModelsExample, 252, 258ModelsPanel, 249MouseEvent, 352MouseEvent3D, 359MouseEvent3DExample, 375, 369MouseEventExample, 354, 358MoveRotateScaleExample, 287MovieClip, 52, 499MovieClipSprite, 83, 139, 352MovieMaterial, 181NearfieldClipping, 514

Poleć książkęKup książkę

Page 63: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Skorowidz 595

Obj, 266Object3D, 46, 60ObjectContainer3D, 43, 49, 60OrthogonalLens, 417Path, 337PathAlignModifier, 500, 504PathExtrusion, 313, 337PathExtrusionExample, 316PerspectiveLens, 415PerspectiveMatrix3D, 572PhongColorMaterial, 205, 207PhongMovieMaterial, 210PhongMultiPassMaterial, 218, 221PointLight3D, 196, 220Plane, 104Player, 435, 441primitivesExample, 89PrimitivesPanel, 88Program3D, 562Ray, 535RectangleClipping, 513RegularPolygon, 107, 140RoundedCube, 111rpgExample, 457Scene3D, 43, 49SeaTurtle, 122, 141Segment, 68, 139segmentExample, 69ShadingColorMaterial, 206SimplePanVolumeDriver, 487Skeleton, 452, 457SkinExtrude, 325, 338Skybox, 135, 141Skybox6, 138, 141skyboxExample, 137Sound, 478Sound3D, 465, 472, 487Sound3DExample, 470SoundChannel, 478SoundControlExample, 478Sphere, 112, 140, 482SphericalLens, 415Sprite, 52Sprite3D, 81, 139

spritesExample, 78Stage3D, 27, 548, 555–558, 565Stage3DExample, 573StageQuality, 521Stats, 506TargetCamera3D, 420Tekstura, 148TextExtrusion, 496, 503TextField3D, 492, 503TextField3DExample, 493TextureMaterial, 587textureMC, 217TimelineLite, 285TimelineMax, 285Timer, 41, 284Torus, 115, 140TorusKnot, 117tppExample, 449Triangle, 103Trident, 57, 101, 140Transform, 311TransformBitmapMaterial, 178TweenLite, 285TweenMax, 285, 521TweenNano, 285URLLoader, 495URLLoaderDataFormat, 495URLRequest, 472Vector3D, 70VectorText, 491, 494Vertex, 62, 139VertexBuffer3D, 561vertexExample, 62View3D, 40VideoMaterial, 185Weld, 527WeldExample, 528WhiteShadingBitmapMaterial, 209WireColorMaterial, 165, 504WireCone, 128WireCube, 126WireCylinder, 129WireframeMaterial, 164, 504WirePlane, 125

Poleć książkęKup książkę

Page 64: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

596 Flash i ActionScript. Aplikacje 3D od podstaw

klasaWireRegularPolygon, 132WireSphere, 131WireTorus, 133ZDepthFilter, 519ZoomFocusLens, 415

klasy w away3d.primitives, 589klawiatura, 340kolor, 167kolor piksela, 212komendy języka AGAL, 566komponent

ComboBox, 88Camera3D, 45Scene3D, 21, 43View3D, 40

komunikat o błędzie, 263konfiguracja Flex SDK, 36konsola

Nintendo Wii, 547Xbox 360, 546

konstruktorArrowhead, 98BasicExample, 52CameraPropertiesExample, 399DoFExample, 404faceExample, 74FPP, 432GlassMaterial, 176GraffitiExample, 364LensExample, 413LODObjectExample, 525MaterialsExample, 161ModelsExample, 261PathAlignModifier, 501Player, 439PrimitiveExample, 92rpgExample, 460segmentExample, 70Skeleton, 455skyboxExample, 137Sound3DExample, 472SoundControlExample, 482spritesExample, 80

tppExample, 451TransformBitmapMaterial, 179vertexExample, 63WeldExample, 529

kontroler, 546Wii Remote, 547Xbox Kinect, 546

konwertowanie modelu, 233kreator Mini, 25

Llens, 406, 461limity dotyczące zasobów, 558linie, 164LOD, Level of Detail, 15, 522Low poly, 231lustro, 22

�ładowanie modeli 3DS, 264

Mmacierz transformacji, 311malowanie, 361malowanie graffiti, 362mapa normalnych, 588mapowanie normalnych, 212Material, 559materiał, 143

AnimatedBitmapMaterial, 183, 189, 531BitmapFileMaterial, 86, 136, 172, 189BitmapMaterial, 170, 189, 504ColorMaterial, 167, 188, 497CompositeMaterial, 189Dot3BitmapMaterial, 212Dot3BitmapMaterialF10, 214Dot3MovieMaterial, 216EnviroBitmapMaterial, 174, 189EnviroColorMaterial, 168, 189GlassMaterial, 175, 189MovieMaterial, 181, 189, 504, 531

Poleć książkęKup książkę

Page 65: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Skorowidz 597

PhongBitmapMaterial, 207PhongColorMaterial, 204PhongMovieMaterial, 210PhongMultiPassMaterial, 218ShadingColorMaterial, 70, 206, 413TransformBitmapMaterial, 178, 189, 477VideoMaterial, 185, 189, 531WhiteShadingBitmapMaterial, 209, 329WireColorMaterial, 165, 497WireframeMaterial, 164, 188, 497

materiałydla tekstu, 497reagujące na światło, 202, 220

Matrix3D, 559Mesh, 559metadane, 149metoda

addChild(), 40, 44, 59addFace(), 99addLight(), 191addLights(), 198, 205addMaterial(), 187addModel(), 271addObjects(), 198addOnMouseMove(), 376addPanel(), 93addSegment(), 68addSounds(), 473addSprite(), 82asseble(), 571buildPrimitive(), 99clearMaterials(), 187clone(), 82context3DCreated(), 577createTexture(), 576createVertex(), 99curveTo(), 68defineSingleCurve(), 68destroyDeathstar(), 335disbleDof(), 402distance(), 535drawCircle(), 362, 366drawTriangles(), 578enableDof(), 402, 461

endFill(), 367export(), 234, 239exportModel(), 239extractFont(), 492getArray(), 99getBitmap(), 99getBoolean(), 99getColor(), 99getInt(), 99getMaterial(), 99getNumber(), 99getString(), 99initCamera(), 460initClouds(), 590initDirectionalSpriteObject(), 86initEarth(), 587initFilter(), 518initMaterial(), 205initMaterials(), 162initObjects(), 162initPanelListeners(), 194–197initPlayer(), 460initPrimitives(), 93, 110, 117, 121initSprite3DObjects(), 82landingDockOnMouseDown(), 379lineTo(), 68loadShipModel(), 350lookAt(), 305, 337moveBackward(), 297, 337moveDown(), 299, 337moveForward(), 297, 337moveLeft(), 300, 337movePivot(), 303moveRight(), 300, 337moveTo(), 296, 337moveUp(), 298, 337normalize(), 485onEnterFrame(), 94, 180, 324, 382, 485onFontLoaded(), 497onGroundClick(), 378, 460onKeyDown(), 350, 358onKeyUp(), 358onLandingDockSuccess(), 378onMaterialChangeEventHandler(), 161

Poleć książkęKup książkę

Page 66: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

598 Flash i ActionScript. Aplikacje 3D od podstaw

metodaonModelLoaded(), 235onModelLoaderSuccess(), 380onModelSelected(), 239onPanelEvent(), 177, 259onResize(), 137, 382overScene(), 376, 377parse(), 266perspectiveFieldOfViewLH(), 577pitch(), 306, 337play(), 183playAnimations(), 280primitiveChange(), 88primitiveChangeEventHandler(), 93, 100,

105, 113randomPosition(), 381removeMaterial(), 187render(), 41, 53, 424, 521roll(), 307, 337rotate(), 305rotateTo(), 304, 337scale(), 310, 337, 359setVisibility(), 186toDEGS(), 434toRADS(), 434traceLevels(), 537translate(), 295, 337update(), 456updateCamera(), 432, 440updateLight(), 198wrapText(), 502yaw(), 308, 337

metody klasyAbstractLens, 415AbstractPrimitive, 95AGALMiniAssembler, 571AmbientLight3D, 196AnimatedBitmapMaterial, 184AnimationData, 276AnimationLibrary, 277Animator, 278AnimatorEvent, 279AS3Exporter, 240Ase, 269

AwayStats, 509AWData, 275BitmapFileMaterial, 173BitmapMaterial, 172Camera3D, 419Cast, 149Clipping, 513Collada, 271ColorMaterial, 168CompositeMaterial, 188Cone, 122Context3D, 560Cube, 110Cylinder, 120DirectionalLight3D, 202DirectionalSprite, 87Dot3BitmapMaterial, 214Dot3BitmapMaterialF10, 216Dot3MovieMaterial, 217Elevation, 331ElevationReader, 537EnviroBitmapMaterial, 175EnviroColorMaterial, 170Explode, 335Face, 76FogFilter, 519GeodesicSphere, 115GlassMaterial, 178GridPlane, 107HeightMapModifier, 325HoverCamera3D, 422IndexBuffer3D, 561Keyboard, 342KeyboardEvent, 341LineSegment, 101LODObject, 527Matrix3D, 312Max3DS, 265Md2, 273Mesh, 66MouseEvent3D, 360MovieClipSprite, 85MovieMaterial, 182Obj, 267

Poleć książkęKup książkę

Page 67: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Skorowidz 599

Object3D, 48ObjectContainer3D, 50PathAlignModifier, 503PathExtrusion, 318PhongBitmapMaterial, 209PhongColorMaterial, 206PhongMovieMaterial, 211PhongMultiPassMaterial, 220Plane, 105Ray, 536RegularPolygon, 109RoundedCube, 112Scene3D, 45SeaTurtle, 123Segment, 71ShadingColorMaterial, 207SimplePanVolumeDriver, 468Skybox, 138Skybox6, 139Sound3D, 467Sphere, 113SpringCam, 425Sprite3D, 83TargetCamera3D, 420TextField3D, 496Torus, 116TorusKnot, 118TransformBitmapMaterial, 180Triangle, 104Trident, 102Vertex, 65VertexBuffer3D, 562View3D, 42Weld, 530WhiteShadingBitmapMaterial, 210WireColorMaterial, 167WireCube, 128WireCylinder, 130WireframeMaterial, 165WirePlane, 126WireRegularPolygon, 133WireSphere, 132WireTorus, 134

metody obsługi zdarzeń MouseEvent3D, 361mieszanie materiałów, 187mnożenie macierzy, 572model, 223

High poly, 231Low poly, 231typu MD2, 454

modelecieniowania, 587formaty, 232, 281statyczne, 232

modyfikator private, 52modyfikowanie powierzchni, 313Molehill, 16możliwości

Alernativa3D, 17Away3D, 14FIVe3D, 20Flare3D, 22Papervision3D, 19Sandy3D, 23Sophie3D, 24

możliwości kamery, 425MVC, Model View Controller, 41myszka, 352

Nnarzędzie Weld, 527normalna, 212

Oobiekt klasy

AbstractPrimitive, 94Arrow, 123Cone, 120Cube, 109Cylinder, 118DirectionalSprite, 85Face, 72GeodesicSphere, 114GlassMaterial, 176GridPlane, 77, 106

Poleć książkęKup książkę

Page 68: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

600 Flash i ActionScript. Aplikacje 3D od podstaw

obiekt klasyLineSegment, 100Mesh, 65Metody klasy Arrow, 125Metody klasy WireCone, 129MovieClipSprite, 83Plane, 104RegularPolygon, 107RoundedCube, 111SeaTurtle, 122Segment, 68Skybox, 135Skybox6, 138Sphere, 112Sprite3D, 81Torus, 115TorusKnot, 116Triangle, 102, 103Trident, 101Vertex, 62WireCone, 128WireCube, 126WireCylinder, 129WirePlane, 125WireRegularPolygon, 132WireSphere, 130WireTorus, 133

obiekty, 61, 522animations, 280BitmapData, 216, 319, 531DisplayObject, 18Graphics, 20LayerMaterial, 187LOD, 15, 18, 522MovieClip, 20Path, 313, 317Sound3D, 469speedMonitor, 349Sprite, 221TextField3D, 500Vector3D, 53, 313VertexBuffer3D, 575w Base, 62w Primitives, 87w Sprites, 76

obiektyw, 415AbstractLens, 414OrthogonalLens, 417PerspectiveLens, 415SphericalLens, 415ZoomFocusLens, 415

Object3D, 559obracanie, 301

kamery wokół obiektu, 590metody, 303właściwości, 302

obrazy wysokiej rozdzielczości, 215obsługa

Flash Playera, 551, 553tekstur, 455zdarzeń klawiatury, 340zdarzeń MouseEvent3D, 361zdarzeń myszy, 352, 385

odbicie Fresnela, 587odwołania, 188odwoływanie się do zasobów, 147ograniczanie widoczności, 522określanie odległości, 534opcja

Away3D Project stats, 506Flash WMODE Direct, 550

osadzanieaplikacji Flash, 550czcionki, 491zasobów, 149

oświetlenie typu DirectionalLight3D, 413

Ppakiet

away3d.animators, 278away3d.cameras, 431away3d.cameras. lenses, 439away3d.cameras.lenses, 414away3d.containers, 40, 522away3d.core.base, 62away3d.core.clip, 510away3d.core.stats, 506away3d.core.utils, 99

Poleć książkęKup książkę

Page 69: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Skorowidz 601

away3d.debug, 508away3d.events, 279, 359away3d.exporters, 233away3d.extrusions, 313away3d.loaders, 238away3d.loaders.utils, 277away3d.materials, 143, 188, 281away3d.materials.methods, 587away3d.modifiers, 319away3d.primitives, 88, 134, 140, 589away3d.primitives.data, 109away3d.sprites, 77away3d.textures, 587away3d.tools, 527com.greensock.easing, 398flash. events, 356flash.display3D, 564flash.display3D.textures, 575flash.events, 340

panel Hi-ReS-Stats, 510panel użytkownika, 89, 197, 201, 262panoramy, 134Papervision3D, 18parametry klasy

AGALMiniAssembler, 571Context3D, 560ElevationReader, 537

perspektywaosoby pierwszej, 422, 425osoby trzeciej, 422, 443

pilot Wii, 547platforma

Adobe Flash Player, 13Eclipse, 35

plikAS3ExporterExample.as, 235AS3GeomExporter.ms, 247Building.as, 474CameraPropertiesPanel.as, 392LensExample.as, 409LensPanel.as, 406MaterialsExample.as, 153, 202MaterialsPanel.as, 150, 153ModelsExample.as, 252

ModelsPanel.as, 249, 252monster.swf, 404playerglobal.swc, 552PrimitivesExample.as, 89PrimitivesPanel.as, 88spaceship.3DS, 529

pliki3DS, 232, 263, 374AGALMiniAssembler, 570AS, 233ASE, 232, 268AWD, 15, 233, 273, 439COLLADA, 232DAE, 232, 239FLV, 185GIF, 183graficzne, 188KML, 229KMZ, 229MD2, 233, 271ms, 247OBJ, 15, 232, 266, 447PSD, 213swf, 149, 491TGA, 455XML, 232

plugin AS3GeomExporter, 247płaszczyzna plane, 186pobieranie

Away3D, 28modelu, 281tekstury, 281

pokrywanie teksturą, 326pole tekstowe, 493pole widzenia, 389, 461Polygon, 559położenie

kamery, 432w przestrzeni, 53

poziom szczegółowości, 522poziomy obiektów, 523pozycja kamery, 463prędkość przemieszczania, 432

Poleć książkęKup książkę

Page 70: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

602 Flash i ActionScript. Aplikacje 3D od podstaw

procesor, 15CPU, 556GPU, 556

profil ścieżki, 314program

3D Studio Max, 224Adobe Flash, 26, 144Adobe Flash Player, 27Adobe Flash Professional CS5, 31Adobe Photoshop, 221Autodesk 3ds Max, 224, 246, 232Autodesk Maya, 224Blender, 226, 244CharacterFX, 228, 281Flash Builder, 26FlashDevelop, 26, 32Google Earth, 229Google SketchUp, 229LightWave, 225MilkShape 3D, 227PreFab3D, 230, 241TortoiseSVN, 28

Program3D, 562przemieszczanie, 294

metody, 295postaci, 454właściwości, 294

przycinanie widoku, 510przycisk togglePause, 186publikowanie projektów, 549punkt

obserwacji, 462początkowy pozycji kamery, 462

Rreakcje kamery, 463regulacja Depth of Field, 462rejestrator zdarzeń, 53rejestrowanie

obiektów, 439sceny, 388

rejestry w języku AGAL, 567repozytorium SVN, 28RGB, 212

rodzajeakceleracji, 549kamer, 418modeli, 223, 283rejestrów, 567rzutowania, 388silników Away3D, 26soczewek, 406świateł, 192

AmbientLight3D, 220DirectionalLight3D, 220PointLight3D, 220

rozmiar tekstury, 178rozmieszczanie obiektów, 367rysowanie, 361, 367rzeczywistość

rozszerzona, 541wirtualna, 541

rzutnia, 388, 461rzutowanie, 388

SSandy3D, 23Scene3D, 40, 43, 59

dodawanie obiektów, 44usuwanie obiektów, 44

schematmapowania wypukłości, 212wyświetlania obrazu, 389

Shader, 562Fragment Shader, 563Vertex Shader, 563

silnikAwayPhysics, 539Box2DFlash, 539Bullet Physics Engine, 540JigLibFlash, 538ND2D, 558Starling, 558

silniki fizyki, 538skalowanie, 309

metody, 310właściwości, 309

Poleć książkęKup książkę

Page 71: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Skorowidz 603

skrypt AS3GeomExporter, 246soczewki, 406, 462Sophie3D, 24Sophie3D PRO, 24Sophie3D PRO FULL, 24Sprite3D, 559Stage3D, 548, 555, 563

Face, 559Material, 559Matrix3D, 559Mesh, 559Object3D, 559Polygon, 559Sprite3D, 559Texture, 559Vector3D, 559Vertex, 559

Stage3D API, 15stałe klasy

AbstractLens, 415AnimationDataType, 277AnimationEvent, 279Camera3D, 419Keyboard, 342KeyLocation, 343MouseEvent3D, 360

statystyki, 507sterowanie

dźwiękiem, 487statkiem, 344

SVN, 28symulowanie fizyki, 533, 538

�ścieżka, 313środowisko

Adobe Flash Builder, 35Flex SDK, 33, 149, 552

światło, 191AmbientLight3D, 194DirectionalLight3D, 199PointLight3D, 196

Ttablica

pathVectors, 501vertices, 141

technologiaAdobe Pixel Bender, 214Flash, 14, 533Kinect, 546

tekst, 489jako BitmapData, 498modyfikowany, 499płaski, 492przestrzenny, 496w obiekcie MovieClip, 499

teksturabazowa, 216cieni, 588mapy odbijania światła, 588skały, 216Specular, 218

Texture, 559tła, 134tor, 314TPP, Third Person Perspective, 422transformacja

obrót, 311pochylenie, 311skalowanie, 311translacja, 311

tryb wolny kamery, 435twierdzenie Pitagorasa, 456tworzenie

animacji, 189, 281aplikacji dla przeglądarek, 14kontenerów, 49macierzy transformacji, 312obiektów 3D, 224, 281projektu ActionScript 3.0, 31projektu Flex, 36rzeczywistości rozszerzonej, 542widoku, 41

Poleć książkęKup książkę

Page 72: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

604 Flash i ActionScript. Aplikacje 3D od podstaw

Uukład współrzędnych

globalny, 55lokalny, 55

umieszczanie obiektów na scenie, 44ustawienia swfobject, 551usuwanie obiektów ze sceny, 44

VVector3D, 559Vertex, 559View3D, 40, 59

Wwarstwy Stage3D, 557wartość FPS, 41, 509wektor

kierunkowy, 535normalny, 212przesunięcia, 432

widok, 40, 59Wii Remote, 547wirtualna klawiatura, 20wizualizacja

dźwięku, 478kuli ziemskiej, 580obiektu ObjectContainer3D, 49

właściwości klasyAbstractPrimitive, 95AmbientLight3D, 195AnimatedBitmapMaterial, 184AnimationData, 276AnimationDataType, 277AnimationEvent, 279Animator, 278Arrow, 124AS3Exporter, 240Ase, 269AWData, 275BitmapFileMaterial, 173BitmapMaterial, 171

Camera3D, 419Clipping, 512Collada, 271ColorMaterial, 168CompositeMaterial, 188Cone, 121Cube, 110Cylinder, 119DirectionalLight3D, 202DirectionalSprite, 87Dot3BitmapMaterial, 214Dot3BitmapMaterialF10, 216Dot3MovieMaterial, 217Elevation, 331EnviroBitmapMaterial, 175EnviroColorMaterial, 169Explode, 335Face, 76FogFilter, 519GeodesicSphere, 115GlassMaterial, 178GridPlane, 107HeightMapModifier, 324HoverCamera3D, 422Keyboard, 342KeyboardEvent, 341LineSegment, 101LODObject, 526Matrix3D, 312Max3DS, 265Md2, 273Merge, 336Mesh, 66MouseEvent3D, 360MovieClipSprite, 84MovieMaterial, 182Obj, 267Object3D, 46ObjectContainer3D, 49PathAlignModifier, 502PathExtrusion, 318PhongBitmapMaterial, 209PhongColorMaterial, 205PhongMovieMaterial, 211

Poleć książkęKup książkę

Page 73: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

Skorowidz 605

PhongMultiPassMaterial, 219Plane, 105PointLight3D, 199Ray, 536RegularPolygon, 108RoundedCube, 112Scene3D, 44Segment, 71ShadingColorMaterial, 207SimplePanVolumeDriver, 468Sound3D, 467Sphere, 113SpringCam, 424Sprite3D, 83TargetCamera3D, 420TextField3D, 496Torus, 116TorusKnot, 118TransformBitmapMaterial, 180Triangle, 104Vertex, 65VideoMaterial, 186View3D, 41Weld, 530WhiteShadingBitmapMaterial, 210WireColorMaterial, 166WireCone, 129WireCube, 127WireCylinder, 130WireframeMaterial, 165WirePlane, 126WireRegularPolygon, 133WireSphere, 131WireTorus, 134

właściwości pola tekstowego, 490właściwość

camera, 46, 59, 418focus, 390, 392fov, 389, 390freeCamera, 443interactive, 384maxblur, 402mimeType., 150ownCanvas, 379, 521

pivotPoint, 302, 337position, 53, 295, 337rotationX, rotationY, rotationZ, 303scaleX, scaleY, scaleZ, 309scene, 43, 59smooth, 531statsPanel, 506subdivisionX, 325subdivisionY, 325view, 424visible, 521volume, 466x, y, z, 294zoom, 390, 391

współrzędne obiektów, 56, 59wtyczka Adobe Flash Player, 27, 553wydajność aplikacji, 506wykorzystanie kart graficznych, 556wykrywanie

kolizji, 534nierówności podłoża, 536

wysoka rozdzielczość obrazu, 215wyświetlanie

modelu, 281obiektów, 542, 562statystyk, 509tekstu, 489, 492zawartości sceny, 510

XXbox Kinect, 546

Zzdarzenia typu modelSelectEvent, 259zdarzenie

Event.ADDED_TO_STAGE, 565Event.ENTER_FRAME, 41, 93, 284, 361,

461Event.RESIZE, 93, 357Event.SELECT, 259Event.SOUND_COMPLETE, 469ExporterEvent.COMPLETE, 234

Poleć książkęKup książkę

Page 74: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości

606 Flash i ActionScript. Aplikacje 3D od podstaw

zdarzeniefocusAnimationEvent, 400KeyboardEvent, 340KeyboardEvent.KEY_, 401KeyboardEvent.KEY_DOWN, 357KeyboardEvent.KEY_UP, 357lessSegmentsEvent, 180Loader3DEvent, 238MouseEvent, 189, 352MouseEvent.MOUSE_DOWN, 357MouseEvent.MOUSE_UP, 357

MouseEvent3D.MOUSE_DOWN, 359MouseEvent3D.MOUSE_MOVE, 359MouseEvent3D.MOUSE_UP, 359

znacznik [Embed], 149, 160zniekształcenia obrazu, 415zoom, 390, 461

cyfrowy, 390optyczny, 390

Poleć książkęKup książkę

Page 76: New ul. Kościuszki 1c, 44-100 GLIWICE - Helionpdf.helion.pl/flacpo/flacpo.pdf · 2020. 8. 26. · 340 Flash i ActionScript. Aplikacje 3D od podstaw Uywanie klawiatury W większości