Uuden formaatin teko

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Nassi_Setä
Advanced Member
Posts: 281
Joined: Sat Jun 28, 2008 5:19 pm
Location: Hämeessä miä

Uuden formaatin teko

Post by Nassi_Setä »

Kuinka voisi toteuttaa uuden formaatin teon? Tässä tapauksessa kartan.
Olen lueskellut vähän Tilesterin manuskasta tile-mappi asioita joista ei varmaan ole kovin paljon hyötyä.
Tarkoituksena olisi tehdä kuva-kartta formaatti jota voisi käsitellä samaan tapaan kuin tile-mappia.
Eli kuva jossa on kerroksia ja jolle voisi laittaa törmäystunnistuksen ja myös muuttaa karttaa lennosta.

Minulla ei ole mitään hajua mistä pitäisi aloittaa ja en myöskään osaa muita kieliä kovin hyvin,
joten apua tarvis :|
\../(-_-)\../ <---klick MyBrute Image
Jotain evilii on tekeillä....
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Uuden formaatin teko

Post by kaneli2000 »

Omassa projektissani Fade.ssa piilomainonta FTW käytän kolmea kuvaa ja .fmd-tiedostoa (Fade. Map Data), joka luodaan itsetekemälläni (CoolBasic) level editorilla. Idea piilee siinä, että yhdestä katsotaan kuvien törmäykset, yhdesta, miltä kenttä läyttää edestä ja yhdestä, mikä on kentän backround. FMD-filusta taas katsotaan level editorilla laitetut entityt ja muut härpäkkeet kaavalla:

Code: Select all

If EOF(file) = False
    entityname$ = ReadLine(file)//entityn nimi
    entityx = ReadShort(file)//x-koordinaatti
    entityy = ReadShort(file)//y-koordinaatti
    
    //tehdään uusi entity tietojen mukaan ja posataan se
EndIf
Ei moiseen uutta formaattia tarvitse.
I see the rainbow rising
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Uuden formaatin teko

Post by Jonez »

Jos teet oman karttaformaatin, joudut luonnollisesti tekemään omat funktiot, taulukot ym. sen hallintaan. Homma menee periaatteessa kuten kaneli sanoi. Tilekarttojen (tai vastaavanlaisten) kanssa kartat ovat täsmällisiä datapaketteja, joissa on enemmän tai vähemmän juuri ne tiedot mitä tarvitaan. Ero siis tuohon kanelin mappisysteemiin on se, että siinä missä .fmd-tiedostossa voi olla dynaaminen määrä entityjä, tilekartassa layereiden ja niiden datan määrä on aika vakio. Eli luokkaa karttaLeveys * karttaKorkeus.

Homma menee tilekarttojen kanssa niin, että ensin kirjoitat kartan leveyden ja korkeuden ylös, jonka jälkeen yhden tilen leveyden ja korkeuden. Sen jälkeen layereiden määrän. Lopuksi kirjoitat kaikkien layereiden kaiken datan ylös. Tietenkin voit kirjoittaa dataa missä järjestyksessä haluat, kunhan luet sen samassa järjestyksessä. Huomaa kuitenkin, että kannattaa kirjoittaa ja lukea kartan koko ja layereiden määrä ennen itse tilejen dataa. Toisinpäin se ei oikein ole mahdollista.

Seuraavassa esimerkissä Hiiri1 luo dataa "1" layeriin "0" (näkyy punaisena laatikkona). F5 tallentaa kartan, f9 lataa sen. Älä yritä ladata karttaa ennen kuin olet tallentanut.

Code: Select all

SCREEN 800, 600

Global gMapWidth, gMapHeight, gLayerAmount, gTSizeX, gTSizeY

//kartan tiedot
gMapWidth = 20
gMapHeight = 20
gTSizeX = 32
gTSizeY = 32
gLayerAmount = 4

//Taulukko kartalle
Dim map( gMapWidth - 1, gMapHeight - 1, gLayerAmount - 1 )


Repeat
    
    //Luodaan dataa "1" layeriin "0"
    If MouseDown( 1 ) Then
        If MouseX() > 0 And MouseY() > 0 And MouseX() < gMapWidth * gTSizeX And MouseY() < gMapHeight * gTSizeY Then
            dX = MouseX() / gTSizeX
            dY = MouseY() / gTSizeY
            map( dX, dY, 0 ) = 1
        EndIf
    EndIf

    //Piirretään kaikkien layereiden kaikki data näytölle.
    For i = 0 To gLayerAmount - 1
        For x = 0 To gMapWidth - 1
            For y = 0 To gMapHeight - 1
                If map( x, y, i ) <> 0 Then
                    Color cbRed //<-Tällä hetkellä mikä tahansa nollasta eroava data näytetään punaisena laatikkona
                    Box x * gTSizeX, y * gTSizeY, gTSizeX, gTSizeY
                EndIf
            Next y
        Next x
    Next i

    //F5 tallentaa, F9 lataa. Älä yritä ladata jos et ole vielä tallentanut.
    If KeyHit( CbKeyF5 ) Then
        SaveMyMap( "jee.map" )
    ElseIf KeyHit( CbKeyF9 ) Then
        LoadMyMap( "jee.map" )
    EndIf
    
    Color cbWhite
    Text 20, 20, "f5 = save | f9 = load previous map"
    DrawScreen
Forever

//Tallentaa kartan
Function SaveMyMap( _name As String )
    If lower( Right( _name, 4 ) ) <> ".map" Then
        _name = _name + ".map"
    EndIf
    
    //Kirjoitetaan kaikki mahdollinen tieto ylös
    f = OpenToWrite( _name )
    
        WriteString f, "munKartta"
        WriteShort f, gMapWidth
        WriteShort f, gMapHeight
        WriteByte f, gTSizeX
        WriteByte f, gTSizeY
        WriteByte f, gLayerAmount
        
        For i = 0 To gLayerAmount - 1
            WriteByte f, i
            For x = 0 To gMapWidth - 1
                For y = 0 To gMapHeight - 1
                    WriteByte f, map( x, y, i )
                Next y
            Next x
        Next i
        
    CloseFile f
EndFunction

Function LoadMyMap( _name As String )
 
    If lower( Right( _name, 4 ) ) <> ".map" Then
        _name = _name + ".map"
    EndIf
    
    //Luetaan tietoa.
    f = OpenToRead( _name )
    
        If ReadString( f ) <> "munKartta" Then MakeError "Kartta ei yhteensopiva!"
        gMapWidth = ReadShort( f )
        gMapHeight = ReadShort( f )
        gTSizeX = ReadByte( f )
        gTSizeY = ReadByte( f )
        gLayerAmount = ReadByte( f )
        
        //Tässä alustamme taulukon uudestaan
        ReDim map( gMapWidth - 1, gMapHeight - 1, gLayerAmount - 1 )

        //Ja kirjoitamme ladatut tiedot taulukkoon.
        For i = 0 To gLayerAmount - 1
            _curLayer = ReadByte( f )
            For x = 0 To gMapWidth - 1
                For y = 0 To gMapHeight - 1
                    map( x, y, _curLayer ) = ReadByte( f )
                Next y
            Next x
        Next i
    
    CloseFile f
EndFunction
Näkyvän datan (päällys- ja taustakerros) kanssa kannattaa käydä läpi vain ruudulle piirrettävä osio taulukosta. Muu data kannattaa tarkastaa vain jos pelihahmo törmää / on vuorovaikutuksessa datan kanssa. Tuossa minun (erittäin yksinkertaisessa) esimerkissäni kaikki data käydään läpi riippumatta kartan sijainnista, eikä minkäänlaista hit- tai data-kerrosta ole. Vain neljä taustakerrosta.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Uuden formaatin teko

Post by skorpioni-cb »

Jonez wrote:Jos teet oman karttaformaatin, joudut luonnollisesti tekemään omat funktiot, taulukot ym. sen hallintaan. Homma menee periaatteessa kuten kaneli sanoi. Tilekarttojen (tai vastaavanlaisten) kanssa kartat ovat täsmällisiä datapaketteja, joissa on enemmän tai vähemmän juuri ne tiedot mitä tarvitaan. Ero siis tuohon kanelin mappisysteemiin on se, että siinä missä .fmd-tiedostossa voi olla dynaaminen määrä entityjä, tilekartassa layereiden ja niiden datan määrä on aika vakio. Eli luokkaa karttaLeveys * karttaKorkeus.

Homma menee tilekarttojen kanssa niin, että ensin kirjoitat kartan leveyden ja korkeuden ylös, jonka jälkeen yhden tilen leveyden ja korkeuden. Sen jälkeen layereiden määrän. Lopuksi kirjoitat kaikkien layereiden kaiken datan ylös. Tietenkin voit kirjoittaa dataa missä järjestyksessä haluat, kunhan luet sen samassa järjestyksessä. Huomaa kuitenkin, että kannattaa kirjoittaa ja lukea kartan koko ja layereiden määrä ennen itse tilejen dataa. Toisinpäin se ei oikein ole mahdollista.

Seuraavassa esimerkissä Hiiri1 luo dataa "1" layeriin "0" (näkyy punaisena laatikkona). F5 tallentaa kartan, f9 lataa sen. Älä yritä ladata karttaa ennen kuin olet tallentanut.

Code: Select all

SCREEN 800, 600

Global gMapWidth, gMapHeight, gLayerAmount, gTSizeX, gTSizeY

//kartan tiedot
gMapWidth = 20
gMapHeight = 20
gTSizeX = 32
gTSizeY = 32
gLayerAmount = 4

//Taulukko kartalle
Dim map( gMapWidth - 1, gMapHeight - 1, gLayerAmount - 1 )


Repeat
    
    //Luodaan dataa "1" layeriin "0"
    If MouseDown( 1 ) Then
        If MouseX() > 0 And MouseY() > 0 And MouseX() < gMapWidth * gTSizeX And MouseY() < gMapHeight * gTSizeY Then
            dX = MouseX() / gTSizeX
            dY = MouseY() / gTSizeY
            map( dX, dY, 0 ) = 1
        EndIf
    EndIf

    //Piirretään kaikkien layereiden kaikki data näytölle.
    For i = 0 To gLayerAmount - 1
        For x = 0 To gMapWidth - 1
            For y = 0 To gMapHeight - 1
                If map( x, y, i ) <> 0 Then
                    Color cbRed //<-Tällä hetkellä mikä tahansa nollasta eroava data näytetään punaisena laatikkona
                    Box x * gTSizeX, y * gTSizeY, gTSizeX, gTSizeY
                EndIf
            Next y
        Next x
    Next i

    //F5 tallentaa, F9 lataa. Älä yritä ladata jos et ole vielä tallentanut.
    If KeyHit( CbKeyF5 ) Then
        SaveMyMap( "jee.map" )
    ElseIf KeyHit( CbKeyF9 ) Then
        LoadMyMap( "jee.map" )
    EndIf
    
    Color cbWhite
    Text 20, 20, "f5 = save | f9 = load previous map"
    DrawScreen
Forever

//Tallentaa kartan
Function SaveMyMap( _name As String )
    If lower( Right( _name, 4 ) ) <> ".map" Then
        _name = _name + ".map"
    EndIf
    
    //Kirjoitetaan kaikki mahdollinen tieto ylös
    f = OpenToWrite( _name )
    
        WriteString f, "munKartta"
        WriteShort f, gMapWidth
        WriteShort f, gMapHeight
        WriteByte f, gTSizeX
        WriteByte f, gTSizeY
        WriteByte f, gLayerAmount
        
        For i = 0 To gLayerAmount - 1
            WriteByte f, i
            For x = 0 To gMapWidth - 1
                For y = 0 To gMapHeight - 1
                    WriteByte f, map( x, y, i )
                Next y
            Next x
        Next i
        
    CloseFile f
EndFunction

Function LoadMyMap( _name As String )
 
    If lower( Right( _name, 4 ) ) <> ".map" Then
        _name = _name + ".map"
    EndIf
    
    //Luetaan tietoa.
    f = OpenToRead( _name )
    
        If ReadString( f ) <> "munKartta" Then MakeError "Kartta ei yhteensopiva!"
        gMapWidth = ReadShort( f )
        gMapHeight = ReadShort( f )
        gTSizeX = ReadByte( f )
        gTSizeY = ReadByte( f )
        gLayerAmount = ReadByte( f )
        
        //Tässä alustamme taulukon uudestaan
        ReDim map( gMapWidth - 1, gMapHeight - 1, gLayerAmount - 1 )

        //Ja kirjoitamme ladatut tiedot taulukkoon.
        For i = 0 To gLayerAmount - 1
            _curLayer = ReadByte( f )
            For x = 0 To gMapWidth - 1
                For y = 0 To gMapHeight - 1
                    map( x, y, _curLayer ) = ReadByte( f )
                Next y
            Next x
        Next i
    
    CloseFile f
EndFunction
Näkyvän datan (päällys- ja taustakerros) kanssa kannattaa käydä läpi vain ruudulle piirrettävä osio taulukosta. Muu data kannattaa tarkastaa vain jos pelihahmo törmää / on vuorovaikutuksessa datan kanssa. Tuossa minun (erittäin yksinkertaisessa) esimerkissäni kaikki data käydään läpi riippumatta kartan sijainnista, eikä minkäänlaista hit- tai data-kerrosta ole. Vain neljä taustakerrosta.
Offtopic:

Sinä varastit multa MAP-formaatti nimi-idean.

Ontopic:

Juuri niin.
En tiedä, mitä tiedän, mutta tiedän ettei se ole mitään kaunista.

I know not what I know, but I do know that it's not beautiful.
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Uuden formaatin teko

Post by kaneli2000 »

skorpioni-cb wrote:Offtopic:

Sinä varastit multa MAP-formaatti nimi-idean.
Offtopic: Luuletko olevasi maailman ensimmäinen ihminen, joka keksii antaa karttaformaatille nimeksi map?
I see the rainbow rising
Nassi_Setä
Advanced Member
Posts: 281
Joined: Sat Jun 28, 2008 5:19 pm
Location: Hämeessä miä

Re: Uuden formaatin teko

Post by Nassi_Setä »

Minä tosi nero keksin käydä kuvan(1680*1050) pikseli pikseliltä läpi ja tallettaa tiedot tekstitiedostoon...
Kokoa tuolle tiedostolle tuli noin 377 megabittiä ennen kuin CB:tiles ja näytti kolmea tyhjää erroria saman aikaisesti.
Avatessa kaikki muut tekstieditorit tiles paitsi WordPad ja sekin tökki paljon
(kuva) --> http://img190.imageshack.us/img190/749/lololi.png

Johtopäätös: taidan kopioida vähän tuota kanelin ideaa sen verran että käytän vain kolmea eri kuvaa ja teen niille jotain koodissa :D
\../(-_-)\../ <---klick MyBrute Image
Jotain evilii on tekeillä....
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Uuden formaatin teko

Post by Jonez »

Se formaattihan tehdään täysin sen mukaan minkälaiseen peliin / editoriin se on tarkoitettu. En tiedä minkälaisen itse tarvitset, mutta:
Jos haluat cb:n tilekartta-tyylisen, on tuo minun ehdotukseni paras. Jos teet kanelin tyyliin, tulee tiedostoista suurempia kuin minun ehdottamassa tyylissä, koska minun tyylissäni tilen koordinaatit saadaan järjestyksestä jossa data luetaan. Siis periaatteessa tilen koordinaattien tieto vie 0 tavua muistia. Kanelin systeemissä joudut lukemaan myös koordinaattien tiedot, jotka ovat lähes välttämättä muotoa Int, eli 8 ylimääräistä tavua per kuva (on tosin helppoja tapoja miten koordinaatit saisi yhteen tai kahteen tavuun, ja äärimmäisessä tapauksessa tavuun ja shorttiin).

Tietenkin jos teet vähänkään erilaista systeemiä kuin tilekartta, jossa kuvat voivat olla missä tahansa, joudut välttämättä kirjoittamaan koordinaatit erikseen.

Luin tämän viestin uudelleen, ja haluan lopuksi sanoa:
Tämä ei ole mikään kilpailu kenellä (minulla vai kaneli2000:lla) oli paras idea. Kumpikin meistä on "oikeassa". Vain sinä voit olla väärässä, jos käytät yksinkertaisesti huonoa tapaa luoda karttasi. Kannattaa miettiä tarkkaan mitä haluat tiedostosi sisältävän, ja kuinka saat siitä mahdollisimman pienen ja optimoidun. Itse voin vain arvailla mitä haluat tehdä, ja antaa vinkkejä sen mukaan.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Nassi_Setä
Advanced Member
Posts: 281
Joined: Sat Jun 28, 2008 5:19 pm
Location: Hämeessä miä

Re: Uuden formaatin teko

Post by Nassi_Setä »

siis selvennykseksi en aijo tehdä tile-kartta tsydeemiä vaan xmap tyylisen jutun
\../(-_-)\../ <---klick MyBrute Image
Jotain evilii on tekeillä....
Taatero
Advanced Member
Posts: 384
Joined: Tue May 27, 2008 6:06 pm

Re: Uuden formaatin teko

Post by Taatero »

Nassi_Setä wrote:siis selvennykseksi en aijo tehdä tile-kartta tsydeemiä vaan xmap tyylisen jutun
Riippuu ominaisuuksista joita tarvitset/haluat toteuttaa. Pelkästään tuhoutuvaan maastoon riittää itse tehty eidtori, joka lopuksi liittää yhdeksi kuvaksi kaikki päällekkäin editorissa näkyvät kuvat/kentän rakennuspalikat. Jos taas haluat hieman monimutkaisemman karttaformaatin esim. itsetehdyillä "objekteilla"
jotka reagoivat peliin, joudut tekemään itse karttakuvan lisäksi jonkinlaisen tekstitiedoston, joka sisältää objektien koordinaatit. Lisäksi voit joutua käyttämään monia kuvia yhteen mappiin (eri kerrokset taustassa, itse törmäyskerros [eli maa], pelkästään yhteen mappiin sidotut kuvat yms)
[color=#40BF00][u]koodaaja[/u][/color] wrote:Täyden turvan takaamiseksi avain olisi myös kuljetettava offlinenä suoraan tulevien viestien lähettäjältä niiden vastaanottajalle laitakaupungin hämärissä yöneljältä ja varmistettava, ettei kumpaakaan osapuolta seurata. Popliinitakkia suositellaan.
Post Reply