[ 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 ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • kudrzwi.htw.pl
  • Archiwum
    Powered by wordpress | Theme: simpletex | © Wszystkie rzeczy zawsze działają zgodnie ze swoją naturą.