Blender

Blender Game Engine: žaidimas per pusvalandį

Įžanga

Viena unikaliausių Blender savybių tarp kitų 3D modeliavimo/animacijos paketų yra vidinis žaidimų variklis (Game Engine, arba BGE). Kiekvienas jūsų modelis be didesnių pastangų gali tapti dinamišku objektu, kuriam galioja fizikos (varikliuko) dėsniai ir jūsų nustatytos taisyklės. Teip mes galime sukurti, tarkime, šokinėjantį kamuoliuką ping-pongui, arba lenktyninį automobilį. Šioje pamokoje pabandysiu parodyti, kaip galima nesunkiai ir neturint jokios programavimo kalbos žinių sukurti paprastą žaidimą, neparašius nei vienos kodo eilutės.

Pasiruošimas

Pradžioje - ingredientai. Mums reikės pačio Blender. Šios pamokos rašymo metu paskutinė versija yra 2.40, bet turėtų veikti ir su visomis versijomis pradedant 2.34. Rekomenduotina įdiegti programavimo kalbos Python 2.4 versiją (jei Blender yra 2.40), arba 2.3, jei Blender yra senesnis. Kuriant sudėtingesnius žaidimus papildoma logika yra rašoma būtent Python programavimo kalba, naudojant BGE API funkcijas. Įdiegus python reikia "User preferences" lange nurodyti kelią iki python įdiegimo katalogo.

Python konfigūravimas

Atrodo, visus reikalingus ingredientus turime, galime pereiti prie kūrybos.

Idėja ir scena

Nebūdami labai originalūs, pačiai pradžių pradžiai mes sukursime paprastą žaidimuką, kurio tikslas - pereiti labirintą. Savaime suprantama mums reikės pačio labirinto, ir valdomo veikėjo. Taigi, susikurkime labirintą.

3D lange paspaudžiame Numpad 7 - nustatome žiūrėjimo kampą "top" (iš viršaus), paskui Numpad 5 - neperspektyvinis režimas. Shift+C nustatome kursorių į koordinačių pradžią ir C - kursorius mūsų ekrano centre. Kadangi pradžioje nenaudosime mygtukų juostos, paspauskime Ctrl+aukštyn (grąžinti galima su ta pačia kombinacija).

Spaudžiame tarpą, iš meniu išsirenkame "Add"->"Mesh"->"Plane". Turime plokštumą su matmenimis 1x1. Paspaudus S klavišą (nuo "scale") padidiname plokštumą iki norimo dydžio. Aš pasidariau 12x12. Kadangi nuo plokštumos pridėjimo nė karto nespaudėm TAB, esame "edit mode", primygtinai spaudžiame W kalvišą ir iš meniu renkamės patį pirmą punktą "subdivide". Tai kartojame keletą kartų, kol gausime pakankamai tankų tinklelį. Man užteko 4-ių kartų, nes mano labirintas nebus didelis. Vaizdą turėtumėme turėti tokį:

Sudalinta plokštuma

Dabar, pasinaudodami Blender žymėjimo galimybėmis nusipiešime labirinto kontūrus. Išsirenkame "face select mode" (pažymėta raudonai) ir laikydami shift pažymime (dešinys pelės klavišas) norimus face'us. Mano labirinto forma nebuvo labai sudėtinga, atrodo maždaug taip:

Sudalinta plokštuma

Pasižymėję sienos viršų negailestingai mygame NumPad 1. Jis mums parodo "Front View". Dabar galime "iškelti" sienas. Tai padarysime "Extrude" veiksmo pagalba. Spaudžiame E ir renkamės "Region". Pasirinkus automatiškai įjungiamas nešiojimo (grab) veiksmas tik Z ašimi. Pakelkime sieną auktyn per vieną langelį. Jau turime labirintą ("rotate view" arba peržiūros kampo vartymo veiksmas atliekamas nuspaudus trečią-ratuko pelės klavišą):

Labirintas

Žaidime dalyvaus tik du veikėjai - labirintas ir pasiklydėlis(žaidėjas). Išjungiame "edit mode" (TAB), ir lygiai taip pat, kaip darėme su plokštuma, sukuriame žaidėjo objektą. Paprastumo dėlei tegul tai būna sfera. "Add mesh"->"UVsphere", Segments: 16, Rings:16 (galima palikti ir po 32). Geriausiai tai daryti būnant "Top view" arba Numpad 7. G (nuo "grab") komandos pagalba, išjungę "edit mode" nunešame sferą į patį kairiausią, apatinį labirinto kampą. Keisdami žiūrėjimo puses sferą padedame taip, kad ji būtų padėta ant labirinto grindų ir nekirstų sienų. Norint sferą įtalpinti taip pat reikės pasinaudoti jau mokama S komanda. Taigi, abu "aktorius" turime, linkas pagrindinei šios pamokos temai - žaidimo logikai.

Aktoriai, fizika ir logika.

Pagrindinis mūsų uždavinys - priversti sferą judėti priklausomai nuo mūsų spaudžiamų klavišų. Blenderyje paprastai logikai yra skirtas panelis "Logic", pasiekiamas paspaudus F4. Prieš tai turime grįžti į dviejų laukų režimą - Ctrl+aukštyn. Dešiniu pelės klavišu pasižymėkime sferą. "Logic" panelyje, kairiame viršutniame kampe matome mygtuką "Actor" ir nebijodami jį mygame :) Šalia atsiranda dar du: "Ghost" ir "Dynamic". Pirmu atveju aktorius nereaguos į kitus objektus, nebus skaičiuojamos kolizijos. Taigi, mums reikia antrojo varianto - Dynamic. Pažymėję jį gauname dar nemažai nustatymų. Pradžioje su "Size" lauku nustatome dydį, kad maždaug atitikų mūsų sferos dydį. 3D lange aktoriaus dydis rodomas kaip punktyrinis apskritimas aplink aktorių. Kolkas užteks tiek.

Aktoriaus nustatymai

Logika. Tame pačiame panelyje, dešiniau, matome tris stulpelius: "Sensors", "Controllers" ir "Actuators"(pavaros). Sensoriai, jau iš pavadinimo galima atspėti, priiminėja signalus iš išorės. Kontroleriai nustato ryšius tarp sensorių ir pavarų, o pavara valdo patį objektą (ar aplinką). Sukuriame po vieną kiekvieno tipo elementą ir visus tris sujungiame per geltonus tam skirtus taškus. Sureguliuokime sensorių. Vienas laukas jame turi reikšmę "Always", tai reiškia, kad signalas siunčiamas visada. Vietoj to pasirinkime "Keyboard" - signalai iš kalviatūros. Sensoriaus savybės šiek tiek prasiplečia, mums reikia užpildyti tik lauką "Key". Pasirinkę jį paspaudžiame rodyklę aukštyn. Tai bus veiksmas "judėti į priekį". Kontrolerio nekeičiame, paprastame mūsų žaidime jis tiks toks, koks yra. Pavaros nustatymuose matome šešias eilutes. Jos pavadintos gana intuityviai, be to, palaikius kursorių ties pavadinimais galima paskaityti paaiškinimą, bet, trumpai tariant, mums reikalingas tik dLoc ir tai reiškia "Location", absoliutinė objekto padėtis erdvėje. Kiekvienas pavaros stulpelis (jų yra trys) skirtas kiekvienai ašiai - x, y, z, paraidžiui. Žiūrint iš viršaus "pirmyn" mūsų sferos atžvilgiu reiškia koordinatės didėjimą y ašimi. taigi, antrame stulpelyje įvedame nedidelį teigiamą skaičių - tarkim 0.10. Vienos ašies nustatymai atrodo taip:

Aktoriaus valdymo logika

Taip mes turime viena kryptim valdomą aktorių. Atsižvelgdami į judėjimo kryptis padarome analogiškas sujungtas sensorių-kontrolerių-pavarų trijules. Rodyklei žemyn dLoc = -0.10 ir t.t. Beje, jei ryšius sudėliojote neteisingai, ir norite ištrinti ryšį - ant jo užvedus kursorių spauskite X. Šis klavišas blenderyje visada atlieka juodą trynimo darbą. Kai turime sureguliavę visus keturis rodyklių klavišus, galime pabandyti kaip tai veikia. Tiesiog nusistatome sau patogų žiūrėjimo kampą, isijungiame "textured" režimą su Alt+Z ir kursoriui esant 3D lange paspaudžiame P (nuo "Play"). Taip, mes galime judinti sferą :]

Pastaba: fizikos varikliukas simuliuoja gravitaciją ir trintį. Dėl to būna pašalinių efektų (sfera pradeda šokinėti), todėl patartina Material nustatymuose (F5), World skiltyje, prie "Mist/Stars/Physics" Grav slankiklį nustatyti į nulį (panakinti gravitaciją).

Kamera, žaidimo tikslas

Paleidę tokį žaidimą, koks jis yra dabar, netrukus pastebėsite, kad mūsų aktorius dingsta iš matomumo ribų, ir mes su kamera liekame stebėti labirinto kampą. Šiek tiek netvarka. Kadangi mes norime tai sutvarkyti, turėsime "pririšti" kamerą prie aktoriaus. Nustatome kamerą virš aktoriaus, pirma pažymime kamerą ir laikydami Shift pažymime aktorių. "Pririšama" parent komanda - Ctrl+P, "make parent". Tarp kameros ir aktoriaus atsiranda punktyrinė linija. Jei pabandysime pajudinti aktorių, pastebėsime, kad kartu juda ir kamera. Tikslas pasiektas. Beje, tokiu pačiu būdu galima pririšti ir lempą. Ištrynus kitas šviesas scenoje bus įdomus efektas - matysis tik ta vieta, kur aktorius.

Žaidimui trūksta paskutinio dalyko - tikslo. Norint pereiti labirintą jame turi būti išėjimas. Mes tai padarysime paprastai, sukursime objektą, kurį žaidėjas turės surasti. Objektui būtina sukurti savybę("property"), į kurią aktorius reaguos. Sukuriame Suzaną, ir sukuriame int tipo savybę, su pavadinimu "fin" ir reikšme "1".

Tikslo objektas

Kad aktorius reaguotų į tiklso objektą, reikės papildomo, specialaus sensoriaus, kurio tipas būtų "Collision". Sukūrus tokio tipo sensorių reikia nurodyti savybės vardą, kurią turintį objektą palietus aktorius gaus komandą vykdyti norimą veiksmą (mano atveju, kaip matome, tai buvo "fin". Prie šio sensoriaus, per kontrolerį, prikabiname pavarą, bet ne standartinio "Motion", o "Scene" pavarą, su nustatymu "Restart". Tada, suradus Suzaną, žaidimas parsidės iš naujo (žinoma, ateityje galima pakeisti tai į naujo labirinto krovimą).

Pabaigos sensorius

Pabaiga!

Štai ir viskas! Turime minimalistinį, veikiantį žaidimą, su visais žaidimo atributais. Kolkas, galime paleisti jį tik pačiame blenderyje, tačiau labai paprasta pagaminti .exe failą - tereikia pasirinkti File - Save runtime ir nurodyti .exe failo vardą. Tiesa, jis neveiks be python.dll ir SDL.dll bibliotekų, bet norint nusiųsti žaidimą draugui nesunku šiuos failus pridėti kartu.

Kad būtų lengviau kepurnėtis šioje informacijoje, pridedu failus, naudotus rašant pamoką:

Tai tik minimalus įvadas į vis augančią BGE aplinką. Naudojant vien standartinius sensorius ir pavaras galima parašyti gana interaktyvų žaidimą, ir atsiveria visai naujos galimybės, kai pradedama naudoti python kalba su visomis įmanomomis galimybėmis. Tikiuosi, kad perskaičius šia pamoką pasidarė aišku, kas tai ir su kuo valgoma.

Jei pamokoje yra neaiškių vietų, radote klaidų, reikėtų kitokių pataisymų, ar norite išsakyti nuomonę apie pamoką - rašykite man į shwarnas pas gmail taškas com.

Shwarnas, 2006 04 20