No Valtzu on näköjään tehnyt jo tällaisen, pelin alussa vaan lataat kaikki kartat tällä systeemillä valmiiksi.
Code: Select all
//----------------------------------------//
// MultiMapSystem by Valtzu (9.7.2007) //
//----------------------------------------//
//Esimerkki
SCREEN 800,600
// Ladataan kartat muistiin
map1 = LoadMapToMem("Media\cdm2.til","Media\tileset.bmp")
map2 = LoadMapToMem("Media\testmap.til","Media\tileset.bmp")
// Ladataan ukko
ukko = LoadObject ("Media\guy.bmp",72)
AddText "Arrows to move, space to change map"
Repeat
If KeyHit(cbkeyspace) Or kartta=0 Then
kumpiKartta = Not kumpiKartta // 0=>1,1=>0
// Vaihdetaan karttaa
If kumpiKartta Then kartta=UseMap(map1,kartta) Else kartta=UseMap(map2,kartta)
// Kartta sisältää animoituja tilejä, joten karttaobjekti pitää animoida
PlayObject kartta,0,0,1
// Jokaisen kartan vaihdon jälkeen pitää asettaa törmäykset uudestaan
SetupCollision ukko, kartta, 1, 4, 2
EndIf
// Ukon ohjaus
If LeftKey() Then TurnObject ukko,5
If RightKey() Then TurnObject ukko,-5
If UpKey() Then MoveObject ukko,2
If DownKey() Then MoveObject ukko,-2
UpdateGame
CloneCameraPosition ukko
DrawScreen
Forever
// ---- Funktiot ---- //
// Tämä funktio lataa kartan muistiin. Parametreina tilemapin tiedostopolku
// ja tilesetin tiedostopolku tai valmiiksi LoadImagella ladattu kuva
Function LoadMapToMem(_tilemap$,_tileset$)
If Int(_tileset)=0 Then tileset=LoadImage(_tileset) Else tileset=Int(_tileset)
f=OpenToRead(_tilemap)
tmpMem=MakeMEMBlock(8)
PokeByte tmpMem,0, 23
PokeByte tmpMem,1, 40
PokeByte tmpMem,2, 179
PokeByte tmpMem,3,192
PokeByte tmpMem,4,243
PokeByte tmpMem,5,13
PokeByte tmpMem,6,56
PokeByte tmpMem,7,139
For i = 0 To 3
a=ReadByte(f)
If a <> PeekByte(tmpMem,i*2) And a <> PeekByte(tmpMem,i*2+1) Then virhe=1:Exit
Next i
versio# = ReadFloat(f)
If virhe Or versio <= 0.0 Or versio > 2.0 Then MakeError("Error! Invalid tilemap.")
For i=1 To 128
a=ReadInt(f)
Next i
maskr=ReadByte(f):maskg=ReadByte(f):maskb=ReadByte(f)
For i=1 To 297
a=ReadByte(f)
Next i
tileja=ReadInt(f)
tileleveys=ReadInt(f)
tilekorkeus=ReadInt(f)
mapleveys=ReadInt(f)
mapkorkeus=ReadInt(f)
mapMem=MakeMEMBlock(27+(mapleveys*mapkorkeus*2*4)+(tileja*8))
PokeInt mapMem,0, tileja
PokeInt mapMem,4, tileleveys
PokeInt mapMem,8, tilekorkeus
PokeInt mapMem,12,mapleveys
PokeInt mapMem,16,mapkorkeus
PokeInt mapMem,20,tileset
PokeByte tmpMem,0, 254
PokeByte tmpMem,1, 45
PokeByte tmpMem,2, 12
PokeByte tmpMem,3,166
offset=24
For kerros=0 To 3
If ReadByte(f) <> PeekByte(tmpMem,0) Or ReadByte(f) <> PeekByte(tmpMem,1) Or ReadByte(f) <> PeekByte(tmpMem,2) Or ReadByte(f) <> PeekByte(tmpMem,3) Then MakeError("Error! Invalid tilemap.")
For y=1 To mapkorkeus
For x=1 To mapleveys
PokeShort mapMem,offset,ReadInt(f):offset+2
Next x
Next y
For i=0 To 3
PokeByte tmpMem,i,PeekByte(tmpMem,i)-1
Next i
Next kerros
If ReadByte(f) <> PeekByte(tmpMem,0) Or ReadByte(f) <> PeekByte(tmpMem,1) Or ReadByte(f) <> PeekByte(tmpMem,2) Or ReadByte(f) <> PeekByte(tmpMem,3) Then MakeError("Error! Invalid tilemap.")
For tile=1 To tileja
PokeInt mapMem,offset,ReadInt(f):offset+4
PokeInt mapMem,offset,ReadInt(f):offset+4
Next tile
PokeByte mapMem,offset,maskr:offset+1
PokeByte mapMem,offset,maskg:offset+1
PokeByte mapMem,offset,maskb:offset+1
CloseFile f
DeleteMEMBlock tmpMem
Return mapMem
End Function
// UseMap()-funktio asettaa LoadMapToMem()-funktiolla ladatun kartan käyttöön.
// Toiseksi parametriksi syötetään viimeksi käytetty karttaobjekti
Function UseMap(mapMem,oldMap=0)
If oldMap Then DeleteObject oldMap
tileja=PeekInt(mapMem,0)
tileleveys=PeekInt(mapMem,4)
tilekorkeus=PeekInt(mapMem,8)
mapleveys=PeekInt(mapMem,12)
mapkorkeus=PeekInt(mapMem,16)
tileset=PeekInt(mapMem,20)
objMap=MakeMap(mapleveys,mapkorkeus,tileleveys,tilekorkeus)
offset=24
For kerros=0 To 3
kerros2=kerros
If kerros = 1 Then kerros2 = 2
If kerros = 2 Then kerros2 = 1
For y=1 To mapkorkeus
For x=1 To mapleveys
EditMap objMap,kerros2,x,y,Int(PeekShort(mapMem,offset)):offset+2
Next x
Next y
Next kerros
For tile=1 To tileja
pituus=PeekInt(mapMem,offset):offset+4
hitaus=PeekInt(mapMem,offset):offset+4
SetTile tile,pituus,hitaus
Next tile
PaintObject objMap,tileset
r=PeekByte(mapMem,offset):offset+1
g=PeekByte(mapMem,offset):offset+1
b=PeekByte(mapMem,offset):offset+1
MaskObject objMap,r,g,b
ObjectOrder objMap,-1
Return objMap
End Function
// Poistaa LoadMapToMem()-funktiolla ladatun kartan muistista.
// Tämän käyttö ei ole välttämätöntä
Function DeleteMapFromMem(mapMem)
DeleteMEMBlock mapMem
End Function