How To Do: Oma Tilemap järjestelmä

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

How To Do: Oma Tilemap järjestelmä

Post by MaGetzUb »

Eli kaikki tietääkin, mistä onkin kyse otsikosta päätellen. Aiheessani siis pureudutaan siihen, kuinka ladata muistiin Tilekartta, (Sama, mitä CoolBasic käyttää LoadMap komennolla) ja siihen kuinka ISO:kin kartta piirretään optimaalisesti. ;)
Huomatkaa kuitenkin, että kun menette kartan ulkopuolelle ylhäältä tai vasemmasta reunasta, heittää helahoito erroria. Mutta kuntaas menette tarpeeksi oikealle tai alas, kartta rupeaa piirtämään itseänsä uudelleen.

Code: Select all

Dim Map(1,1,3) As Integer           //Karttan tilejen dataa varten ensiksi 1x1x3 kokoinen taulukko.  Taulukko laajennetaan kartan latausfunktiossa. :)
                                        //Ulottuvuudet: X akseli, Y akseli, Layer (0. Back, 1. Over, 
                                        //2. Hit, 3. Data)
Global TileWidth, TileHeight            //Globaalit Muuttujat, Tilen pituus & Leveys
Global Worldwidth, Worldheight          //Maailman leveys ja korkeus tileinä.
Global Tiles, Tileset                   //Tilejen määrä tilesetissä ja itse tileset kuvalle varattu muuttuja
Global WorldWidth_Pix,WorldHeight_Pix   //Maailman leveys pikseleinä, Maailman korkeus pikseleinä.

_LoadMap("Media\cdm2.TIL", "Media\Tileset.BMP")
Drawscreen
Repeat 
    //Jelpit ruutuun: 
    ClearText
    AddText "Liikuta kameraa nuolista"

    //Jos mavittaa poistakaa näistä riveistä jompi kumpi, ja ilmoittakaa minulle CB Foorumille topikkiini. ;) T: MaGetzUb
    DSG_RenderMap(0)
    DSG_RenderMap(1)
    
    //Liikutetaan kameraa.
    MoveCamera 2*(RightKey() - LeftKey()), 2*(UpKey() - DownKey())
    HoldCamera()
DrawScreen
Forever 

//Tässä tulee pitkä funktio kartan lataukseen.
Function _LoadMap(kartta As String,tilesetti As String) 'By MaGetzUb

    If FileExists(kartta) Then //Tarkistetaan löytyykö karttaa sovitusta polusta, jos ei niin laitetaan erroria.
        
        If FileExists(tilesetti) Then //Jos ei tilesettiä löydy, laitetaan erroria.
            
            f = OpenToEdit(kartta) //Jos kartta  -ja tilesetti tiedosto löytyi, lähdetään lukemaan tiedostoa.
                SeekFile f,520 //Hypätään 520 bittiä Eteenpäin tiedostossa.
                MaskR = ReadByte(f) //Luetaan Maskivärin Red kanavan arvo tiedostosta.
                MaskG = ReadByte(f) //Luetaan Maskivärin Green kanavan arvo tiedostosta.
                MaskB = ReadByte(f) //Luetaan Maskivärin Blue kanavan arvo tiedostosta.
                SeekFile f,820 //Hypätään 820 bittiä Eteenpäin tiedostossa.
                tiles = ReadInt(f) //Luetaan tiedostosta, monta tileä on tilesetissä.
                If tiles =< 0 Then MakeError "Can't load map: "+kartta$+"! File includes no tiles!"
                //Jos ei ollut tilejä, paukautetaan errori.
                 
                //Tässä alempana huomaavatkin vähän vanhemmat koodaajat Flopin. 
                //Miksi lukea tilen pituus ja leveys int arvoisena, koska kuvan leveys tai korkeus ei voi olla 
                //negatiivinen, ja muutenkin kukaan nyt tuskin laittaisi yhden tilen leveydeksi yli 65536 
                // pikseliä, ei edes 100 pikseliä. 
                //ReadByte olisi ollut näille kahdelle alemmalle riville parhain vaihtoehto.

                TileWidth = ReadInt(f) //Luetaan tilen leveys tiedostosta.
                TileHeight = ReadInt(f) //Luetaan tilen korkeus tiedostosta.
                
                If tilewidth*tileheight =< 0 Then MakeError "Can't load map: "+kartta$+"! Tile size is too small!"
                //Jos Tilen ja Pituus on toisillansa kerrottuna nolla, niin laitetaan erroria.
                
                //Luetaan tiedostosta nyt suuruus tileinä.
                worldwidth = ReadInt(f) //Luetaan maailman  leveys _tileinä_ tiedostosta. 
                worldheight = ReadInt(f) //Luetaan maailman Korkeus _tileinä_ tiedostosta.  
                Redim Map(worldwidth, worldheight, 3) //Uudestaan skaalataan Map taulukko, joka koodin alussa määriteltiin.

                If worldwidth*worldheight =< 0 Then MakeError "Can't load map: "+kartta$+"! World size is too small!" 
                //Taas samanlainen tarkistus kuin ylempänä, jos ei leveyden ja korkeuden kertoma ole enempi kuin 0, heitetään erroria.
               
                //Nyt luetaan turhat tarkistus summat pois. (Näitä käytetään, että CoolBasic tunnistaisi, että tiedosto muoto on oikea)
                For i = 1 To 4 
                   empty = ReadByte(f)
                Next i 
                
                //Nyt luetaan kartan data muistiin Back kerrokselle:
                For y = 1 To worldheight
                    For x = 1 To worldwidth
                        Map(x-1,y,0) = ReadInt(f)
                    Next x    
                Next y
                //Luetaan turhat pois;:
                For i = 1 To 4
                   empty = ReadByte(f)
                Next i 
                //Nyt luetaan kartan data muistiin hit kerrokselle:
                For y = 1 To worldheight
                    For x = 1 To worldwidth
                        Map(x-1,y,2) = ReadInt(f) //<- Tähän olisi riittänyt myös ReadByte, koska törmäys joko on tai ei ole kyseisessä kohdassa karttaa.
                    Next x    
                Next y   
                //Luetaan turhat pois:
                For i = 1 To 4
                   empty = ReadByte(f)
                Next i 
                //Nyt luetaan kartan data muistiin over kerrokselle:
                For y = 1 To worldheight
                    For x = 1 To worldwidth
                        Map(x-1,y,1) = ReadInt(f) 
                    Next x    
                Next y    
                //Ja taas.
                For i = 1 To 4
                   empty = ReadByte(f)
                Next i 
                //Nyt luetaan kartan data muistiin Data kerrokselle:
                For y = 1 To worldheight
                    For x = 1 To worldwidth
                        Map(x-1,y,3) = ReadInt(f) 
                    Next x    
                Next y    
            
             CloseFile f //Lopetetaan tiedoston lukeminen
             //Ladataan Globaaliin muuttujaan tilesetti animaationa, asetetaan sille kartta tiedostosta saadut
             //Tilen leveys framen leveydeksi, Tilen korkeus framen korkeudeksi ja tilejen määrä.
             Tileset = LoadAnimImage(tilesetti,tilewidth,tileheight,0,tiles)
             //Nyt maskataan tilesetti aijemmin luetuilla Maskiväri arvoilla.
             MaskImage Tileset, MaskR, MaskG, MaskB
             WorldWidth_Pix = Worldwidth*Tilewidth //Lopuksi myös lasketaan kartan kokonais leveys pikseleinä
             WorldHeight_Pix = Worldheight*Tileheight //Samoin myös lasketaan kartan kokonais korkeus pikseleinä
        
        Else 
            
            MakeError "Tileset not found! Make sure the: '"+tilesetti$+"' is written right"
        
        EndIf 
        
    Else 
    
        MakeError "Tilemap not found! Make sure the: '"+kartta$+"' is written right."
        
    EndIf 
    
EndFunction 


//Tässä tulee lyhyt ja ytimekäs funktio kartan piirtoon
//(Huomioikaa, tämä on sekava koodin pätkä, en ole selittänyt kunnolla, 
//mitä mikäkin laskutoimitus tekee):

Function RenderMapLayer(Kerros As Integer) 'By MaGetzUb
    If kerros < 0 Or kerros > 1 Then MakeError "Peruskartassa ei ole Over- ja Backkerroksen lisäksi muita!"
    Piirto_X = CameraX() + WorldWidth_Pix / 2 - ScreenWidth()/2 //Lasketaan kartan piirtokohta leveys-akselilla.
    Piirto_Y =-CameraY() + WorldHeight_Pix / 2 - ScreenHeight()/2 //Lasketaan kartan piirtokohta korkeus-akselilla.
    
   TileY = Piirto_Y / TileHeight //Lasketaan TileY muuttujan arvo Piirtokohdan(Y) ja Tilen korkeuden osamääränä.
   Järjestys_Y=-(Piirto_Y Mod TileHeight) //Lasketaan piirtosiainnin ja tilenkorkeuden välinen jakojäännös.
    //Silmukka jota toistetaan niin kauan että piirtojärjestys muuttuja (y) on vähemmän kun ruudun korkeus.
   While Järjestys_Y<ScreenHeight()
      TileY = TileY Mod WorldHeight //Lasketaan TileY muuttujan ja maailmankorkeuden välinen jakojäännös
      TileX = Piirto_X / TileWidth //Lasketaan TileX muuttujan arvo Piirtokohdan(X) ja Tilen leveyden osamääränä.
      Järjestys_X=-(Piirto_X Mod TileWidth) //TilenX järjestys lasketaan Piirtokohta(x) ja Tilen leveyden negatiivisena osamääränä.
        //Silmukka jota toistetaan niin kauan että piirtojärjestys muuttuja (X) on vähemmän kun ruudun Leveys.
      While Järjestys_X<ScreenWidth()
            //Nyt haetaan tilen järjestysarvo, yllä olevien kaavojen perusteella.
            Tile_Num= Max(0, Map( TileX Mod WorldWidth, TileY+1, kerros )-1)
            //Piirretään vain sovittu osa ruudulle kartasta.
            If Tile_Num > 0 Then DrawImage Tileset,Järjestys_X, Järjestys_Y, Tile_Num
            //LAsketaan tilejen piirtokohtaa (x) eteenpäin
            TileX = TileX + 1
            Järjestys_X = Järjestys_X + TileWidth
      Wend
        //LAsketaan tilejen piirtokohtaa (Y) eteenpäin        
   TileY = TileY + 1
        Järjestys_Y=Järjestys_Y + TileHeight
   Wend
End Function

Function HoldCamera() 'Asettaa kameralle alueen
    sw = ScreenWidth()/2
    sh = ScreenHeight()/2
    If CameraX() - sw < - WorldWidth_Pix / 2 Then 
        Camera_X = - WorldWidth_Pix / 2 + sw
    ElseIf CameraX() + sw > WorldWidth_Pix / 2 Then 
        Camera_X = WorldWidth_Pix / 2 - sw
    Else
        Camera_X = CameraX()
    EndIf 
    If CameraY() - sh < - WorldHeight_Pix / 2 Then 
        Camera_Y = - WorldHeight_Pix / 2 + sh
    ElseIf CameraY() + sh > WorldHeight_Pix / 2 Then 
        Camera_Y = WorldHeight_Pix / 2 - sh  
    Else 
        Camera_Y = CameraY()
    EndIf 
    PositionCamera Camera_X,Camera_Y 
EndFunction 
Tässä vielä koodi niille, jotka ovat päättäneet tehdä pelinsä vielä ilman mitään CB:n sisäisiä maailmakoordinaatteja. :D

Code: Select all

Dim Map(1,1,3) As Integer           //Karttan tilejen dataa varten ensiksi 1x1x3 kokoinen taulukko.  Taulukko laajennetaan kartan latausfunktiossa. :)
                                        //Ulottuvuudet: X akseli, Y akseli, Layer (0. Back, 1. Over, 
                                        //2. Hit, 3. Data)
Global TileWidth, TileHeight            //Globaalit Muuttujat, Tilen pituus & Leveys
Global Worldwidth, Worldheight          //Maailman leveys ja korkeus tileinä.
Global Tiles, Tileset                   //Tilejen määrä tilesetissä ja itse tileset kuvalle varattu muuttuja
Global WorldWidth_Pix,WorldHeight_Pix   //Maailman leveys pikseleinä, Maailman korkeus pikseleinä.
Global Camera_X, Camera_Y

_LoadMap("Media\cdm2.TIL", "Media\Tileset.BMP")

Repeat 
    ClearText
    AddText "Liikuta kameraa nuolista"
    DSG_RenderMap(0)

    
    //Liikutetaan kameraa.
    Camera_X = Camera_X + RightKey() - LeftKey()
    Camera_Y = Camera_Y + UpKey() - DownKey()
DrawScreen
Forever 

//Tässä tulee pitkä funktio kartan lataukseen.
Function _LoadMap(kartta As String,tilesetti As String) 'By MaGetzUb

    If FileExists(kartta) Then //Tarkistetaan löytyykö karttaa sovitusta polusta, jos ei niin laitetaan erroria.
        
        If FileExists(tilesetti) Then //Jos ei tilesettiä löydy, laitetaan erroria.
            
            f = OpenToRead(kartta) //Jos kartta  -ja tilesetti tiedosto löytyi, lähdetään lukemaan tiedostoa.
                SeekFile f,520 //Hypätään 520 bittiä Eteenpäin tiedostossa.
                MaskR = ReadByte(f) //Luetaan Maskivärin Red kanavan arvo tiedostosta.
                MaskG = ReadByte(f) //Luetaan Maskivärin Green kanavan arvo tiedostosta.
                MaskB = ReadByte(f) //Luetaan Maskivärin Blue kanavan arvo tiedostosta.
                SeekFile f,820 //Hypätään 820 bittiä Eteenpäin tiedostossa.
                tiles = ReadInt(f) //Luetaan tiedostosta, monta tileä on tilesetissä.
                If tiles =< 0 Then MakeError "Can't load map: "+kartta$+"! File includes no tiles!"
                //Jos ei ollut tilejä, paukautetaan errori.
                 
                //Tässä alempana huomaavatkin vähän vanhemmat koodaajat Flopin. 
                //Miksi lukea tilen pituus ja leveys int arvoisena, koska kuvan leveys tai korkeus ei voi olla 
                //negatiivinen, ja muutenkin kukaan nyt tuskin laittaisi yhden tilen leveydeksi yli 65536 
                // pikseliä, ei edes 100 pikseliä. 
                //ReadByte olisi ollut näille kahdelle alemmalle riville hyvin.

                TileWidth = ReadInt(f) //Luetaan tilen leveys tiedostosta. 
                TileHeight = ReadInt(f) //Luetaan tilen korkeus tiedostosta.
                
                If tilewidth*tileheight =< 0 Then MakeError "Can't load map: "+kartta$+"! Tile size is too small!"
                //Jos Tilen ja Pituus on toisillansa kerrottuna nolla, niin laitetaan erroria.
                
                //Luetaan tiedostosta nyt suuruus tileinä.
                worldwidth = ReadInt(f) //Luetaan maailman  leveys _tileinä_ tiedostosta. 
                worldheight = ReadInt(f) //Luetaan maailman Korkeus _tileinä_ tiedostosta.  
                Redim Map(worldwidth, worldheight, 3) //Uudestaan skaalataan Map taulukko, joka koodin alussa määriteltiin.

                If worldwidth*worldheight =< 0 Then MakeError "Can't load map: "+kartta$+"! World size is too small!" 
                //Taas samanlainen tarkistus kuin ylempänä, jos ei leveyden ja korkeuden kertoma ole enempi kuin 0, heitetään erroria.
               
                //Nyt luetaan turhat tarkistus summat pois. (Näitä käytetään, että CoolBasic tunnistaisi, että tiedosto muoto on oikea)
                For i = 1 To 4 
                   empty = ReadByte(f)
                Next i 
                
                //Nyt luetaan kartan data muistiin Back kerrokselle:
                For y = 1 To worldheight
                    For x = 1 To worldwidth
                        Map(x-1,y,0) = ReadInt(f)
                    Next x    
                Next y
                //Luetaan turhat pois;:
                For i = 1 To 4
                   empty = ReadByte(f)
                Next i 
                //Nyt luetaan kartan data muistiin hit kerrokselle:
                For y = 1 To worldheight
                    For x = 1 To worldwidth
                        Map(x-1,y,2) = ReadInt(f) //<- Tähän olisi riittänyt myös ReadByte, koska törmäys joko on tai ei ole kyseisessä kohdassa karttaa.
                    Next x    
                Next y   
                //Luetaan turhat pois:
                For i = 1 To 4
                   empty = ReadByte(f)
                Next i 
                //Nyt luetaan kartan data muistiin over kerrokselle:
                For y = 1 To worldheight
                    For x = 1 To worldwidth
                        Map(x-1,y,1) = ReadInt(f) 
                    Next x    
                Next y    
                //Ja taas.
                For i = 1 To 4
                   empty = ReadByte(f)
                Next i 
                //Nyt luetaan kartan data muistiin Data kerrokselle:
                For y = 1 To worldheight
                    For x = 1 To worldwidth
                        Map(x-1,y,3) = ReadInt(f) 
                    Next x    
                Next y    
            
             CloseFile f //Lopetetaan tiedoston lukeminen
             //Ladataan Globaaliin muuttujaan tilesetti animaationa, asetetaan sille kartta tiedostosta saadut
             //Tilen leveys framen leveydeksi, Tilen korkeus framen korkeudeksi ja tilejen määrä.
             Tileset = LoadAnimImage(tilesetti,tilewidth,tileheight,0,tiles)
             //Nyt maskataan tilesetti aijemmin luetuilla Maskiväri arvoilla.
             MaskImage Tileset, MaskR, MaskG, MaskB
             WorldWidth_Pix = Worldwidth*Tilewidth //Lopuksi myös lasketaan kartan kokonais leveys pikseleinä
             WorldHeight_Pix = Worldheight*Tileheight //Samoin myös lasketaan kartan kokonais korkeus pikseleinä
        
        Else 
            
            MakeError "Tileset not found! Make sure path: '"+tilesetti$+"' is writed Right"
        
        EndIf 
        
    Else 
    
        MakeError "Tilemap not found! Make sure path: '"+kartta$+"' is writed Right."
        
    EndIf 
    
EndFunction 


//Tässä tulee lyhyt ja ytimekäs funktio kartan piirtoon
//(Huomioikaa, tämä on sekava koodin pätkä, en ole selittänyt kunnolla, 
//mitä mikäkin laskutoimitus tekee):
Function RenderMapLayer(Kerros As Integer) 'By MaGetzUb
    If kerros < 0 Or kerros > 1 Then MakeError "Peruskartassa ei ole Over- ja Backkerroksen lisäksi muita!"
    Piirto_X = Camera_X + WorldWidth_Pix / 2 - ScreenWidth()/2 //Lasketaan kartan piirtokohta leveys-akselilla.
    Piirto_Y = -Camera_Y + (TileHeight + WorldHeight_Pix) / 2 - ScreenHeight()/2 //Lasketaan kartan piirtokohta korkeus-akselilla.
    
   TileY = Piirto_Y / TileHeight //Lasketaan TileY muuttujan arvo Piirtokohdan(Y) ja Tilen korkeuden osamääränä.
   Järjestys_Y=-(Piirto_Y Mod TileHeight) //Lasketaan piirtosiainnin ja tilenkorkeuden välinen jakojäännös.
    //Silmukka jota toistetaan niin kauan että piirtojärjestys muuttuja (y) on vähemmän kun ruudun korkeus.
   While Järjestys_Y<ScreenHeight()
      TileY = TileY Mod WorldHeight //Lasketaan TileY muuttujan ja maailmankorkeuden välinen jakojäännös
      TileX = Piirto_X / TileWidth //Lasketaan TileX muuttujan arvo Piirtokohdan(X) ja Tilen leveyden osamääränä.
      Järjestys_X=-(Piirto_X Mod TileWidth) //TilenX järjestys lasketaan Piirtokohta(x) ja Tilen leveyden negatiivisena osamääränä.
        //Silmukka jota toistetaan niin kauan että piirtojärjestys muuttuja (X) on vähemmän kun ruudun Leveys.
      While Järjestys_X<ScreenWidth()
            //Nyt haetaan tilen järjestysarvo, yllä olevien kaavojen perusteella.
            TilenJärjestysnumero = Max(0,Map( TileX Mod WorldWidth, TileY-1, kerros )-1)
            //Piirretään vain sovittu osa ruudulle kartasta.
            If TilenJärjestysnumero > 0 Then DrawImage Tileset,Järjestys_X, Järjestys_Y, TilenJärjestysnumero
            //LAsketaan tilejen piirtokohtaa (x) eteenpäin
            TileX = TileX + 1
            Järjestys_X = Järjestys_X + TileWidth
      Wend
        //LAsketaan tilejen piirtokohtaa (Y) eteenpäin        
      TileY = TileY + 1
      Järjestys_Y = Järjestys_Y + TileWidth
   Wend
End Function
Last edited by MaGetzUb on Thu Oct 04, 2012 12:53 pm, edited 18 times in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Timblex
Advanced Member
Posts: 252
Joined: Sun Apr 11, 2010 10:37 am
Location: Kouvola

Re: How To Do: Oma Tilemap järjestelmä

Post by Timblex »

kokeilin tuota ja MAV :?:
Entinen timpe99...
Demokisa 2013 demo valmis, Check it out!
Henkru
Advanced Member
Posts: 359
Joined: Sun Aug 26, 2007 2:46 pm

Re: How To Do: Oma Tilemap järjestelmä

Post by Henkru »

Miksi ihmeessä varaat suoraan 999x999 kokoisen taulukon ja näin sidot kartan maksimi koon tuohon. Eikö kartanlatauksessa kananttaisi uudelleen venyttää taulukko sopivankokoiseksi?
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: How To Do: Oma Tilemap järjestelmä

Post by MaGetzUb »

Henkru wrote:Miksi ihmeessä varaat suoraan 999x999 kokoisen taulukon ja näin sidot kartan maksimi koon tuohon. Eikö kartanlatauksessa kananttaisi uudelleen venyttää taulukko sopivankokoiseksi?
En tullut tuota ajatelleeksi koodia väsätessäni. Muokataanpa se sitten. :) ->
timpe99 wrote:kokeilin tuota ja MAV :?:
Jaa-a taitaa olla taas konekohtainen mavi. o_o
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
CCE
Artist
Artist
Posts: 650
Joined: Mon Aug 27, 2007 9:53 pm

Re: How To Do: Oma Tilemap järjestelmä

Post by CCE »

Vaikuttaa ihan toimivalta ja tarpeelliselta mutta Memory Access Violation iski päälle esimerkkikoodia ajaessa.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: How To Do: Oma Tilemap järjestelmä

Post by MaGetzUb »

CCE wrote:Vaikuttaa ihan toimivalta ja tarpeelliselta mutta Memory Access Violation iski päälle esimerkkikoodia ajaessa.
Hassua, minulle tulee vain erroria "Can't read negative array index!", kun skrollaan kameralla vasemmalta- tai yläreunasta ulos kentältä.
EDIT:

Kertokaas, missä kohtaa mavi tulee.. :)

Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: How To Do: Oma Tilemap järjestelmä

Post by legend »

Mavia tulee...
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: How To Do: Oma Tilemap järjestelmä

Post by DatsuniG »

Heti kun ajaa koodin niin pomppaa silmille MAV.
Hengität nyt manuaalisesti.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: How To Do: Oma Tilemap järjestelmä

Post by MaGetzUb »

Kaikkien noiden mavien perusteella, täytyy sanoa että I'm confused. :o
Koittakaa nyt vielä tätä Exe:ä.

Edit: Exeä ei enää saatavilla toimimattomuutensa vuoksi.
Last edited by MaGetzUb on Tue Jun 01, 2010 12:18 am, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: How To Do: Oma Tilemap järjestelmä

Post by Jonez »

Ei toimi exekään. Vika näyttäisi olevan 2-kerroksessa (over-kerros?). Kun kohdan DSG_RenderMap(1) kommentoi, ohjelma toimii.

Se ei vikaa poista, mutta avaat tilesetin funktiolla OpenToRead(), ja käytät SeekFileä. Manuaalin mukaan SeekFileä saa käyttää vain OpenToEditin kanssa. En sitten tiedä miten se vaikuttaa...

Edit. Ja kommenttisi hit-kerroksian boolean-tyypistä on mielestäni väärä, vaikka oletkin ehkä oikeassa että pelkkä Byte riittää. Jossain pelissä voi kuitenkin tulla tilanne missä hit-kerroksen avulla estetään vain tietynlaisten objektien liike. Tietenkin cb:n omaan törmäystunnistukseen pelkästään boolean-arvo on riittävä.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: How To Do: Oma Tilemap järjestelmä

Post by MaGetzUb »

Jonez wrote:Ei toimi exekään. Vika näyttäisi olevan 2-kerroksessa (over-kerros?). Kun kohdan DSG_RenderMap(1) kommentoi, ohjelma toimii.

Se ei vikaa poista, mutta avaat tilesetin funktiolla OpenToRead(), ja käytät SeekFileä. Manuaalin mukaan SeekFileä saa käyttää vain OpenToEditin kanssa. En sitten tiedä miten se vaikuttaa...
Korjasin OpentoRead -> Editiksi, testatkaas nyt.
Jonez wrote: Edit. Ja kommenttisi hit-kerroksian boolean-tyypistä on mielestäni väärä, vaikka oletkin ehkä oikeassa että pelkkä Byte riittää. Jossain pelissä voi kuitenkin tulla tilanne missä hit-kerroksen avulla estetään vain tietynlaisten objektien liike. Tietenkin cb:n omaan törmäystunnistukseen pelkästään boolean-arvo on riittävä.
No mutta eihän silti nyt 2miljardia eri hit tunnistetta tarvita. Jopa Shorttikin riittäisi
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: How To Do: Oma Tilemap järjestelmä

Post by DatsuniG »

Itselläni mavittaa rivi 150:

Code: Select all

DrawImage Tileset,Järjestys_X, Järjestys_Y, TilenJärjestysnumero
Hengität nyt manuaalisesti.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: How To Do: Oma Tilemap järjestelmä

Post by MaGetzUb »

Minulla heitti joskus tämä koodi myös erroria, koittakaas laittaa Repeatin yläpuolelle Drawscreen, ja testatkaa tapahtuuko muutosta. :)
EDIT:

Laitoin sen nyt itse tuonne. :P

Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Nameless_One
Member
Posts: 63
Joined: Fri Mar 26, 2010 4:05 pm

Re: How To Do: Oma Tilemap järjestelmä

Post by Nameless_One »

MaGetzUb wrote:Minulla heitti joskus tämä koodi myös erroria, koittakaas laittaa Repeatin yläpuolelle Drawscreen, ja testatkaa tapahtuuko muutosta. :)
EDIT:

Laitoin sen nyt itse tuonne. :P

Mä kokeilin tuota ohjelmaa tänään ja mulla se toimii vallan mainiosti. Jopa ilman tuota Drawscreeniä Repeatin yläpuolella.

Ihan näppärä pieni ohjelma, jollaista mä tartten yhteen mun projektiin. Siinä on vain se vika, että ohjelmasi ei osaa lukea negatiivisiä lukuja. Jos sen saisit korjattua, niin se olisi paljon hyödyllisempi.
Projektit:
Semmonen jännä tasoloikka

Youtube-kanavani
Uusin video: Pelataas LoZ Oracle of Seasons - Osa 14 - Tarm Rauniot
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: How To Do: Oma Tilemap järjestelmä

Post by MaGetzUb »

Nameless_One wrote:
MaGetzUb wrote:Minulla heitti joskus tämä koodi myös erroria, koittakaas laittaa Repeatin yläpuolelle Drawscreen, ja testatkaa tapahtuuko muutosta. :)
EDIT:

Laitoin sen nyt itse tuonne. :P

Mä kokeilin tuota ohjelmaa tänään ja mulla se toimii vallan mainiosti. Jopa ilman tuota Drawscreeniä Repeatin yläpuolella.

Ihan näppärä pieni ohjelma, jollaista mä tartten yhteen mun projektiin. Siinä on vain se vika, että ohjelmasi ei osaa lukea negatiivisiä lukuja. Jos sen saisit korjattua, niin se olisi paljon hyödyllisempi.
Sitä ei tarvi välttämättä, koska minulla on tämmöinen funktio hiassa:

Code: Select all

Function HoldCamera() 'Asettaa kameralle alueen
    sw = ScreenWidth()/2
    sh = ScreenHeight()/2
    If CameraX() - sw < - WorldWidth_Pix / 2 Then 
        Camera_X = - WorldWidth_Pix / 2 + sw
    ElseIf CameraX() + sw > WorldWidth_Pix / 2 Then 
        Camera_X = WorldWidth_Pix / 2 - sw
    Else
        Camera_X = CameraX()
    EndIf 
    If CameraY() - sh < - WorldHeight_Pix / 2 Then 
        Camera_Y = - WorldHeight_Pix / 2 + sh
    ElseIf CameraY() + sh > WorldHeight_Pix / 2 Then 
        Camera_Y = WorldHeight_Pix / 2 - sh  
    Else 
        Camera_Y = CameraY()
    EndIf 
    PositionCamera Camera_X,Camera_Y 
EndFunction 
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: How To Do: Oma Tilemap järjestelmä (sen pitäisi toimia n

Post by MaGetzUb »

Anteeksi tupla. Koodin pitäisi nyt toimia. Itselläni tämä toimi moitteetta Xp:n puolella ilman mitään muutoksia, sevenin puolella tämä ei toiminut. Nyt muutoksen jälkeen sevenillä toimii, ja mavggis ilmoitti minulle että tämä toimii, oletan nyt että teillä kaikilla toimii. :)
EDIT:

Että kommentteja, olisi kiva tietää toimiiko muilla!

Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Tuxi
Active Member
Posts: 190
Joined: Wed Jan 21, 2009 10:25 pm
Contact:

Re: How To Do: Oma Tilemap järjestelmä (sen pitäisi toimia n

Post by Tuxi »

Nykyinen versio toimii hyvin ainakin minulla.
Projektit:
Jotain pientä (Ehkä vähän suurempaakin)

-Tuxi- (myös Tuxi4321)
tuhoojabotti
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 3:53 pm
Location: Suomi, Finland
Contact:

Re: How To Do: Oma Tilemap järjestelmä (sen pitäisi toimia n

Post by tuhoojabotti »

Toimii hyvin, kommenttia oli runsaasti ja muutenkin ihan hauska. Se on muuten written, ei writed. ;)
Imagedev.tuhoojabotti.com — “Programmer (noun): An organism that turns caffeine into code.”
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: How To Do: Oma Tilemap järjestelmä (sen pitäisi toimia n

Post by MaGetzUb »

tuhoojabotti wrote:Toimii hyvin, kommenttia oli runsaasti ja muutenkin ihan hauska. Se on muuten written, ei writed. ;)
Kiitti korjauksesta, kielioppi ei ole minun parhaimipa alojani. :)
Näyttäisi siltä että koodi toimii kaikilla. Nyt kaikilla olisi mahdollisuus väsätä oma tilemoottori tuon pohjalta. :D
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply