Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Järkevä toteutus

Sivun loppuun

Turambar [27.06.2004 19:38:38]

#

Elikä minulla on pieni seikkailupeliprojekti käynnissä, grafiikka on tileinä, yksi ruutu 15*25 tileä. Jokaisella eri ruudulla on oma karttatiedostonsa ja oma ns. id-numero. Nyt peli on siinä vaiheessa, että juonta ja karttoja voisi ruveta kehittämään, minulle tuli kuitenkin ongelma erilaisten tapahtumien kanssa. Jos puhun tietyssä ruudussa esim. jonkin hahmon kanssa, id:n ja koordinaattien avulla oman hahmon sijainnin tarkistaminen on helppoa, mutta varsinainen ongelma onkin siinä, että miten nämä tapahtumat kannattaisi koodata.

Tämä ei liene järkevää:

if id=3 and x=10 and y=3 then msgbox "Terve!"
if id=3 and x=2 and y=4 and muuttuja = true then kartta.paintpicture foo, 2, 3 else msgbox "Sinulla ei ole tulitikkuja."
...

Tuolla metodilla ohjelman koko kasvaa nopeasti, se on kökkö toteutustapa ja koodista tulee sekavaa. Joten mitä ehdotatte tuon korvaajaksi?

Heikki [27.06.2004 20:08:17]

#

Itse pistäisin karttatiedostoon ruudun kohdalle jonkun tiedon... esim:

'Pelaaja on ruudussa x,y ja alueen id on muuttujassa id
spesiaali=Ruutu(x,y,id) 'Ruutu-funktio hakee spesiaali-tiedon

if spesiaali = 1 then
  msgbox "Oot kotona"
end if

Eli ruudulle on asetettu erikoisuus, joka sitten koodissa tarkistetaan. Tuon voisi (ja kannattaa) korvata vakioilla ja select case -systeemmillä.

Toivottavasti ymmärsit.

Antti Laaksonen [28.06.2004 01:18:11]

#

Jos tapahtumat ovat luonteeltaan erilaisia, If-lauseita tulee väistämättä jonkun verran. Jos pelistä tulee laaja, voisikin ehkä olla aihetta jonkunlaisen yksinkertaisen pelin oman skriptikielen kehittämiseen. Sitten tapahtumia pystyisi kirjoittamaan lyhyesti tavallisella tekstieditorilla, eikä koodiin tarvitsisi tehdä muutoksia. Joka tapauksessa ainakin koordinaatit ja muut muuttuvat tiedot kannattaa tallentaa erilleen. Erilaiset pidemmät tapahtumat kannattaa lisäksi sijoittaa omiin aliohjelmiin ja tehdä aliohjelmista yleiskäyttöisiä.

PS. Jos haluat saada helposti lisää nopeutta grafiikkaan, käytä PaintPicturen sijasta WinAPIn BitBlt-funktiota, joka toimii lähes samalla tavalla.

JoreSoft [28.06.2004 11:47:30]

#

Jos et halua muuttaa nykyistä systeemiä, joit käyttää tätä tyyliä, (Ehkä jopa lisää sisäkkäisiä Select-valintoja)

Select Case ID
    Case 1 'Jotain
    Case 2 'jotain
    Case 3
        If X = 10 And Y = 3 Then MsgBox "Terve!"
        If X = 2 And Y = 4 And muuttuja = True Then kartta.PaintPicture foo, 2, 3 Else MsgBox "Sinulla ei ole tulitikkuja."
End Select

hunajavohveli [28.06.2004 12:09:28]

#

En oikein ymmärtänyt, mikä tuo ID-numero on. Kertooko se siis, onko ruudussa esim. ruohoa, metsää, vettä, kalliota tms.? Vai onko se numero, jolla voi viitata haluamaansa ruutuun? Itse ainakin tässä tapauksessa käyttäisin kahta ID-numeroa, joista toinen viittaa sijaintiin x-akselilla ja toinen y-akselilla. Tällöin olisi helppo tehdä taulukko:

Dim Ruutu(1 To 15, 1 To 25)

Jonka jokaiseen alkioon olisi siis tallennettu, mitä kyseisessä ruudussa on. Liikkuvat kappaleet, kuten ihmiset ja monsterit on syytä tallentaa omiin taulukoihinsa, joista ne piirretään varsinaisen kartan päälle.

Turambar [28.06.2004 14:03:49]

#

Lisää selvennystä:

Minulla on olemassa ruutu-taulukko, se on kaksiulotteinen: ruutu(14, 24). Id-numeron tarkoitus on viitata ruutuun, jossa pelihahmo juuri tällä hetkellä kulkee.

Joresoftille vielä, että minulla on juuri tuollainen select case -hommeli tällä hetkellä, laitoin nuo if-lauseet vain esimerkiksi. Myös koordinaatit tarkastava suht kätevä funktio on olemassa.

Oma skriptikieli on käynyt mielessä, mutta järkevä toteutus tiedostossa sijaitsevalle if-lauseelle ja muuttujien tallentamiselle on hakusessa.

Voisiko joku antaa esimerkin tästä BitBlt-funktiosta? Sellaisen, että se tekee saman jutun kun tuo paintpicture.

Heikki [28.06.2004 15:11:22]

#

Esimerkki tuosta BitBlt-funktiosta löytyy tästä opassarjasta.

hunajavohveli [29.06.2004 12:55:15]

#

ID-numeroita on tässäkin tapauksessa syytä olla kaksi, joista toinen viittaa vaaka-akseliin ja toinen pysty-akseliin, eli siis vaikka x ja y. Sitten taulukosta voi lukea tietoa helposti:

Ruutu(x, y)

Mutta en vieläkään ymmärtänyt, mitä sinun pitää tarkistaa If/Case -lausekkeilla?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta