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