Eli olen tekemässä freebasicilla omaa merkkipohjaista roolipeliä ja nyt haluaisin tietää, kuinka saisi järkevimmin tehtyä tiedostosta ladattavat kartat ja kuinka saisi muuttujat tallennettua talteen.
Mutta nyt ensisijaisesti jos selittäisitte, miten tiedostoon saa ladattua ja kuinka siihen tallenetaan tietoa. Tarvin ainakin, kuinka tiedostoon tallentaa muuttujia.
esim.
kartta(10, 10) = 2 kartta(11, 11) = 3
ja kuinka saisi ärkevimmin laitettua tiedot niin, että karttaa ladatessa ladattaisiin siellä olevat oliot (vihut sun muut, eli tallentaako eri tiedostoon vai samaan, kuin itse kartta)
Jos kentät on kaikki samankokoisia niin vaikka niin että joku numero tarkoittaa seinää jotkut olioita esim. näin:
Sub LataaKentta(map As String) Open map For Input As #1 For l As Integer = 0 To 5 For k As Integer = 0 To 5 Input #1, kartta(l ,k) Next k Next l Close #1 End Sub
kenttätiedosto:
1 1 1 1 1 1 0 2 0 1 1 3 0 0 1 1 0 3 3 1 1 1 1 1 1
Jos kentät ei oo kaikki samankokoisia niin lsäät tiedoston alkuun kuinka korkea ja leveä se on.
kiitoksia tuosta koodista, joten sitä pitää kokeilla, mutta olisiko mahdollista saada yleisestikkin tiedoston latauksesta ja kirjoittamisesta, jotta oppisin hyödyntämään sitä muissakin asioissa.
Noniin kokeilin tuota ja melkein toimii (ei virheilmoituksia), mutta se ei vain suostu enää ajamaan peliä... Pelin koodi on seuraavanlainen, jos se auttaa löytämään ongelman. karttatiedosto on samanlainen, kuin antamassasi koodissa, paitsi se on kooltaan 80*35 ja siinä on maata ja seinää (testi nääs).
declare function nappaint () as string declare function voiliikkua (y as integer, x as integer, oy as integer, ox as integer) as integer declare sub kartanpiirto declare sub kumitus (y as integer, x as integer) declare sub liike (a as string) declare sub lataakentta (map as string) screenres 640, 400, 32 ' näytön asettelu type olio ' olio ryhmä, sisältää kaikki hirviöt, hahmo(t) jne... tyyppi as integer y as integer x as integer uy as integer ux as integer end type type tyyppi muoto as string * 1 ' merkki vari as integer ' väri end type dim shared kartta(1 to 80,1 to 35) as integer dim shared olio(1 to 10) as olio dim shared oliom as integer dim shared tyyppi(1 to 10) as tyyppi dim i as integer dim a as string dim map as string tyyppi(1).muoto = "O" ' pelaaja tyyppi(1).vari = rgb(255, 255, 000) tyyppi(2).muoto = "O" ' rosvo tyyppi(2).vari = rgb(123, 123, 126) map = "1.txt" lataakentta(map) oliom = 2 olio(1).tyyppi = 1 olio(1).y = 3 olio(1).x = 43 olio(1).uy = olio(1).y olio(1).ux = olio(1).x olio(2).tyyppi = 2 ' 2 on rosvo olio(2).y = 2 olio(2).x = 3 olio(2).uy = olio(2).Y olio(2).ux = olio(2).x kartanpiirto cls do ' pääsilmukka for i = 1 to oliom ' olioiden piirto locate olio(i).y, olio(i).x color tyyppi(olio(i).tyyppi).vari ' värin laitto print tyyppi(olio(i).tyyppi).muoto ' olion väri next i a = nappaint ' näppäinten tunnistus for i = 1 to oliom locate olio(i).y, olio(i).x kumitus(olio(i).y, olio(i).x) next i liike(a) for i = 1 to oliom if voiliikkua(olio(i).uy, olio(i).ux, olio(i).y, olio(i).x) then olio(i).y = olio(i).uy olio(i).x = olio(i).ux end if next i loop ' pääsilmukan lopetus function nappaint () as string ' näppäintunnistus dim a as string do a = inkey loop until a <> "" nappaint = a end function Function voiliikkua (y As Integer, x As Integer, oy as integer, ox as integer) As Integer ' törmäysfunctio dim i as integer voiliikkua = -1 ' Oletuksena voi liikkua, siis -1, ei liikkua on 0 FOR i = 1 TO oliom ' Verrataan jokaisen hirviön koordinaatteja IF y = oy AND x = ox THEN ' Jos ruudussa on hirviö voiliikkua = 0 ' ruutu on varattu EXIT FUNCTION END IF NEXT i If x < 1 Or x > 80 Or y < 1 Or y > 35 Then ' ei voi liikkua seuraavilla alueilla ( reunatunnistus) voiliikkua = 0 Exit Function End If End Function Sub kumitus (y As Integer, x As Integer) ' kumitus aliohjelma Dim piirto As Integer piirto = kartta(y, x) ' piirto on x, y koordinaateissa sijaiteva luku kartta(y, x) = piirto ' x, y koordinaateissa sijaitseva luku on piirto kartanpiirto ' piiretään uudestaan End Sub Sub kartanpiirto ' Kartanpiirto aliohjelma Dim i As Integer ' Muuttujat määritetään Dim i2 As Integer ' Kartan tarkistus For i2 = 1 To 35 ' y For i = 1 To 80 ' x Locate i2, i If kartta(i, i2) = 0 Then Print " "; ' maaksi piiretään . If kartta(i, i2) = 1 Then Print "#"; ' piirtää 1 kohtiin seinää Next i Next i2 End Sub sub liike (a as string) Select Case a ' näppäimet ja niiden toiminnot Case "a" ' Vasemmalle olio(1).uy = olio(1).y olio(1).ux = olio(1).x -1 Case "d" ' Oikealle olio(1).ux = olio(1).x + 1 olio(1).uy = olio(1).y Case "w" ' Ylös olio(1).ux = olio(1).x olio(1).uy = olio(1).y - 1 Case "s" ' Alas olio(1).ux = olio(1).x olio(1).uy = olio(1).y + 1 Case Chr(27) ' Sulje ohjelma End End Select end sub Sub LataaKentta(map As String) Open map For Input As #1 For l As Integer = 0 To 35 For k As Integer = 0 To 80 Input #1, kartta(k ,l) Next k Next l Close #1 End Sub
noin tuossa on se koodini...
Sub lataakentta(map As String) Open map For Input As #1 For l As Integer = 1 To 35 For k As Integer = 1 To 80 Input #1, kartta(k ,l) Next k Next l Close #1 End Sub
Eli for-looppeihin nollien tilalle 1 ja cls ennen kartanpiirtoa
Edit: Niin siitä tiedostojen käsittelystä: open tiedostonimi for moodi as #numero(moodin kohdalle input(voi lukea),output(voi kirjoittaa),random(molemmat), binary),
input #numero, muuttuja(lukee tiedostosta),
write #numero, muuttuja(kirjoittaa tiedostoon tai writen tilalla käy myös print),
binäärissä put #numero, muuttuja(kirjoittaa tiedostoon binäärinä),
get #numero, muuttuja(lukee binäärintiedostosta),
close #numero(sulkee tiedoston).
Aihe on jo aika vanha, joten et voi enää vastata siihen.