Now we're going back to specialized programming for our Types. We need a Write and Read function for both modules mMap and mTiles, however mMap will contain the main functions we can call later. This is because the map is dependant on the tiles while the tile set is more likely a stand-alone thing and independant from the map.
As you can see in the following code we're putting the tile set into the same file as the map goes, this is just fine for small projects but later you might want to put it into it's own file. This part of the code goes into mMap:
Public Sub WriteData( iFileNumber as Integer ) 'Write tile set mTiles.WriteData iFileNumber With Map 'Write map size Put iFileNumber, , .w Put iFileNumber, , .h 'Write map data Put iFileNumber, , .Data End With End Sub
Writing the tiles is a little longer but not that complicated. Note that we're going through each tile and writing it's properties to the file instead of just putting the whole array there. This gets handy when adding properties later because we can exactly control what data we want to read from the file:
Public Sub WriteData( iFileNumber as Integer ) Dim A as Long 'Write array size Put iFileNumber, , TileCount For A = 0 To TileCount With Tile( A ) 'Put the file name WriteString iFileNumber, .PictureFile 'Animation info Put iFileNumber, , .FrameCount Put iFileNumber, , .FrameDelay 'Game properties Put iFileNumber, , .Walkable End With Next End Sub
Compared to the tTile Type we left out several properties here (Bitmap, ActFrame and NextTick). Tile.Bitmap of course won't always be the same number, we have to get this index from the mBitmap manager each time we load the pictures. Storing the current frame number (ActFrame) wouldn't hurt but on the other hand we don't care if the animation starts over from the beginning when loading the level.
Storing Tile.NextTick however would cause problems because this property represents a absolute time in ticks (1/1000 second). Imagine a computer that is running for 2 hours now, where GetTickCount returns something like 8,640,020. We store this value in the file, reboot the computer and load the same map again. Now what happens? GetTickCount would return 180,000 or so and the animation wouldn't continue for 2 hours! See the problem? Even if we use GetTickCount for relative timing we still have to watch for it returning absolute values (compared to the computer's running time).
Reading back the data is likely the same, except that we have to create buffers for the data first (allocate memory).
Public Sub ReadData( iFileNumber as Integer ) 'Read tile set mTiles.ReadData iFileNumber With Map 'Read m size Get iFileNumber, , .w Get iFileNumber, , .h 'Allocate memory ReDim .Data( .w * .h ) 'Read map data Get iFileNumber, , .Data End With End Sub
And finally the complement function to mTile.WriteData:
Public Sub ReadData( iFileNumber as Integer ) Dim A as Long 'Read array size and allocate memory Get iFileNumber, , TileCount ReDim Tile( TileCount ) For A = 0 To TileCount With Tile( A ) 'Get the file name ReadString iFileNumber, .PictureFile 'Animation info Get iFileNumber, , .FrameCount Get iFileNumber, , .FrameDelay 'Game properties Get iFileNumber, , .Walkable End With Next End Sub
It's important to read the data in the same order as we wrote it into the file, you can guess why. So, basically you can just copy the WriteData function, replace Put by Get and add the line to create the buffer.