I couldn't get it stuck either. The things you don't need in your code is the UNDIM statement for an array that hasn't been dimensionalized yet and the GOSUB to Map and RETURN. DATA statements don't need to be run through to be seen.
I added green so I could see where the box is while checking for collision.
Rem Project: Cave
Rem Created: 16.8.2011 12:47:29
Rem ***** Main Source File *****
Sync On : Sync Rate 60
#Constant TRUE 1
#Constant FALSE 0
#Constant MAX_PLAYERS 10
Type MapData
Width As Integer
Height As Integer
Name As String
Zoom As Integer
Players As Integer
Endtype
Map As MapData
Map.Zoom = 20
Type TileData
ID As Integer
Walkable As Boolean
Endtype
Type PlayerData
Exist As Boolean
Alive As Boolean
xPos As Float
zPos As Float
Size As Integer
MoveSpeed As Float
xMoveSpeed As Float
zMoveSpeed As Float
Friction As Float
Endtype
Dim Player(MAX_PLAYERS) As PlayerData
Player(0).Exist = TRUE
Player(0).Alive = TRUE
Player(0).Size = 5
Player(0).xPos = 50
Player(0).zPos = 50
Player(0).MoveSpeed = 0.2
Player(0).Friction = 0.95
Read Map.Width : Read Map.Height
Dim Tile(Map.Width,Map.Height) As TileData
For zPos = 0 To Map.Height - 1
For xPos = 0 To Map.Width - 1
Read Tile(xPos,zPos).ID
If Tile(xPos,zPos).ID = 0
Tile(xPos,zPos).Walkable = TRUE
Endif
Next xPos
Next zPos
Do
Cls
Horizontal = Rightkey() - Leftkey()
Vertical = Downkey() - Upkey()
ControlPlayer(0,Horizontal,Vertical)
Ink Rgb(180,180,180),0
For xPos = 0 To Map.Width - 1
For zPos = 0 To Map.Height - 1
If Tile(xPos,zPos).ID = 1
Box xPos * Map.Zoom,zPos * Map.Zoom,xPos * Map.Zoom + Map.Zoom,zPos * Map.Zoom + Map.Zoom
Endif
Next zPos
Next xPos
For PlayerNumber = 0 To MAX_PLAYERS - 1
If Player(PlayerNumber).Exist = TRUE
If Player(PlayerNumber).Alive = TRUE
Ink Rgb(255,0,0),0
Box Player(PlayerNumber).xPos - Player(PlayerNumber).Size,Player(PlayerNumber).zPos - Player(PlayerNumber).Size,Player(PlayerNumber).xPos + Player(PlayerNumber).Size,Player(PlayerNumber).zPos + Player(PlayerNumber).Size
ink rgb(0,255,0),0
Box Player(PlayerNumber).xPos - Player(PlayerNumber).Size+1,Player(PlayerNumber).zPos - Player(PlayerNumber).Size+1,Player(PlayerNumber).xPos + Player(PlayerNumber).Size-1,Player(PlayerNumber).zPos + Player(PlayerNumber).Size-1
//Fill Circle Player(PlayerNumber).xPos,Player(PlayerNumber).zPos,Player(PlayerNumber).Size
Endif
Endif
Next xPos
Sync
Loop
Data 20,20
Data 01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01
Data 01,00,00,00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,01,01,01,00,01,00,00,00,00,00,00,00,01,01,01,00,01
Data 01,01,01,01,00,01,00,01,00,00,00,00,00,00,00,01,00,01,00,01
Data 01,00,00,00,00,01,00,01,00,00,00,00,00,00,00,01,00,01,00,01
Data 01,00,01,01,00,01,00,01,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,01,01,01,01,00,01,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,01,00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,01,00,01,01,01,01,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01
Data 01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01
Function ControlPlayer(PlayerNumber,Horizontal,Vertical)
Player(PlayerNumber).xMoveSpeed = Player(PlayerNumber).xMoveSpeed + Player(PlayerNumber).MoveSpeed * Horizontal
Player(PlayerNumber).zMoveSpeed = Player(PlayerNumber).zMoveSpeed + Player(PlayerNumber).MoveSpeed * Vertical
Player(PlayerNumber).xMoveSpeed = Player(PlayerNumber).xMoveSpeed * Player(PlayerNumber).Friction
Player(PlayerNumber).zMoveSpeed = Player(PlayerNumber).zMoveSpeed * Player(PlayerNumber).Friction
xOldPos# = Player(PlayerNumber).xPos
zOldPos# = Player(PlayerNumber).zPos
Player(PlayerNumber).xPos = Player(PlayerNumber).xPos + Player(PlayerNumber).xMoveSpeed
Player(PlayerNumber).zPos = Player(PlayerNumber).zPos + Player(PlayerNumber).zMoveSpeed
LeftTile = Int((Player(PlayerNumber).xPos - Player(PlayerNumber).Size) / Map.Zoom)
RightTile = Int((Player(PlayerNumber).xPos + Player(PlayerNumber).Size) / Map.Zoom)
TopTile = Int((Player(PlayerNumber).zPos - Player(PlayerNumber).Size) / Map.Zoom)
BottomTile = Int((Player(PlayerNumber).zPos + Player(PlayerNumber).Size) / Map.Zoom)
LeftOldTile = Int((xOldPos# - Player(PlayerNumber).Size) / Map.Zoom)
RightOldTile = Int((xOldPos# + Player(PlayerNumber).Size) / Map.Zoom)
TopOldTile = Int((zOldPos# - Player(PlayerNumber).Size) / Map.Zoom)
BottomOldTile = Int((zOldPos# + Player(PlayerNumber).Size) / Map.Zoom)
If Tile(LeftTile,TopOldTile).Walkable = FALSE Then Player(PlayerNumber).xPos = xOldPos# : Player(PlayerNumber).xMoveSpeed = 0.0
If Tile(LeftOldTile,TopTile).Walkable = FALSE Then Player(PlayerNumber).zPos = zOldPos# : Player(PlayerNumber).zMoveSpeed = 0.0
If Tile(RightTile,TopOldTile).Walkable = FALSE Then Player(PlayerNumber).xPos = xOldPos# : Player(PlayerNumber).xMoveSpeed = 0.0
If Tile(RightOldTile,TopTile).Walkable = FALSE Then Player(PlayerNumber).zPos = zOldPos# : Player(PlayerNumber).zMoveSpeed = 0.0
If Tile(LeftTile,BottomOldTile).Walkable = FALSE Then Player(PlayerNumber).xPos = xOldPos# : Player(PlayerNumber).xMoveSpeed = 0.0
If Tile(LeftOldTile,BottomTile).Walkable = FALSE Then Player(PlayerNumber).zPos = zOldPos# : Player(PlayerNumber).zMoveSpeed = 0.0
If Tile(RightTile,BottomOldTile).Walkable = FALSE Then Player(PlayerNumber).xPos = xOldPos# : Player(PlayerNumber).xMoveSpeed = 0.0
If Tile(RightOldTile,BottomTile).Walkable = FALSE Then Player(PlayerNumber).zPos = zOldPos# : Player(PlayerNumber).zMoveSpeed = 0.0
Endfunction
