CoolBasic -opas

CoolBasic -opas

Viesti Regalis 31 Heinä 2007 14:57



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:

Kuva

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:

Kuva

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ä.
[piilotettu kuva]
Käyttäjän avatar
Regalis
 
Viestit: 1276

Viesti Kovis## 31 Heinä 2007 15:55

Hyvä, mutta omasta mielestäni hieman turha opas. CoolBasicin mukana tulee kuitenki sen verran kattava manuaali, että kyllä sitä lukemalla oppii kielen melko helposti. Toki tämä on ihan hyvä lisä :wink: .

Toinen suuri ongelma on Windows Vista. Se tukee vain DirectX9 ja 10 -rajapintaisia pelejä, ja CB on rakennettu DirectX 7:n päälle.


Eikös CB:n foorumilla ollut joskus juttua, että hyvin CoolBasic pelittää Vistassakin?
Kovis##
 
Viestit: 170

Viesti Regalis 31 Heinä 2007 16:10

Kovis## kirjoitti:Hyvä, mutta omasta mielestäni hieman turha opas. CoolBasicin mukana tulee kuitenki sen verran kattava manuaali, että kyllä sitä lukemalla oppii kielen melko helposti.

Jep, suurimman osan oppaassa olevista asioista oppii kyllä CB:n manuaalistakin. Tässä on kuitenkin jonkin verran sellaista, mikä puuttuu tai on tehty huonosti manuaalissa ja mielestäni on parempi että selitän kaiken alusta asti.

Kovis## kirjoitti:Eikös CB:n foorumilla ollut joskus juttua, että hyvin CoolBasic pelittää Vistassakin?

En tiedä, mutta ainakaan Zeron mukaan se ei toimi.
[piilotettu kuva]
Käyttäjän avatar
Regalis
 
Viestit: 1276

Viesti praKKA 16 Elo 2007 18:52

Voi että, kun kerrankin sitten tulee jotain hyvvöö ilmaista tavaraa, niin WoW tulee ja nielaisee. Toivotaan että Zero kuitenkin muistaa maksaa sivutilansa ja tajuaisi heittää Wowinsa roskikseen, itse en ole mitään ihmeellistä WoWissa havainnut.

Itse olen joskus jotain tehnyt mutta en pahemmin ole osannut... :/
Intel C2D E4400@vakio | 1Gb DDR2 800MHz (sitten joskus 2Gb) | 250Gb WD Caviar SE SATA | Club 3D GF 8600GT | Antec Sonata III | Asus P5B
Ajaahan ihmiset ylinopeutta, virittää mopoja ja ovat amiksia. - X-racer
Rapakuntoinen nörtti haastaa kaikki punnertamaan, pystyttekö?
Keksit loppu.
Käyttäjän avatar
praKKA
 
Viestit: 4862

Viesti KilledWhale 16 Elo 2007 19:30

Regalis kirjoitti:
Kovis## kirjoitti:Eikös CB:n foorumilla ollut joskus juttua, että hyvin CoolBasic pelittää Vistassakin?

En tiedä, mutta ainakaan Zeron mukaan se ei toimi.


Kyllä cb.n foorumilla jotkut vistan käyttäjät ovat vahvistaneet, että cb ja sillä tehdyt pelit pyörivät vistassa kunhan ne ajetaan järjetelmävalvojan oikeuksilla.
KilledWhale
 
Viestit: 4

Re: CoolBasic -opas

Viesti Regalis 26 Elo 2007 13:14

ZOMG!!111½
Zero palasi CB:n foorumeille, ja kuullemma jatkaa kehitystä!
[piilotettu kuva]
Käyttäjän avatar
Regalis
 
Viestit: 1276

Palaa alueelle Ohjelmointioppaat