DarkBasic alapok – 2. rész

 

Most következzék az egyik múltkori számban leközölt DarkBasic programnyelv ismertetésének a folytatása. Elöljáróban megismétlem, hogy egy elsősorban játékfejlesztésben használt egyszerű programnyelvről van szó.

 

DarkBasic Pro fejlemények:

 

Sajna Magyarországra még mindig nem ért ide, a DarkBasic-kel ellentétben. Ha ideér akkor várhatóan a DarkBasic-et behozó Ability Office Kft. hozza Magyarországra. (www.ability.hu )

 

További fejlemények, hogy a DarkBasicPro hibákat még mindig tartalmaz, nem keveset, számítási hibák... stb.

 

Tippek trükkök, segédletek:

 

Érdemes a program helpjével foglalkozni először, mert leírja az általános dolgokat, s könnyen és gyorsan okulhatunk belőle. Aki plusz segédleteket akar, az nézze meg a http://www.darkbasic.com címet és ott keresse meg a create részleget.

 

"DarkBasic-esek" segédletei:

 

1. SPRITE gyorsító módszer:

 

A SPRITE-ok normál módban rendkívül leterhelik a gépet, de ezzel a módszerrel még a PASTE IMAGE parancsnál is gyorsabb a program futása!

 

sync on

backdrop on

load image "fájl.bmp",1

do

if upkey()=1 then inc y

if downkey()=1 then dec y

 

sprite 1,320,240+y,1

set sprite 1,0,1

 

És ez a SET SPRITE parancs az, ami a lényeg (plusz a backdrop on, ami automatikusan törli a SPRITE által hagyott nyomot), ugyanis ez a SET SPRITE 1,0,1 azt jelenti, hogy kikapcsolja a SPRITE frissítését, ezzel a gépnek nem kell törődnie, a hátteret pedig úgyis automatikusan, és lassítás nélkül törli a BACKDROP!)

Ezzel a módszerrel, és kis grafikai tudással remek RPG-ket vagy RTS-eket lehet készíteni! Illetve bármit, ami 2D!

 

2. Collision avagy az ütköztetés:

Ez a segédlet végre, szerintem egyszerű, sok lehetőség van benne.

 

rem először egy kis képfrissités

Sync on

Sync rate 31

rem meghatározzuk a db számot

for x=1 to 5

rem csinálunk kockákat

make object cube x,100

rem véletlenszerűen elhelyezzük őket

position object x, rnd(2000),0,rnd(2000)

rem ITT ÁLLITJUK BE AZ ÜTKÖZTETÉST !!!

set object collision to boxes x

rem frissítünk egyet

next x

rem megcsináljuk a "playert"

make object sphere 10,50

rem ezt is elhelyezzük

position object 10,-100,0,-100

rem EZZEL A SORRAL ÁLLITJUK BE A GÖMB ÜTKÖZTETÉSÉT !!

set object collision to spheres 10

rem program törzs kezdete

do

rem mozgatás

ay#=object angley(10)

if upkey()=1 then move object 10,10

if leftkey()=1 then yrotate object 10,wrapvalue(ay#-10)

if rightkey()=1 then yrotate object 10,wrapvalue(ay#+10)

rem HA A GÖMB ÜTKÖZIK, AKKOR...

if object collision (10,0)>0 then position object 10,x#,0,z#

x#=object position x(10)

z#=object position z(10)

rem ez a nézet

cz#=nextzvalue(z#,ay#-180,100)

cx#=newxvalue(x#,ay#-180,100)

position camera cx#,75,cz#

point camera x#,25,z#

rem képfrissités

sync

loop

 

3. Köd, látótávolság és ég:

 

Ez a segédlet benne van a DarkBasic példáiban, de úgy gondolom, hogy senkinek sem árthat, ha lát egy élő példát rá. Ezeket a sorokat még a "DO" parancs elé kell beírni, sőt nem árt ha a mátrix sorai elé tesszük:

 

rem bekapcsoljuk a köd effektet

fog on

rem megadjuk a színét

fog color rgb(128,128,128)

rem most belőjük a látótávolságot

fog distance 3500

rem bekapcsoljuk a "hátteret" azaz az eget

backdrop on

rem megadjuk hogy milyen színű legyen

color backdrop rbg(10,20,180)

 

Körülbelül ennyi lenne, nem nehéz, viszont klassz hatást érhetünk el vele. Ez így igen szép, de nem biztos, hogy a "screen FPS" szint túl jó lesz, mert megesik, hogy amíg áll a kép vagy nagyon kicsit mozdítunk, változtatunk rajta, az fps pl. 75 lesz, de amint mozgásba lendülünk egyszerre egérrel és billentyűkkel, abban a pillanatban leeshet 17 fps-re, ami nem a legkedvezőbb, ezért FELTÉTLENÜL alkalmazzuk az egész elé a SYNC parancsokat:

 

rem bekapcsoljuk a képfrissitést

sync on

rem rejtsük el a egeret

hide mouse

rem határozzuk meg az fps rátát

sync rate 30

 

 

4. 3rdPs azaz külsőnézetes mozgatás:

 

sync on

sync rate 30

for x=1 to 5

make object cube x,100

position object x,rnd(2000),0,rnd(2000)

next x

make object sphere 10,50

do

ay#=object angle y(10)

if upkey()=1 then move object 10,10

if leftkey()=1 then yrotate object 10,wrapvalue(ay#-10)

if rightkey()=1 then yrotate object 10, wrapvalue(ay#+10)

x#=object position x(10)

z#=object position z(10)

cx#=newXvalue(x#,ay#-180,100)

cz#=newZvalue(z#,ay#-180,100)

position camera cx#,100,cz#

point camera x#,50,z#

sync

loop

 

Az alábbi sorokkal határozzuk meg, hogy hány objektumot (1.) akarunk létrehozni, milyen objektumok (2.), hol és mekkora téren akarjuk elhelyezni őket (3.), generálunk és meghatározhatjuk milyen objektumot akarunk mozgatni(5.).

 

for x = 1 to 5

make object cube x,100

position object x, rnd(2000),0,rnd(2000)

next x

make object sphere 10,50

 

Ezekkel a sorokkal mozgathatjuk a már megcsinált gömbünket, minél nagyobb számok szerepelnek, annál gyorsabban mozognak, s ez visszafelé is igaz.

 

if upkey()=1 then move object 10,10

if leftkey()=1 then yrotate object 10,wrapvalue(ay#-10)

if rightkey()=1 then yrotate object 10, wrapvalue(ay#+10)

 

Ezekkel a sorokkal tudjuk beállítani a nézet és a player közti távolságot ill. a szöget(180). Ezeket állítgatva egész érdekes perspektívákat kaphatunk. Itt azért -180 mert 180 fokkal azaz megkerülve látjuk a playert. Ha más szöget állítunk be akkor ez változni fog természetesen.

 

cx#=newXvalue(x#,ay#-180,100)

cz#=newZvalue(z#,ay#-180,100)

position camera cx#,100,cz#

point camera x#,50,z#

 

 

5. Kamera mozgatás:

 

Igazából ehhez a tutorial-hoz elég , ha csak kicsit tudunk angolul, mert szinte teljesen logikusan jönnek az utasítások egymás után.

 

Sync on

sync rate 30

for x = 1 to 5

make object cube x,100

position object x, rnd(2000),0,rnd(2000)

next x

do

cay# = camera angle y()

if upkey()=1 then move camera 10

if leftkey()=1 then yrotate camera wrapvalue (cay#-5)

if rightkey()=1 then yrotate camera wrapvalue (cay#+5)

sync

loop

 

Ezzel a három sorral meghatározzuk a proginknak, hogy csináljon 5 kockát, majd azokat helyezze el a képernyőn véletlenszerűen...

 

for x = 1 to 5

make object cube x,100

position object x, rnd(2000),0,rnd(2000)

 

Ezzel a három sorral a kamera mozgatását határozzuk meg az y-lon tengelyen, a mozgató nyilakkal...

 

i f upkey()=1 then move camera 10

if leftkey()=1 then yrotate camera wrapvalue (cay#-5)

if rightkey()=1 then yrotate camera wrapvalue (cay#+5)

 

6.A "sync" parancs használata:

 

Cél: A Dark Basic-ben nélkülözhetetlen screen refresh parancs használatának bemutatása. Kezdjük a gyakorlást azzal, hogy kirajzolunk egy 3D-s gömböt a képernyőre.

 

Sync On

Make Object Sphere 1,100

Do

Sync

Loop

 

Folytassuk azzal, hogy megpróbáljuk megérteni, hogyan is került a gömb a képernyőre. Vegyük sorba az egyes parancsokat.

 

Sync on

 

"Sync on" Utasítja a DarkBASIC-et, hogy írja felül a képernyőt, amikor a "Sync" parancsot használjuk. A "Sync" és a "Sync on" parancsot minden DarkBASIC-kel készült 3Ds programban használhatod.

 

Make Object Sphere 1,100

 

Mint a legtöbb DarkBASIC-es parancs, a "Make Object Sphere" használata is könnyen elsajátítható. Ez a parancs utasítja a DarkBASIC-et , hogy készítsen egy gömb alakú objektumot. A két szám jelentése a sor végén teljesen egyértelmű. Az első szám "1" Az objektum számát jelöli, aminek a segítségével később tudunk rá hivatkozni. Így megfogjuk tudni változtatni, mozgatni. A második szám "100" a gömb méretére utal (sugár).

 

Do

 

Loop

 

A "Do" és a "Loop" parancsok együtt használandók. A kettő közé beillesztett utasítások folyamatosan ismétlődnek addig, amíg meg nem nyomjuk az ESCAPE vagy az F12 billentyűk valamelyikét. Majdnem minden programban vagy játékban használjuk ezeket a parancsokat, amit gyakran hívunk "main loop" vagy "game loop"-nak. Ez adja a program gerincét. Ebbe a loop-ba mi beszúrtuk a "sync" parancsot.

 

Sync

 

"Sync" a synchronize rövidítése. Mihelyst a programban valamelyik objektumnak megváltozik a pozíciója, az új helye rögzül a memóriában. Ha te kikapcsolod a szinkronizációt (synchronization) és utána valaminek megváltozik a helye, semmi sem fog történni, mert lesz felülírás, tehát a régi objektumot fogja mutatni a régi helyén. Ez lassú programfutást vagy teljesen üres képernyőt is eredményezhet. A "sync" olyan, mint a színházban a függöny. Új jelenetnél behúzzák a függönyt a kellékesek gyorsan átrendezik a színpadot. Mikor a függöny ismét kinyílik a színpad teljesen átrendeződik, máshova kerülnek a kellékek. Mikor eljön az ideje az új felvonásnak (scene) a függönyök behúzódnak, gyorsan átpakolnak mindent, teljesen megváltoztatják a színpadot és a "Sync" parancs utasítja a függönykezelőt, hogy kapja össze magát és húzza szét a függönyt, mert már minden rendben van. Természetesen vannak kivételek a "Sync" használatakor, de ezt majd később. Nézzük meg, hogy mire szolgál a "Sync Rate" parancs.

 

Sync On

Sync Rate 30

Make Object Sphere 1,100Do

Sync

Loop

 

A "Sync Rate" lehetővé teszi, hogy meghatározzuk, milyen gyakran frissüljön a képernyőnk (screen refresh rate). A képernyőfrissítési gyakoriságot legjobban ahhoz hasonlíthatnánk, hogy másodpercenként hányszor zárják és nyitják a színházi függönyt. Az ok, amiért érdemes használni ezt a parancsot elég kézenfekvő. Ha a saját gépeden a frissítési gyakoriság (refresh rate) 40 kép másodpercenként, és te odaadod a haverodnak a programot, akinek persze sokkal jobb gépe van mint neked, hogy ugyan próbálja már ki, akkor az is megtörténhet, hogy nála már 120 kép/ másodperc gyorsan fog futni, ami túlságosan gyors lesz. Hogy kiküszöböld ezt a hibát, adj meg egy állandó frissítési gyakoriságot, ami a jelen példában 30 kép/másodperc, így biztos lehetsz abban, hogy bármilyen gépen futtatod, mindenütt ugyanolyan sebességű lesz. Van egy határ ami felett már az emberi szem nem képes felfogni, hogy a frissítés milyen gyakran megy végbe és ha ezen határ feletti éréket adsz meg, akkor az csak pocséklás. Ha viszont túl alacsony értéket adsz meg, akkor a 3Ds objektum mozgása nagyon bizonytalanná és lassúvá válik. Ez alól kivétel, a "0" érték. Ha ezt adod meg, akkor a DarkBASIC automatikusan frissíti a képernyőt olyan gyakorisággal, amit még a számítógéped lehetővé tesz. Ezzel befejeztük a "sync" parancs boncolgatását. Mostanra remélem megértetted valamilyen szinten a használatát és képes vagy beágyazni a saját programodba. Most megismerkedünk néhány alapvető DarkBASIC objektummal. Próbáld meg beleírni az eddigi programba az alábbi sorokat egyesével, változtasd meg és figyeld, mi történik. Változtasd meg a méretet, szélességet, magasságot és mélységet nézd, hogyan változik az objektum. Adj ugyanakkora értéket az "xyz"-nek a "Make Object Triangle" parancsnál figyeld meg milyen fajta háromszög keletkezett.

 

MAKE OBJECT CUBE Objektum azonosító szám, méret

MAKE OBJECT BOX Objektum azonosító szám, szélesség, magasság, mélység

MAKE OBJECT CYLINDER Objektum azonosító szám, méret

MAKE OBJECT CONE Objektum azonosító szám, méret

MAKE OBJECT PLAIN Objektum azonosító szám, szélesség, magasság

MAKE OBJECT TRIANGLE Objektum azonosító szám, X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3

 

 

Köszönöm a kedves olvasók figyelmét. E cikkembe ennyi fért bele, várhatóan lesz folytatás is.

 

Zsemlye Viktor - djzsemo@tvnetwork.hu