CoolBasicin tyypeillä voit muodostaa kokoelman ammuksia, vihollisia, botteja, mitä vain. Tämä on vieläkin yksinkertaisempi tapa hallita suurta joukkoa erilaisia kohteita kuin taulukointi.
Ohjelman alussa tyyppi pitää määritellä. Se onnistuu TYPE...END TYPE-lohkossa, jonka sisään kirjoitetaan FIELD-sanojen avulla lista muuttujia. Aina kun uusi kokoelman jäsen luodaan, se perii kaikki nämä muuttujat, ja ne ovat käytettävissäsi - jokaiselle objektille on yksilölliset muuttujat, vaikkakin kaikilla jäsenillä on saman nimiset muuttujat.
Kokoelmat muodostavat ns. linkitettyjä listoja, joiden keskeltä, lopusta ja alusta voi poistaa jäseniä ilman, että väliin jää tyhjiä kohtia. Tämä ei onnistu taulukoissa siirtämättä taulukon elementtejä täyttämään tyhjäksi muodostunut paikka. Esimerkiksi:
Alussa on tällainen lista: "1, 2, 3, 4, 5". Kun poistat jäsenen kolme, lista näyttääkin tällaiselta: "1, 2, 4, 5". Tämä on ihanteellinen tapa hallita erilaisia efektejä tai liikkuvia kohteita.
Otetaan esimerkki: Kuvitellaan, että pelissäsi on plasmakivääri, joka ampuu nopeita sarjoja kuumennettua plasmaa. Aina kun painat liipaisinta, luodaan uusi ammus, joka liikkuu eteenpäin, kunnes törmää johonkin. Nyt sinun pitäisi jotenkin hallita kaikkia ammuksia: liikuttaa niitä ja tarkastaa törmäävätkö ne johonkin. Tämän voisi tehdä taulukoilla, mutta se on tyyppeihin verrattuna työlästä.
Oletetaan, että haluat toteuttaa ammukset objekteilla, mikä on yksinkertaisin tapa. Aina kun ammus luodaan, pitää siis luoda uusi ammusobjekti, asettaa sille törmäys, sijoittaa ja kohdistaa se oikein jne. Tällaisen ammusjärjestelmän perusta on tietysti kokoelma (tyyppi). Luodaan sellainen ohjelman alussa:
Type AMMUKSET Field obj End Type |
Nyt meillä on kokoelma, jonka nimi on "AMMUKSET". Siinä on yksi kenttä, nimeltään obj. Aina kun uusi ammus lisätään kokoelmaan, se saa oman obj-muuttujansa, johon talletetaan objektin kopio. Pelin alussa lataat ns. master-objektin (ammus-kuva), ja piilotat sen (ShowObject). Master-object on ladattu muuttujaan "ammus".
Uusi jäsen lisätään kokoelmaan komennolla NEW. Koodina se tapahtuu seuraavasti (tämä siis aina kun uusi ammus luodaan):
pati.AMMUKSET = New (AMMUKSET) pati\obj = CloneObject (ammus) 'Asetetaan patin törmäys kenttään SetupCollision pati\obj, kartta, 2, 4, 1 'Aseta pati samaan paikkaan missä pelaaja on CloneObjectPosition pati\obj, pelaaja CloneObjectOrientation pati\obj, pelaaja ResetObjectCollision pati\obj |
Tämä koodi luo uuden jäsenen. Se lisätään aina listan viimeiseksi. Kiinnitä huomiota erityisesti kahteen ensimmäiseen riviin. Lisäksi muuttujan "pati" tyypiksi pitää määritellä kokoelma. Siksi muuttujan perään kirjoitetaan piste ja kokoelman nimi. Tätä ei tarvitse kirjoittaa jatkossa.
Tyyppimuuttujan kenttiin pääsee käsiksi \-merkillä. Käytät muuten muuttujaa normaaliin tapaan.
Oletkin jo tutustunut For...Next-rakenteeseen (jos et ole, tee se nyt ja palaa tänne myöhemmin). Sen avulla voidan helposti käydä läpi kaikki taulukon jäsenet. Samaan tapaan voidaan käydä läpi myös kaikki kokoelman jäsenet. Rakenne muuttuu vain hieman toisennäköiseksi:
For pati.AMMUKSET = Each AMMUKSET MoveObject pati\obj, 1 Next pati |
Oheinen koodi liikuttaa KAIKKIA ammuksia eteenpäin yhdellä. Samalla voit tarkastaa jokaisen ammuksen törmäyksen, ja tarvittaessa tuhoamaan sen (DeleteObject ja sitten Delete pati). Listan voi tuhota näin:
For pati.AMMUKSET = Each AMMUKSET DeleteObject pati\obj Delete pati Next pati |
On erittäin tärkeää, että muistat vapauttaa jäseniin sidotun median. Muuten niihin ei pääse koskaan käsiksi ja se syö tietokoneen muistia, koska niitä ei voi vapauttaa.
Field-sanalla määritellään kokoelman muuttujat. Nämä voivat olla myös desimaali- tai merkkijonotyyppisiä. Esim. Field x# määrittää desimaalikentän. Sitä kutsutaan \x tai \x#.
Kun haluat poistaa jäsenen (törmäyksen sattuessa), komennat vain Delete pati (edellisen esimerkin mukaan). Sitä ennen on hyvä poistaa objekti muistista: DeleteObject pati\obj
Uusi jäsen lisätään aina listan perään. Voit liikkua listan sisällä Before() ja After() -funktioilla. Esim. Pati = Before(Pati). Lisää tietoa kyseisten komentojen oppaasta.
Voit kerralla siirtyä listan alkuun tai loppuun First() ja Last() -funktioilla. Esim. Pati = First(AMMUKSET). Lisää tietoa kyseisten komentojen oppaasta.
Et voi siirtyä listan ulkopuolelle. Muuten ohjelma kaatuu muistivuotoon. Siten, jos osoitin on listan viimeisessä jäsenessä, et voi komentaa Pati=After(Pati), ja käyttää olematonta jäsentä. Voit estää tämän testaamalla, onko lista lopussa: If After(Pati)<>NULL Then ON_OLEMASSA Else EI_OLEMASSA.
Voit siirtää elementtejä paikasta toiseen Insert-komennolla. Uusi (ja siten viimeinen) listan jäsen voidaan siirtää ensimmäiseksi: Insert Pati, First(AMMUKSET) tai vaikkapa Insert Pati, After(First(AMMUKSET)). Tällainen kikkailu on edistyneemmille käyttäjille.
<<TAKAISIN