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
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
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
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
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
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ä.
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.
Kyllä tätä on odotettukin!
Oletkos itse tehnyt tätä opasta varten tuon pelin?
Hyvä opassarja!
rndprogy: Kyllä vain.
Opas on varsin oiva tosin... Viholliset puuttuvat... Noh ne ei kyllä ole kovin vaikeita lisätä tähän.
On tullut tarpeeseen, tosin ei minulle.
Hyvä opas + hauska tietokonepeli! :)
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 =)
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
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.
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
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.
Slander, voikko antaa ton editorin sorsan, olis hienoo tietää miten semmosen voi tehdä, jos tulevaisuudes teen jonkun tykin pelin vb:llä vaik pikku kakaroille.. :)
Joo... heti ku saan menetetyn koodin tehtyä uudestaan. Kämmäsin koodin aika pahasti hukkaan. Onneksi vielä muistaa minkälainen se oli.
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 :)
näin juuri, mutta koodit meni hukkaan ja kone kenkkuilee
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
Editorin sorsa on nyt jossaki tuolla vb keskustelussa. Ettikää hakusanoilla niin pitäs löytyä.
Hyvä opas! On tullu tarpeeseen!
Mutta miten saisi tuon pallon "kävelemään" hiljasemmin??
Vauhti on aika meinaa kova :D :D
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... :*(
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.
mä ainaki aion tehä pommin tohon
Mahtava opas!
Saankos käyttää pelissäni osaa noista äänistä?
Jos jostain viellä saisi kunnon ohjeet siihen miten peliin tehdään pelin tallennus ja lataus. Osaako kukaan neuvoa?
ei ainakaan minä
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 :(
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
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.
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.