Tässä oppaassa kerron CoolBasic-ohjelmointikielen perusasiat. Keskityn enemmän itse koodaamiseen kuin esimerkiksi ohjelman käyttöön. Oppaasta saa enemmän irti, jos kopioi esimerkkikoodit CoolBasiciin ja kokeilee niitä. CB:n saa ladattua täältä.
1. KOMENNOT
Komennot ovat rakennuspalikoita, joista ohjelma kootaan. CoolBasic värjää oletuksena komennot sinisiksi. Klikkaamalla komentoa pääsee komennon oppaaseen, jos sellainen on. Otetaan ensimmäinen esimerkkiohjelma:
- Koodi: Valitse kaikki
Addtext "Hello World"
DrawScreen
WaitKey
Tämä koodinpätkä tulostaa näytölle tekstin "Hello World". Koodissa on kolme komentoa.
Addtext tulostaa tekstin näytölle.
DrawScreen piirtää näytön. Ilman tätä komentoa näytöllä ei näkyisi mitään. Joka pelissä on oltava DrawScreen.
WaitKey pysäyttää ohjelman siihen asti, että jotain näppäintä painetaan. Ilman tätä, ohjelma sulkeutuisi heti.
Parametrit
Osa komennoista tarvitsee lisätietoa toimiakseen halutulla tavalla. Esimerkiksi komento Text tarvitsee 3 parametria: tekstin x-koordinaatin, tekstin y-koordinaatin ja tietenkin sen, mikä teksti ruudulle tulostetaan. Parametrit erotetaan toisistaan pilkulla. Esimerkiksi:
- Koodi: Valitse kaikki
Text 2, 2, "Tekstiä, tekstiä"
2. MUUTTUJAT JA VAKIOT
Mikä on muuttuja?
Muuttujiin säilötään tietoa. Tällaisia voivat olla esimerkiksi pelihahmon energia, nimi tai panosten määrä. Muuttujan arvo voi muuttua, kuten esimerkiksi pelaajan energia.
- Koodi: Valitse kaikki
numeromuuttuja = 3
Addtext "Muuttuja on: " +numeromuuttuja
DrawScreen
WaitKey
Tässä koodissa säilötään "numeromuuttuja" nimiseen muuttujaan numero 3, ja tulostetaan se näytölle AddText-komennolla.
Erilaiset muuttujat
Muuttujia on eri tyyppisiä. Äskeisessä esimerkissä oli kokonaislukumuuttuja, mutta muuttujaan voi säilöä myös tekstiä tai desimaalilukuja. Merkkijonomuuttujan (=tekstimuuttuja) perään on laitettava dollarimerkki ($) ja desimaalimuuttujan perään risuaita (#). Näin tarvitsee kuitenkin tehdä vain ensimmäisellä kerralla, kuten näet seuraavasta esimerkistä.
- Koodi: Valitse kaikki
numeromuuttuja = 3
desimaalimuuttuja# = 1.456
merkkijonomuuttuja$ = "Hello World!"
Addtext "Numero: " +numeromuuttuja
Addtext "Desimaali: " +desimaalimuuttuja
Addtext "Teksti: " +merkkijonomuuttuja
DrawScreen
WaitKey
Muuttujia on oikeastaan vielä kaksi muuta tyyppiä, byte ja short. Aloittelijat tuskin tarvitsevat niitä, mutta käydään ne kuitenkin läpi.
Byte eli tavu vie muistia vain yhden tavun, mutta siihen ei voi tallentaa suurempia lukuja kuin 255.
Short eli lyhyt kokonaisluku vie 2 tavua, mutta siihen ei voi tallentaa suurempia lukuja kuin 65536.
Vakio
Toisin kuin muuttuja, vakio pysyy aina samana. Toinen ero on se, etteivät vakiot vie yhtään muistia. Jos ohjelmassa tarvittaisiin esimerkiksi piitä, se voitaisiin esitellä vakioksi. Esittely tapahtuu komennolla Const. Esimerkki:
- Koodi: Valitse kaikki
Const PII = 3.1415926534
Addtext "Pii on kymmenen desimaalin tarkkuudella: " +PII
Drawscreen
waitkey
Tässä koodinpätkässä vakion käytön hyöty ei tule kovin vahvasti esille, mutta jos vakiota tarvittaisiin enemmän, olisi paljon kätevämpää kirjoittaa aina PII, eikä tuota pitkää desimaalilukua. Kuten näet, vakioissa ei tarvitse lisätä tyyppitunnistetta tyyliin PII#.
3. SILMUKKA (looppi)
Repeat-silmukka
Ohjelma etenee koodiriviltä yksi koodin loppua kohti. Jossain kohtaa on palattava takaisin ylös - tätä varten on silmukka. Otetaan esimerkki:
- Koodi: Valitse kaikki
Repeat
ClearText
AddText "Aika: " +Timer()
DrawScreen
Until KeyHit(CbKeyReturn)
Repeat -komento aloittaa silmukan. Until kertoo missä vaiheessa silmukka loppuu, eli milloin palataan takaisin Repeatiin. Viimeinen rivi voitaisiin suomentaa "Kunnes NäppäintäPainetaan (CbKeyReturn)". CbKeyReturn on CoolBasicin näppäinkoodi enterille. Toisin sanoen, silmukkaa toistetaan niin kauan, että enter -näppäintä painetaan. Viimeisellä rivillä voisi olla myös Forever, jolloin silmukkaa toistettaisiin loputtomiin.
Katsotaan muita komentoja. Repeatin jälkeen on komento ClearText, mutta ei välitetä siitä vielä. Seuraavaksi on komento AddText, jolle on annettu parametriksi "Aika: " +Timer(). Timer() kertoo ajan tietokoneen käynnistämisestä. Addtext siis tulostaa näytölle tekstin "Aika: " ja ajan tietokoneen käynnistymisestä. Tämän jälkeen näyttö piirretään DrawScreenilla, ja palataan takaisin alkuun.
Nyt tullaan ClearTextiin. Se poistaa aikaisemman AddTextillä lisätyn tekstin näytöltä. Muuten näyttö tulisi heti ohjelman käynnistyttyä täyteen tekstiä, koska uutta tekstiä lisättäisiin, mutta vanhoja ei poistettaisi.
FPS eli Frames Per Second eli ruudunpiirtonopeus tarkoittaa sitä, kuinka monta kertaa silmukka käydään läpi sekunnin aikana. Mitä nopeammin, sitä sulavammin ja nopeammin peli toimii. Useimmissa peleissä ruudunpiirtonopeutta pitää rajoittaa, jotta peli ei toimisi liian nopeasti tehokkailla koneilla. CoolBasicissa on valmiina FrameLimit -komento. Se ei ole kovin hyvä, joten kannattaa kehitellä itse pelinopeuden rajoitussysteemi.
Nyt tajusit toivon mukaan miten Repeat-silmukka toimii. On kuitenkin olemassa vielä kolme muuta silmukkatyyppiä. Tässä tulee seuraava:
For... Next -silmukka
Tämä onkin jo hieman monimutkaisempi. Otetaan heti alkuun esimerkkikoodi:
- Koodi: Valitse kaikki
Repeat
Cleartext
For i = 1 To 10
AddText "Muuttuja: " +i
Next i
DrawScreen
Forever
Aluksi aloitetaan Repeat-silmukka. Sitten tulee uusi juttu: For... Next -silmukka. Sen tarkoitus on tehdä jokin asia monta kertaan yhden silmukan kierroksen aikana. Esimerkiksi liikuttaa joka vihollista saman kierroksen aikana. Tässä koodissa laitetaan joka kierros 10 kertaa teksti "Muuttuja: " ja muuttuja "i". Tämä muuttuja "i" kasvaa yhdellä joka kerta kun For-silmukka käydään läpi, ja kun se saavuttaa loppuarvon (tässä tapauksessa 10), se palaa taas alkuarvoon (tässä tapauksessa 1). Silmukan loppuun laitetaan komento Next, jolle annetaan parametriksi sama muuttuja kuin alussa, eli tässä tapauksessa "i".
For -silmukasta on olemassa myös For... Each muoto, jossa käydään jonkin tyypin kaikki jäsenet läpi. Kerron tästä vähän myöhemmin.
While... Wend
Tämä on hieman harvinaisempi silmukkatyyppi. Siinä silmukkaa käydään läpi niin kauan, että alkuarvo on tosi.
- Koodi: Valitse kaikki
While Not KeyHit(CbKeyReturn)
ClearText
AddText "Lopeta ohjelma painamalla Enter"
DrawScreen
Wend
Tässä koodinpätkässä silmukkaa käydään läpi, jos enteriä EI paineta. Eli silmukasta poistutaan ja ohjelma lopetetaan painamalla enter. While lopetetaan komentoon Wend.
Kaikista silmukoista voidaan poistua komennolla Exit.
4. EHTOLAUSEET
Peliä tehdessä törmää väkisinkin ehtolauseisiin. Kunnon peliä on lähes mahdotonta tehdä käyttämättä niitä. Ne toimivat vähän samalla periaatteella kuin While-silmukka. Otetaan ensin If... Then -lause. Se on kahdesta ehtolausetyypistä selvästi yleisempi.
- Koodi: Valitse kaikki
Repeat
Cleartext
If KeyDown(CbKeyReturn) Then AddText "Enteriä painetaan"
Drawscreen
Forever
Keskimmäisellä rivillä on ehtolause. Siinä tarkistetaan onko enter-näppäin pohjassa, ja jos on, tulostetaan teksti "Enteriä painetaan". Eli If-ehtolause menee tämän kaavan mukaan: If [ehto = totta] Then [tehdään jotakin]. Lause voitaisiin suomentaa Jos ehto_on_totta Silloin tehdään_jotakin. Yleensä pitää kuitenkin tehdä monta asiaa jonkin ehdon ollessa tosi. Esimerkiksi jos räiskintäpelissä ampumisnäppäin on pohjassa, luodaan uusi panos, asetetaan se pelaajan kohdalle, asetetaan se samaan suuntaan aseen kanssa ja soitetaan laukauksen ääni. Silloin tarvitaan EndIf -komentoa:
- Koodi: Valitse kaikki
Repeat
Cleartext
If KeyDown(CbKeyReturn) Then
AddText "Enteriä painetaan"
Clscolor rand(0,255), rand(0,255), rand(0,255)
EndIf
Drawscreen
Forever
Eihän ollut kovin vaikeaa? :) Kaikki toiminnot jotka halutaan suorittaa, laitetaan If...Then -lausekkeen ja EndIf-komennon väliin. ClsColor -komento muuttaa taustaväriä, tässä tapauksessa se muutetaan sattumanvaraisesti joksikin Rand-komennolla. Eli saadaan aikaan kiva epilepsianaiheuttajaefekti.
Tähän lausekkeeseen voidaan myös lisätä Else:
- Koodi: Valitse kaikki
Repeat
Cleartext
If KeyDown(CbKeyReturn) Then
AddText "Enteriä painetaan"
Else
AddText "Enteriä ei paineta"
EndIf
Drawscreen
Forever
Elsen jälkeen tulevat komennot suoritetaan, jos ehto ei ole tosi. On myös komento ElseIf, joka on muuten samanlainen kuin else, paitsi että siinä saa antaa vielä lisää ehtoja. If - rivillä olevia komentoja voi myös yhdistellä, siitä lisää kohdassa loogiset operaattorit. Mutta nyt seuraavaan ehtolausetyyppiin, Select... Caseen.
Select... Case
Tämä ehtolause on periaatteessa samanlainen kuin sarja ElseIf -komentoja, joskin hieman nopeampi ja selkeämpi (ja vaatii vähemmän kirjoittamista).
Otetaan heti alkuun esimerkki:
- Koodi: Valitse kaikki
Repeat
ClearText
If KeyHit(cbkeyup) And ase<3 Then ase +1
If KeyHit(cbkeydown) And ase>1 Then ase -1
AddText "Ase: " +ase
addtext "Vaihda asetta nuolilla, ammu enteristä"
If KeyDown(cbkeyreturn) Then
Select ase
Case 1
AddText "BOOM! Headshot!"
Case 2
AddText "RATATATATA!"
Case 3
AddText "Pam! Pam! Pam!"
End Select
EndIf
DrawScreen
Forever
Tästä saisi toimivan aseiden vaihdon räiskintäpeliin. Aluksi tarkistetaan painetaanko nuolta ylös ja onko ase-muuttuja pienempi kuin kolme, jos näin on, ase-muuttujaan lisätään 1. Seuraavaksi tarkistetaan painetaanko nuolta alas ja onko ase-muuttuja suurempi kuin yksi, jos näin on, ase-muuttujasta vähennetään 1. Sen jälkeen tulostetaan teksti, jossa lukee mikä ase on käytössä, sekä ohjeet.
Sitten tulee uusi asia. Jos näppäin enter on pohjassa, mennään select-ehtolauseeseen. Tässä tapauksessa tarkastellaan mikä ase-muuttujan arvo on, ja lisätään sen mukaan teksti. Case-vaihtoehtojen määrän saa päättää itse, tosin niitä on pakko olla vähintään yksi. Myös Select-rakenteessa on Elsea vastaava komento, nimittäin Default. Tässä koko Select-Casen kaava:
- Koodi: Valitse kaikki
Select [muuttuja jonka arvoa tarkastellaan]
Case 1
[Mitä tehdään jos muuttuja on 1]
Case 2
[Mitä tehdään jos muuttuja on 2]
Default
[Mitä tehdään jos muuttuja ei ole mikään aikaisemmista]
End Select
Loogiset operaattorit
Loogisia operaattoreita käytetään yhdistelemään ehtoja ehtolauseissa.
AND eli ja. Suoritetaan jos molemmat ehdot ovat totta.
- Koodi: Valitse kaikki
If ehto1 And ehto2 Then
OR eli tai. Suoritetaan jos molemmat tai toinen ehdoista on totta.
- Koodi: Valitse kaikki
If ehto1 Or ehto2 Then
NOT eli ei. Normaalisti ehtolauseessa tarkistetaan onko ehto tosi, tässä tarkistetaan onko se epätosi.
- Koodi: Valitse kaikki
If Not ehto1 Then
XOR eli joko-tai. Sama kuin OR, mutta vain toinen ehto saa olla totta.
- Koodi: Valitse kaikki
If ehto1 Xor ehto2 Then
No niin. Nyt CoolBasicin perusasiat on käyty läpi, ja voidaan siirtyä varsinaiseen peliohjelmointiin...
5. OBJEKTIT
Aluksi on vain tyhjä pelimaailma. Sinne pitäisi saada jotain täytettä, joten otetaan objektit käyttöön. Objektit ovat pelimaailmassa olevia kappaleita, esimerkiksi pelihahmo, viholliset, luodit, esineet ja healthpackit. CoolBasicissa on paljon helppokäyttöisiä komentoja objektien hallitsemiseen, esimerkiksi automaattinen törmäyksentunnistus, joten ne ovat paras vaihtoehto aloittelijoille.
- Koodi: Valitse kaikki
FrameLimit 40
ukko = LoadObject("Media\guy.bmp", 72)
ClsColor cbWhite
Repeat
If LeftKey() Then TurnObject ukko, 5
If RightKey() Then TurnObject ukko, -5
If UpKey() Then MoveObject ukko, 2
If DownKey() Then MoveObject ukko, -2
DrawScreen
Forever
Aluksi rajoitetaan pelin FPS neljäänkymmeneen. Sen jälkeen ladataan objekti, jonka nimeksi asetetaan ukko. Numero 72 kertoo kuinka moneen suuntaan objektin kuva voi osoittaa. Vaikka tähän kohtaan ei laittaisi mitään, objektia voi silti pyörittää, mutta sen kuva ei pyöri mukana. Isommilla pyörityslaaduilla lataaminen kestää kauemmin, joten ei kannata laittaa isoa pyörityslaatua varsinkaan isoille kuville.
Tämän jälkeen laitetaan ruudun taustaväriksi valkoinen, ja aloitetaan silmukka. Huomaa että objektin lataus on silmukan ulkopuolella, muuten ohjelma lataisi joka silmukan kierroksella objektin uudestaa, jolloin ohjelma toimisi hyvin hitaasti.
Seuraavaksi tarkistetaan ehtolauseella painetaanko nuolia, ja liikutetaan ja pyöritetään objektia sen mukaan. Sitten piirretään ruutu ja palataan taas silmukan alkuun. Ei varmaan ollut kovin monimutkaista? Otetaan seuraavaksi kartta mukaan.
- Koodi: Valitse kaikki
FrameLimit 40
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
ukko = LoadObject ("Media\guy.bmp", 72)
SetupCollision ukko, kartta, 1, 4, 2
Repeat
If LeftKey() Then TurnObject ukko,5
If RightKey() Then TurnObject ukko,-5
If UpKey() Then MoveObject ukko,2
If DownKey() Then MoveObject ukko,-2
UpdateGame
CloneCameraPosition ukko
DrawScreen
Forever
Tässä koodissa on neljä uutta asiaa. Ensimmäinen on kartan lataus. Helpoin tapa tehdä karttoja CoolBasic-peleihin on tilekartat. Niiden tekemiseen on erillisiä ohjelmia, mm. A Stigmator, Tilester (joka tulee CB:n mukana), Tilegen ja Ristister. Karttojen tekemiseen tarvitaan tileset, eli kuva joka on täynnä pieniä neliöitä, joista pelimaailma kootaan. Yksinkertaisessa tilesetissä voisi olla vaikka ruoho-tile ja seinä-tile, joista koottaisiin kartta. No, mennään takaisin asiaan:
LoadMap tarvitsee kaksi parametria: karttatiedoston ja tilesetin. Tässä esimerkissä käytetään CoolBasicin valmista karttatiedostoa. Kartta ladataan ennen ukko-objektia, koska muuten pelihahmo olisi sen alla.
Seuraava uusi asia on SetupCollision. Tämä on se automaattinen törmäyksentunnistus, jonka mainitsin aikaisemmin. Eli tässä asetetaan törmäys ukon ja kartan välille, jolloin pelihahmo ei pääse seinien sisään. Törmäys on laatikko -> kartta -tyyppiä, joten parametreiksi laitetaan 1,4,2. Tästä taulukosta näkee erilaiset törmäystyypit:

Koodin loppupuolella on komento CloneCameraPosition. Se asettaa kameran seuraamaan ukkoa. UpdateGame ennen sitä estää kameran nykimisen johonkin törmättäessä.
6. KUVAT
Vaihtoehto objekteille on kuvat. Niiden käyttö on paljon hankalampaa kuin objektien, mutta suurin osa kuvakomennoista on objektien komentoja nopeampia. Esimerkiksi LieroX- tai Worms-tyylisen pelin, jossa maasto tuhoutuu, tekeminen on aivan liian hidasta kartta-objektilla, joten siinä on pakko käyttää kuvia.
Vaikka ei käyttäisikään kuvia objektien tilalla, jokainen pelintekijä tulee tarvitsemaan niitä joskus, esimerkiksi valikoissa, energiapalkissa tai vastaavassa.
- Koodi: Valitse kaikki
FrameLimit 40
SCREEN 640,480
kartankuva = LoadImage ("Media\map.bmp")
Repeat
DrawImage kartankuva,40,20
DrawScreen
Forever
Heti alussa tulee uusi komento: SCREEN. Sen avulla voidaan muuttaa peliruudun kokoa, värisyvyyttä ja tilaa (koko näyttö vai ikkuna). Sitä täytyy käyttää ennen kuin mitään kuvia, objekteja tai ääniä ladataan, koska se tuhoaa kaiken muistiin ladatun.
Sitten ladataan kuva. Kuvat ladataan muuten samalla tavalla kuin objektit, paitsi että komento on LoadImage, eikä pyörityslaatua tarvita.
Toisin kuin objektit, kuvat täytyy piirtää joka silmukan kierroksella, muuten ne katoavat. Tämän takia Drawimage on silmukassa. Se tarvitsee parametreiksi kuvamuuttujan nimen, ja koordinaatit joihin se piirretään. Huomaa, että koordinaatit menevät eri tavalla kuvia piirtäessä, kuin objekteja asettaessa. Kuvat piirretään ruudun koordinaattien mukaan, eli 0-piste on ruudun vasemmassa yläreunassa. Objektit asetetaan maailmankoordinaattien mukaan, eli 0-piste on pelimaailman keskellä. Tämä kuva havainnollistaa:

7. FUNKTIOT
Funktio on lähes sama asia kuin komento, mutta se palauttaa arvon. Otetaan esimerkiksi funktio ObjectSight, joka kertoo näkevätkö kaksi objektia toisensa (onko välissä seinää vai tyhjää). Se palauttaa 1 jos objektit näkevät toisensa, 0 jos eivät.
Toisin kuin komennoissa, funktioissa parametrit laitetaan sulkujen sisään. Jos parametreja ei tarvita, funktion perään laitetaan vain (). Esimerkiksi komennoissa FPS() ja TIMER().
Omat funktiot
Funktioita voi tehdä myös itse, CB:n valmiiden funktioiden tilalle. Otetaan esimerkiksi yksinkertainen funktio, joka kertoo halutun luvun kahdella:
- Koodi: Valitse kaikki
Text 0, 0, KerroKahdella(5)
DrawScreen
WaitKey
End
Function KerroKahdella(jokin_luku)
laskun_tulos = jokin_luku * 2
Return laskun_tulos
End Function
Tämä funktio tarvitsee parametriksi kerrottavan luvun, joka tässä tapauksessa on 5. Se kertoo tämän luvun kahdella, ja palauttaa sen.
Globaalit ja lokaalit
Oletetaan että haluaisit tehdä funktion, joka tarkistaa pelaajan energian ja piirtää sen mukaan pelihahmon kuvan ruudulle. Vähemmän energiaa -> verisempi pelihahmo. Et voi kuitenkaan laittaa funktioon vain tarkistusta pelaajan enegiasta, tyyliin: "If pelaajan_enkat > 0 Then jotakin."
Miksi?
Funktioissa on eri muuttujat kuin muussa ohjelmassa. Eli vaikka pääsilmukassa pelaajan_energia -muuttuja olisi esimerkiksi 20, funktiossa se on 0. Tällaisia normaaleita muuttujia kutsutaan lokaaleiksi (local), koska ne säilyttävät arvonsa vain tietyssä paikassa. Tämän ratkaisemiseen on kaksi tapaa.
1. Määritellään muuttuja globaaliksi, jolloin se on sama joka puolella ohjelmaa. Tämä tehdään yksinkertaisesti kirjoittamalla ohjelman alkuun (silmukan ulkopuolelle) Global ja muuttujan nimi. Tässä pelaajan energia - esimerkissä se olisi "Global pelaajan_energia"
2. Välitetään muuttujan arvo funktiolle parametrilla. Tässä tapauksessa se menisi näin:
- Koodi: Valitse kaikki
PiirräPelaajanNaama(pelaajan_energia)
Function PiirräPelaajanNaama(energia)
If energia > 0 Then tehdään jotain...
End Function
8. TYYPIT
Oletetaan että haluat peliisi vaikka 100 vihollista. Olisi todella vaivalloista alkaa kirjoittamaan:
- Koodi: Valitse kaikki
vihollinen1 = LoadObject ("media\guy.bmp", 72)
vihollinen2 = LoadObject ("media\guy.bmp", 72)
vihollinen3 = LoadObject ("media\guy.bmp", 72)
vihollinen4 = LoadObject ("media\guy.bmp", 72)
jne...
Sen sijaan tämä voidaan toteuttaa tyypeillä. Esitellään ohjelman alussa viholliset-tyyppi:
- Koodi: Valitse kaikki
Type VIHOLLISET
Field objekti
End Type
vihuIMG = LoadObject ("media\guy.bmp", 72)
For i = 1 to 100
vihu.VIHOLLISET = New (VIHOLLISET)
vihu\objekti = CloneObject (vihuIMG)
RotateObject vihu\objekti, Rand(1,360)
Next i
Jokaiseen tyyppin jäseneen voidaan tallentaa monia eri asioita. Nämä tallennettavat asiat merkataan Field-kohtaan. Kerron siitä lisää myöhemmin.
Seuraavaksi ladataan vihollisten kuva nimellä vihuIMG. Sitten saavutaan For-silmukkaan. Se käydään läpi 100 kertaa, ja joka kerta luodaan uusi vihollinen. Vihu\objekti -kenttään sisällytetään vihu-objekti, ja tämä objekti käännetään sattumanvaraisesti kulmaan väliltä 1-360. Noin, nyt olemme luoneet VIHOLLISET-tyyppiin 100 jäsentä nimeltä vihu. Mitäs sitten?
For...Each
Tämä on se silmukkatyyppi, jota en käynyt läpi aikaisemmin. Se on tarkoitettu kaikkien tyypin jäsenten läpikäymiseen. Katsotaan esimerkki:
- Koodi: Valitse kaikki
For vihu.VIHOLLISET = Each VIHOLLISET
MoveObject vihu\objekti, 2
Next vihu
Tässä käydään läpi kaikki VIHOLLISET -tyypin jäsenet, ja liikutetaan vihu\objekti -objekteja 2 pikseliä eteenpäin. Laita tämä koodi silmukan sisään, lisää se edelliseen esimerkkikoodiin, suorita CoolBasicissa ja katso mitä tapahtuu...
Kaikki liikkuvat! Näin lyhyellä koodinpätkällä saatiin luotua 100 vihollista ja liikutettua niitä kaikkia. Mennään seuraavaan asiaan...
Field
Mitäs jos tyyppiin pitää tallentaa jotain muutakin kuin pelkkä vihollisobjekti? Esimerkiksi energiat tai panosten määrä? Silloin laitetaan lisää Fieldejä.
- Koodi: Valitse kaikki
Type VIHOLLISET
Field objekti
Field energia
Field nimi$
Field panokset
end type
vihu.VIHOLLISET = New (VIHOLLISET)
vihu\objekti = CloneObject (vihuIMG)
vihu\energia = 300
vihu\nimi$ = "Teuvo"
vihu\panokset = 2000
vihu.VIHOLLISET = New (VIHOLLISET)
vihu\objekti = CloneObject (vihuIMG)
vihu\energia = 150
vihu\nimi$ = "Kalevi"
vihu\panokset = 200
vihu.VIHOLLISET = New (VIHOLLISET)
vihu\objekti = CloneObject (vihuIMG)
vihu\energia = 100
vihu\nimi$ = "Urho"
vihu\panokset = 20
Tässä koodinpätkässä luodaan kolme vihollista, joille kaikille asetetaan erilaiset tiedot. Nimi$ -fiedin perässä on dollarimerkki, eli se on merkkijonomuuttuja. Siihen tallennetaan tekstiä, tässä tapauksessa vihollisten kauniit nimet. Toinen tapa esitellä nimi merkkijonomuuttujaksi on kirjoittaa "Field nimi As String".
9. TAULUKOT
Kuten tyyppejä, taulukoita käytetään myöskin säilömään paljon tietoa pieneen tilaan. Mielestäni taulukot ovat ainakin aluksi hankalampia käyttää kuin tyypit, mutta niissä pääsee helpommin käsiksi yksittäiseen taulukon jäseneen. Tyypeissä täytyy käydä kaikki tyypin jäsenet läpi, taulukoissa ei. Joissakin asioissa taulukot ovat kuitenkin helppokäyttöisimpiä kuin tyypit. Otetaan tyyppi-esimerkin ensimmäinen koodi taulukkona:
- Koodi: Valitse kaikki
Dim VIHOLLISET(99)
vihuIMG = LoadObject ("media\guy.bmp", 72)
For i = 0 to 99
VIHOLLISET(i) = CloneObject (vihuIMG)
Next i
Alussa luodaan taulukko nimeltä VIHOLLISET. Siihen luodaan solut sadalle viholliselle (lasku alkaa nollasta). Vihollisen kuvan lataamisen jälkeen käydään for-silmukka läpi 100 kertaa, ja säilötään jokaiseen taulukon soluun vihollisobjekti.
Aina kun taulukon jäsenille tehdään jotain, pitää varoa ettei lue taulukon ulkopuolelta. Tämä tarkoittaa sitä, että jos taulukkoon on varattu solut vaikka numeroon 9 asti, luettaisiin taulukon kohdasta 10. Silloin ohjelma kaatuu.
10. MEMORY ACCES VIOLATION
Varmaankin CB:n yleisin virheilmoitus, ja sen syy on yleensä kaikkein vaikein selvittää. Memory Access violation eli MAV tulee, kun jotain mediaa ei voida käyttää. Yksi yleinen voi olla kirjoitusvirhe jossain, esimerkiksi jos pelihahmo olisi ladattu nimellä ukko, ja sitä yritettäisiin liikuttaa komennolla MoveObject uko, 2, 0. Toinen syy on se, että objekti poistetaan, ja sitä yritetään sen jälkeen liikuttaa, kääntää tai muuta vastaavaa. Tämä tapahtuu usein, jos hahmo poistetaan sen kuollessa. Jos MAV johtuu siitä, sen voi estää näin:
- Koodi: Valitse kaikki
If ukko_elossa = True Then
'ukon ohjaussysteemin
Endif
If ukon_energia < 1 Then
Deleteobject ukko
ukko_elossa = false
EndIf
Näin ukon ohjaukseen mennään vain jos ukko_elossa -muuttujan arvo on True.
11. OPTIMOINTI
CoolBasicissa on paljon huonoja puolia, yksi suurimpia on sen hitaus. Tässä muutamia optimointikikkoja joilla saa peliä nopeammaksi:
- Jos joudut lataamaan samaa kuvaa monta kertaa, käytä CloneObjectia
- Älä käytä liian isoja pyörityslaatuja. Jos kuvaa ei pyöritetä, älä laita pyörityslaatuun mitään.
- CB:n valmista FrameLimittia ei kannata käyttää! Bagardin framelimit on paljon parempi.
- Säilö paljon tarvitut tiedot muuttujiin. Jos koodissa tarkastetaan vaikka pelihahmon koordinaatit monta kertaa silmukan aikana, ne kannattaa tallentaa muuttujiin ja käyttää tätä muuttujaa joka kerta kun koordinaatteja tarvitaan.
- Älä laita luodeille törmäystä kartan kanssa, vaan tarkista GetMapilla onko luodin alla seinää.
- Jos pelissäsi on paljon vihollisia, päivitä niiden tekemiset vain jos ne ovat tietyn etäisyyden päässä pelaajasta.
- Älä lataa ikinä kuvia silmukassa!
Hyvä tapa saada peli toimimaan hyvin pienelläkin FPS:llä, on laittaa pelinopeus vakioksi. Eli hahmoa liikutetaan sen mukaan, mikä FPS on. Jos FPS on pienempi liikutetaan enemmän jne... Marcoderin pelinopeus vakioksi -systeemi
12. COOLBASIC 3D JA COOLBASIC ADVANCED
CoolBasicin tekijä Jukka Lavonen (Zero) on ilmoittanut tekevänsä 3d-version CoolBasicista, joka tulisi maksamaan noin 20 €. Lisäksi CB:lle on (tai oli) tekeillä jatko-osa CoolBasic Advanced. Siitä piti tulla noin 10 kertaa nopeampi, oliopohjainen, ja siihen olisi tullut paljon uusia komentoja, mm. automaattinen reitinhaku.
Nyt näyttää kuitenkin pahasti siltä, ettei näitä ole tulossa, koska Zero ei ole käynyt CB:n sivuilla melkein vuoteen. Hänen viimeisiä viestejään CB:n foorumeilla oli ilmoitus, jossa hän kertoi World of Warcraftin lähes pysäyttäneen CB:n kehittämisen.
Toinen suuri ongelma on Windows Vista. Se tukee vain DirectX9 ja 10 -rajapintaisia pelejä, ja CB on rakennettu DirectX 7:n päälle.
Todennäköisesti CB:n foorumi kaatuu pian, jos Zero ei jatka kotisivutilansa maksamista, jolloin kaikki siellä olevat esimerkkikoodit ja muu hyödyllinen katoaa.
LINKIT
CB:n suomenkieliset kotisivut
CB:n foorumi
Paljon hyödyllisiä koodinpätkiä funktioita
CB-pelejä, -artikkeleita, -tiedostoja ja -oppaita
A Stigmator. Mielestäni paras tilekarttaeditori
Tilester
TileGen
Ristister. Ei kovin vakavasti otettava editori :)
LOPPUPUHE
Jos nyt joku päätti alkaa koodaamaan peliä, älä aloita mistään maailman suurimmasta RPG -pelistä, jossa on sata miljoonaa tehtävää, luolaa, NPC:tä ja esinettä. Kannattaa aloittaa kirjoittelemalla pieniä pelintynkiä ja ohjelmia. Toinen hyvä tapa harjoitella, on ottaa valmis koodi ja muokkailla sitä.

