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
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