Kirjautuminen

Haku

Tehtävät

Opasarkisto: Peliohjelmointi Visual Basicilla: Osa 3 - Kokonaisuus ja viimeistely

  1. Osa 1 - Suunnittelu
  2. Osa 2 - Grafiikka ja pelitasot
  3. Osa 3 - Kokonaisuus ja viimeistely

Kirjoittaja: Antti Laaksonen (2003).

⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠


Nyt täytyisi saada pallo liikkumaan sokkelossa näppäinohjauksella. Näppäimiä voi lukea helposti formin KeyDown-aliohjelmassa. Kuitenkin on tärkeää muistaa laittaa formin KeyPreview-ominaisuuden arvoksi True. Muuten näppäinpainallukset kulkeutuvat formin sijasta aktiiviselle kontrollille. Useimmille näppäinkoodeille on olemassa helposti muistettava vakio – nuolinäppäinten tapauksessa vbKeyLeft, vbKeyUp, vbKeyRight ja vbKeyDown. Näppäinkoodeja tutkitaan ainoastaan silloin, kun peli on käynnissä.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
   'näppäinpainalluksiin reagoidaan vain silloin kun
   'peli on käynnissä
   If Kaynnissa Then
       'jos käyttäjä painaa...
       Select Case KeyCode
           '...vasemmalle...
           Case vbKeyLeft ' = 37
               '...yritetään liikkua vasemmalle
               Liiku PalloX - 1, PalloY
           '...ylös...
           Case vbKeyUp ' = 38
               '...yritetään liikkua ylös
               Liiku PalloX, PalloY - 1
           '...oikealle...
           Case vbKeyRight ' = 39
               '...yritetään liikkua oikealle
               Liiku PalloX + 1, PalloY
           '...alas...
           Case vbKeyDown ' = 40
               '...yritetään liikkua alas
               Liiku PalloX, PalloY + 1
       End Select
   End If
End Sub

Pallon liikkuminen

Seuraavaksi tulee pelin monimutkaisin aliohjelma, jolla on useita tehtäviä: liikuttaa palloa käyttäjän painamaan suuntaan, jos se on mahdollista, kerätä talteen käytävällä olevat jalokivet ja avaimet, päivittää pelitason grafiikka sekä huolehtia tason vaihtumisesta sekä pelin päättymisestä. Aliohjelmaan tullaan siis joka tapauksessa nuolinäppäimiä painettaessa.

Jos pallon uusi paikka sijoittuu pelitason ulkopuolelle, se ei tietenkään ole mahdollinen. Seinien läpi ei myöskään ole menemistä. Ovi ja lukko eivät ole näin yksiselitteisiä tapauksia: lukon ohittaminen onnistuu avaimen kanssa, ja ovesta pääsee seuraavalle pelitasolle, jos mukana on kaikki käytäviin kätketyt jalokivet. Jos pallo päätyy avaimen kohdalle, senväristen avainten määrä kasvaa yhdellä. Vastaavasti lukkojen kohdalla avainten määrä vähenee ja lukko katoaa. Jalokivien kohdalla puuttuvien jalokivien määrä vähenee.

Jos liikkuminen on sallittua, taulukkoon merkitään pallon uusi paikka. Vanha paikka ei voi olla mitään muuta kuin tyhjä käytävä, koska pallo ottaa mahdolliset avaimet ja jalokivet. PiirraKuva-aliohjelmalla muutokset on helppoa piirtää pelitasolle. Uudet koordinaatit tallennetaan myös PalloX- ja PalloY-muuttujiin. Jos puuttuvien jalokivien määrä on nolla, siirto-muuttujan arvoksi tulee tosi. Tällöin siirrytään joko seuraavalle tasolle tai lopetetaan peli riippuen siitä, onko pelin hakemistossa lisää tasoja jäljellä.

Sub Liiku(x As Integer, y As Integer)
   'jos siirto-muuttujan arvoksi tulee tosi, on aika
   'siirtyä seuraavalle tasolle
   Dim siirto As Boolean

   'jos uusi paikka ei ole pelitason ulkopuolella, voidaan jatkaa
   If x >= 0 And y >= 0 And x <= 9 And y <= 9 Then
       'jos uusi paikka ei ole seinä, voidaan jatkaa
       If Taso(x, y) <> SEINA Then
           'jos uusi paikka on tason loppu...
           If Taso(x, y) = LOPPU Then
               '...tarkistetaan, onko kaikki jalokivet kerätty...
               If Jalokivet = 0 Then
                   '...jolloin voidaan siirtyä seuraavalle tasolle
                   siirto = True
               Else
                   '...muussa tapauksessa soitetaan esteääni...
                   SoitaAani "este"
                   '...ja poistutaan aliohjelmasta
                   Exit Sub
               End If
           'jos uusi paikka on joku neljästä lukosta...
           ElseIf Taso(x, y) >= LUKKOP And Taso(x, y) <= LUKKOK Then
               '...tarkistetaan onko samanväristä avainta käytössä
               '(avainpalikan tunnus on aina neljä pienempi kuin
               'lukkopalikan)...
               If Avaimet(Taso(x, y) - 4) > 0 Then
                   '...ja vähennetään senväristen avainten määrää yhdellä
                   Avaimet(Taso(x, y) - 4) = Avaimet(Taso(x, y) - 4) - 1
               Else
                   '...muussa tapauksessa soitetaan esteääni...
                   SoitaAani "este"
                   '...ja poistutaan aliohjelmasta
                   Exit Sub
               End If
           'jos taas uusi paikka on joku avaimista...
           ElseIf Taso(x, y) >= AVAINP And Taso(x, y) <= AVAINK Then
               '...soitetaan asiaankuuluva ääni...
               SoitaAani "avain"
               '...ja lisätään senväristen avainten määrää yhdellä
               Avaimet(Taso(x, y)) = Avaimet(Taso(x, y)) + 1
           'ja jos uusi paikka on jalokivi...
           ElseIf Taso(x, y) = JALOKIVI Then
               '...soitetaan jalokiviääni...
               SoitaAani "jalokivi"
               '...vähennetään puuttuvien jalokivien määrää yhdellä...
               Jalokivet = Jalokivet - 1
               '...ja päivitetään ikkunan ylälaidan tiedot
               NaytaTiedot
           End If
           'päivitetään taulukkoon pallon uusi paikka...
           Taso(x, y) = PALLO
           '...ja vanhan paikka muuttuu käytäväksi
           Taso(PalloX, PalloY) = KAYTAVA
           'vastaavasti piirretään pallo uuteen paikkaan...
           PiirraKuva PALLO, 1 + x, 1 + y
           '...ja vanhaan paikkaan käytäväpala
           PiirraKuva KAYTAVA, 1 + PalloX, 1 + PalloY
           'laitetaan pallon uudet koordinaatit talteen
           PalloX = x
           PalloY = y
       End If
   End If

   'jos täytyy siirtyä uudelle tasolle...
   If siirto Then
       '...soitetaan siitä muistuttava ääni
       SoitaAani "loppu"
       'jos hakemistosta löytyy seuraavaa tasoa vastaava tiedosto...
       If TiedostoOlemassa(App.Path & "\" & NTaso + 1 & ".tas") Then
           '...kasvatetaan tasomuuttujaa yhdellä...
           NTaso = NTaso + 1
           '...ladataan taso...
           LataaTaso NTaso
           '...ja näytetään se
           PiirraTaso
       Else
           'muussa tapauksessa näytetään lopetusilmoitus...
           MsgBox "Peli päättyi - selvitit kaikki tasot!"
           '...pysäytetään ajastin...
           jakija.Timer1.Interval = 0
           '...ja pelikään ei enää ole käynnissä
           Kaynnissa = False
       End If
   End If
End Sub

Ääniefektit

Liiku-aliohjelmassa kutsuttiin SoitaAani-aliohjelmaa ääniefekteiden soittamiseen. Visual Basicin mukana tulee monenlaisia helppokäyttöisiä komponentteja, mutta näitä ei kannata tässä tapauksessa käyttää. WinAPI-funktio sndPlaySound nimittäin soittaa WAV-muotoisia äänitiedostoja lähes yhtä helposti. Etuna on se, että pelin koko pysyy pienempänä, kun mukaan ei tarvitse ahtaa suuria DLL- ja OCX-tiedostoja, joissa on mukana vaikka mitä turhia hienouksia.

API-funktion määrittely on seuraavassa. Lisäksi määritellään vakio SND_ASYNC, joka tarkoittaa sitä, että ääni soitetaan ohjelman taustalla eikä ohjelman suoritus pysähdy sen ajaksi.

Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Public Const SND_ASYNC = &H1

SoitaAani-aliohjelma taas on seuraavanlainen. Parametrina annetaan pelin hakemistossa olevan WAV-tiedoston nimi ilman tiedostopäätettä.

Sub SoitaAani(nimi As String)
   'tähän muuttujaan tallennetaan funktion palautusarvo,
   'jolla ei kylläkään tee tässä tapauksessa mitään
   Dim a As Long
   'ensimmäinen parametri on soitettavan tiedoston nimi,
   'toinen on soittotapa (SND_ASYNC tarkoittaa, että
   'ääni soi taustalla keskeyttämättä ohjelmaa)
   a = sndPlaySound(App.Path & "\" & nimi & ".wav", SND_ASYNC)
End Sub

Ajan kulu

Pelaajalla ei ole loputtomasti aikaa käytössä. Formilla oleva ajastin (Timer) vähentää joka sekunti Aika-muuttujaa yhdellä. Samalla päivitetään yläpalkin tiedot. Jos aika loppuu kesken, peli päättyy ennenaikaisesti.

Private Sub Timer1_Timer()
   'vähennetään aikaa yhdellä
   Aika = Aika - 1
   'päivitetään yläpalkin tiedot
   NaytaTiedot
   'jos aika on nolla...
   If Aika = 0 Then
       '...pysäytetään ajastin...
       Timer1.Interval = 0
       '...lopetetaan peli...
       Kaynnissa = False
       '...ja näytetään ilmoitus ajan loppumisesta
       MsgBox "Peli päättyi - aika loppui!"
   End If
End Sub

Valikot

Pelihän alkaa olla melkein valmis! Vielä täytyy määrittää kolmen valikkokohdan tapahtumat. Koodissa ei pitäisi olla mitään kummallista.

'aliohjelma Uusi-valikkokohdan painamiselle
Private Sub mUusi_Click()
   'aloitetaan uusi peli
   UusiPeli
End Sub

'aliohjelma Tekijätiedot-valikkokohdan painamiselle
Private Sub mTekijaT_Click()
   'näytetään pelin nimi ja tekijä viesti-ikkunassa
   'vbCrLf eli Chr(13) + Chr(10) tarkoittaa rivinvaihtoa
   MsgBox "Jalokivijahti" & vbCrLf & "© Antti Laaksonen 2003"
End Sub

'aliohjelma Sulje-valikkokohdan painamiselle
Private Sub mSulje_Click()
   'suljetaan ohjelma
   End
End Sub

Ohjelmointivinkkejä: Virheiden etsiminen

Sellaista ohjelmoijaa ei ole olemassakaan, joka ei tekisi milloinkaan virheitä. Mutta harva tietää, että Visual Basicissa on varsin hyvät välineet virheiden etsimiseen – tai ainakaan käyttää niitä. Riittävällä kärsivällisyydellä monimutkaisessakin algoritmissa oleva ajatusvirhe selviää. Tietysti ohjelmoijalla täytyy olla tarkka käsitys siitä, mitä hän on tekemässä.

Painamalla F9-näppäintä ohjelmariville voi määrittää pysäytyskohdan. Tämä tarkoittaa sitä, että kun ohjelma ennättää kyseiselle riville, sen suoritus pysähtyy ja siirrytään virheenetsintätilaan. Samanlainen tila on silloin, kun ohjelman suoritus katkeaa virheilmoitukseen, ja painetaan Debug-nappia.

Nyt VB-ikkunan alalaidassa pitäisi näkyä tekstilaatikko, jonka otsikkona on Immediate. Tämä on komentorivi, jonka avulla voi tutkia muuttujien arvoja sekä suorittaa mitä tahansa ohjelmalauseita. Esimerkiksi komento "?x" näyttää x-muuttujan arvon ja "x = 5" asettaa muuttujan arvoksi viisi. Ohjelman suoritus jatkuu F5-näppäimellä.

Loppusanat

Onneksi olkoon, olet saanut valmiiksi kunnollisen pelin Visual Basicilla! Jos Jalokivijahdin kanssa puuhastelu vielä jaksaa kiinnostaa, niin tässä on muutama kehitysidea. Kaksi viimeistä ovat melko vaikeita.

Voit lähettää oppaasta palautetta ja kysymyksiä sähköpostilla tai allaolevalla lomakkeella.


Kommentit

kenkku [22.12.2003 18:47:33]

#

Kyllä tätä on odotettukin!

rndprogy [22.12.2003 20:41:20]

#

Oletkos itse tehnyt tätä opasta varten tuon pelin?

Heikki [22.12.2003 22:06:59]

#

Hyvä opassarja!

Antti Laaksonen [23.12.2003 15:50:14]

#

rndprogy: Kyllä vain.

kaviaari [23.12.2003 16:50:12]

#

Opas on varsin oiva tosin... Viholliset puuttuvat... Noh ne ei kyllä ole kovin vaikeita lisätä tähän.

KimmoKM [24.12.2003 09:29:41]

#

On tullut tarpeeseen, tosin ei minulle.

TH [28.12.2003 17:24:20]

#

Hyvä opas + hauska tietokonepeli! :)

nomic [03.01.2004 01:20:34]

#

itse pidin ja muutamia kiintoisia ratkaisujakin löytyi =)
tätähän jaksaa pelata, mikä on hyvä ja mappeja vaan lisää vääntämään =)
ja itse joskus olen tehnyt ali-ohjelman joka tarkisti että pääseekö kentän läpi toimi tavalla:
ennenkuin kenttä näytetään ruudulla kone itse kulkee sen läpi kaikin mahdollisin keinoin ja kun se yrittää uudestaan samaa keinoa kuin ekalla kerralla syntyy ilmoitus että sitä ei pääse läpi ja jos pääsee niin sitten kenttä ilmestyy ruudulle mutta tätä ei kannata laittaa valmiiseen peliin koska se hidastaa peliä paljon =/
ellei sitten väännä omaa editoria ja siihen sitten...
täytyy yrittää soveltaa sitä tähän =)

zigilii [07.01.2004 22:23:12]

#

tää on hyvä peli tätä tosiaankin jaksaa vääntää tunti tolkulla jos vaan joku viittis tehä lisää saman tyyppisiä (tai erityyppisiä) pikku pelejä (tai lisää kenttiä tohon peliin oon tehny yhen mut ei se oo kivaa ku tietää miten sen päässee sen läpi)ja lähettää tänne

SLander [08.01.2004 16:44:04]

#

Teinpä tässä ajankuluksi editorin tuohon peliin. Nyt kenttien vääntäminen helpottuu. Satuin vain vahingossa tuhoamaan lähdekoodin osia, uutta projektia tehdessä. Mutta exe säilyi. Tuossa olis, jos jotaki kiinnostaa.

http://koti.mbnet.fi/slander/lataa/editori.exe

Pistäkää tuo suoraan pelin hakemistoon, niin se toimii oikein.

zigilii [08.01.2004 18:03:06]

#

ihan hyvä mutt tein n.15 aloitus-paikkaa
se poisti niitä naaman kuvia sitä mukaa mitä mää kuljin
jos siihen sais et aloitus-paikkoja (ja loppuja) vois laittaa vaan yhen (jos joku osaa laittaa)
muuten onnistunut editori

SLander [08.01.2004 18:48:05]

#

Ei ole vaikea lisätä tuohon. Muttaku menin turmelemaan koodin, ehkä jos ehdin niin teen korjauksen. Ajattelin, että käyttäjä ei yritä mitään tyhmiä juttuja.

Jan [19.01.2004 13:42:54]

#

Slander, voikko antaa ton editorin sorsan, olis hienoo tietää miten semmosen voi tehdä, jos tulevaisuudes teen jonkun tykin pelin vb:llä vaik pikku kakaroille.. :)

SLander [19.01.2004 15:44:58]

#

Joo... heti ku saan menetetyn koodin tehtyä uudestaan. Kämmäsin koodin aika pahasti hukkaan. Onneksi vielä muistaa minkälainen se oli.

nomic [25.01.2004 17:17:04]

#

juuh siis tuo että aloituspaikkoja kun voi laittaa kuinka monta tahansa tai lopetuksia niin sen voi korjata tällä tavoin:
alussa arvo on = 0
jos arvo = 0 ja laittaa aloituspaikan se päästää koodissa normaalisti eteenpäin

mutta jos arvo on jo 1 ja yrittää laittaa aloituspaikan se ei päästä sinne asti koodia ja näin estimme aloituspaikkojen laiton :)

SLander [27.01.2004 16:46:37]

#

näin juuri, mutta koodit meni hukkaan ja kone kenkkuilee

Mr_woodoo [23.04.2004 10:34:37]

#

Saaks täs jotenkis suurennettuu kentän kokoa? Reunat sain suurennettuu mut mites muun kentän sit sais suurennettuu ku ajattelin käyttää tätä kenttä hommelii yhes toises pelis

SLander [09.05.2004 13:58:39]

#

Editorin sorsa on nyt jossaki tuolla vb keskustelussa. Ettikää hakusanoilla niin pitäs löytyä.

Augustus [24.07.2005 15:52:45]

#

Hyvä opas! On tullu tarpeeseen!
Mutta miten saisi tuon pallon "kävelemään" hiljasemmin??
Vauhti on aika meinaa kova :D :D

eraggo [01.01.2006 15:35:54]

#

huomasin että toi linkki ekalla sivulla ei toimi joten jos ohjelnointiputkan poppoot olisivat ystävällisiä ja laittaisivat sen toimimaan

tarkoitatn linkillä ippi tiedostoa..
*hyvää uutta vuotta*

toivottavasti en vastaa liian myöhään... :*(

SuperNörtti [19.04.2006 17:27:29]

#

Sanoisin vaan että linkki on kopioitu suoraan osoitepalkista, joten se on oikein. Mutta ei toimi. Osoite on silti tuo, sillä se toimii jos seuraat edit3:n ohjeita. Ai niin, muokkausaika kauan sitten ummessa tuolle viestille.

moptim [05.09.2006 20:36:54]

#

mä ainaki aion tehä pommin tohon

tumik [20.01.2007 13:29:11]

#

Mahtava opas!

Saankos käyttää pelissäni osaa noista äänistä?

Herrasir [08.08.2007 14:12:46]

#

Jos jostain viellä saisi kunnon ohjeet siihen miten peliin tehdään pelin tallennus ja lataus. Osaako kukaan neuvoa?

black cat [15.12.2009 13:44:57]

#

ei ainakaan minä

black cat [07.01.2010 16:37:29]

#

SLander kirjoitti:

Teinpä tässä ajankuluksi editorin tuohon peliin. Nyt kenttien vääntäminen helpottuu. Satuin vain vahingossa tuhoamaan lähdekoodin osia, uutta projektia tehdessä. Mutta exe säilyi. Tuossa olis, jos jotaki kiinnostaa.

http://koti.mbnet.fi/slander/lataa/editori.exe

Pistäkää tuo suoraan pelin hakemistoon, niin se toimii oikein.

menin tohon sivulle ja siihen tuli joku 404 - Not found :(

black cat [07.01.2010 16:39:25]

#

Herrasir kirjoitti:

Jos jostain viellä saisi kunnon ohjeet siihen miten peliin tehdään pelin tallennus ja lataus. Osaako kukaan neuvoa?

lue Antti laaksosen vb oppaan osa 8

Tomppa32 [17.01.2010 12:52:20]

#

black cat kirjoitti:

SLander kirjoitti:

Teinpä tässä ajankuluksi editorin tuohon peliin. Nyt kenttien vääntäminen helpottuu. Satuin vain vahingossa tuhoamaan lähdekoodin osia, uutta projektia tehdessä. Mutta exe säilyi. Tuossa olis, jos jotaki kiinnostaa.

http://koti.mbnet.fi/slander/lataa/editori.exe

Pistäkää tuo suoraan pelin hakemistoon, niin se toimii oikein.

menin tohon sivulle ja siihen tuli joku 404 - Not found :(

Oma versioni Jakijan tasoeditorista löytyy kotisivuiltani. Kenttien suunnittelu on paljon helpompaa kuin suoraan tekstieditorilla tehtynä.
Ohjelma on tehty Visual Basic .NET 2003 versiolla, mutta koodi on sen verran alkeellista ja sotkuista, etten viitsinyt sitä laittaa näkyviin.

http://koti.mbnet.fi/tompz/index.php?l=ohjelmat/tasoeditori

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta