[ Pobierz całość w formacie PDF ]
dla programistów piszemy mini-quake'a out.setLength(0.03f); Listing 6. Główna pętla naszego mini-Quake'a std::cout while(device->run()) { } driver->beginScene(true, true, 0); smgr->drawAll(); guienv->drawAll(); Wykorzystujemy, jak widać, wcześniej S selectedSceneNode = smgr->getSceneCollisionManager()->getSceneNodeFromCameraBB utworzony selektor. Interesuje nas teraz (cameraFPS); sprawdzenie przecięcia z wczytaną przez if(selectedSceneNode != level_node) { nas postacią. Postępujemy w bardzo if(selectedSceneNode->getID()==SYDNEY_ID) { podobny sposób jak poprzednio: std::cout S core::vector3df a=cameraFPS->getPosition(); if (sm->getSceneCollisionManager() S cameraFPS->setPosition(a); ->getCollisionPoint(line, } sydney_selector, end, triangle)) { S } core::vector3df out = selectedSceneNode = 0; driver->endScene(); triangle.getNormal(); } out.setLength(0.03f); S sydney_model->setMD2Animation (0, waypoint, 0.25f); mu tę możliwość. Załóżmy, że będziemy ( EMAT_PAIN_A ); S sydney_model->addAnimator(anim); strzelać poprzez wciśnięcie klawisza pain_time=device-> [spacja]. Wykrycie tej sytuacji to zadanie getTimer()->getTime(); Niestety, powyższe rozwiązanie nie jest dla obiektu przetwarzającego zdarzenia } najlepsze, ponieważ postać będzie biegać SimpleEventReceiver. Po wciśnięciu spacji również tyłem. W Irrlicht, jak na razie, wywołujemy funkcję shoot_test. W drugiej części powyższej instrukcji if nie zaimplementowano automatycznego Test, czy w coś trafiliśmy, polega na wykonujemy jeszcze jedną ważną czyn- odwracania się animowanej postaci. tym, że sprawdzamy, co przecina promień ność. Standardowo, nasza postać biega po Należy to zrobić samodzielnie i jest to poprowadzony od kamery w kierunku planszy. Gdy ją trafimy, chcemy wywołać zadanie dla Czytelniczki bądz Czytelni- punktu, na który spoglądamy. W tym animację odpowiednią do sytuacji. Wizu- ka. celu potrzebny będzie menedżer kolizji. alizację otrzymania trafienia uruchamia W pierwszej kolejności musimy wyzna- polecenie: sydney_model->setMD2Anima- Wprawiamy system w ruch czyć początek oraz koniec promienia. tion( EMAT_PAIN_A );. Dodatkowo, do Na Listingu 6 została przedstawiona pętla Przedstawia się to w następujący sposób: zmiennej pain_time zapisujemy aktualny while, odpowiedzialna za przetwarzanie czas. W głównej pętli, po pewnym czasie, S danych. Oprócz wykonywania identycz- core::vector3df start = przywrócimy standardową animację nych czynności jak w poprzednim progra- camera->getPosition(); biegu. W ten sposób po trafieniu nasza S mie, dodatkowo sprawdzamy, czy nastąpiła core::vector3df end = postać zareaguje w odpowiedni sposób. kolizja pomiędzy nami (tzn. kamerą, którą (camera->getTarget() - start); sterujemy) a postacią. Ponieważ scena end.normalize(); Podsumowanie w systemie Irrlicht zawsze jest dzielona na start += end*5.0f; Mam nadzieję, że tą prezentacją biblio- S węzły, to oczekujemy, że system wskaże end = start + (end * camera teki Irrlicht udało mi się zachęcić Czy- nam węzeł, z którym kolidujemy. Tak stanie ->getFarValue()); telników do własnych eksperymentów. się, jeśli wydamy następujące polecenie: Dobrą lekturą są także dodatkowe Zanim sprawdzimy, czy w coś trafiliśmy, przykłady dołączone do dystrybucji S selectedSceneNode = smgr-> deklarujemy jeszcze dwie zmienne: Irrlicht. Polecam również zapoznanie S getSceneCollisionManager()-> się z projektem IrrlichtNX. Jego autorzy getSceneNodeFromCameraBB(cameraFPS); core::triangle3df triangle; wprowadzają liczne poprawki do kodu core::line3d line(start, end); Irrlicht oraz nowe możliwości. Choć Gdy wystąpi kolizja z obiektem kamery, wersja ta jest dostępna tylko przez CVS, menedżer kolizji przypisze zmiennej W pierwszej znajdzie się trójkąt, który to pozwala na skorzystanie z nowych selectedSceneNode odpowiednią war- trafiliśmy, a druga zmienna reprezentuje możliwości, zanim zostanie wydana tość. Następna instrukcja warunkowa linię testową, czyli promień. Test, czy oficjalna wersja biblioteki. wyklucza kolizję z otoczeniem, a ponie- nasz promień przecina się ze ścianami waż wczytaliśmy tylko jeden obiekt, to pomieszczenia, sprowadza się do jednej W Internecie: wiemy, czy nastąpiła kolizją pomiędzy instrukcji warunkowej: " Strona domowa biblioteki Irrlicht: nim a kamerą, którą sterujemy. http://irrlicht.sourceforge.net/ S if (sm->getSceneCollisionManager() " Specjalna wersja Irrlicht, wyposażo- S A gdzie strzelanie? ->getCollisionPoint(line, level_ na w wiele poprawek i rozszerzeń W naszym prototypie możemy już cho- selector, end, triangle)) { w stosunku do wersji oryginalnej: S dzić, ale brakuje jeszcze jednej funkcji core::vector3df out = http://www.irrlichtnx.mmdevel.de/ strzelania. Dodajmy do naszego progra- triangle.getNormal(); 71 www.lpmagazine.org [ Pobierz całość w formacie PDF ] |