This topdown template has correct collision. left/right up/down diagonal collision is all handled by a rectsoverlap function and a little bit of math to ensure collision works properly and that the player stops when hitting a wall. The archive, compresssed with 7zip into a zip archive contains the exe also so you can quickly test it. Screenie below.
Have fun.
[edit] Code Below for main.agc
// Project: TopDownTemplate
// Created: 19-04-09
// show all errors
SetErrorMode(2)
// set window properties
SetWindowTitle("TopDownTemplate")
SetWindowSize(1024, 768, 0)
SetWindowAllowResize(1) // allow the user to resize the window
// set display properties
SetVirtualResolution(1024, 768) // doesn't have to match the window
SetOrientationAllowed(1, 1, 1, 1) // allow both portrait and landscape on mobile devices
SetSyncRate(60, 0) // 30fps instead of 60 to save battery
SetScissor(0, 0, 0, 0) // use the maximum available screen space, no black borders
UseNewDefaultFonts(1)
#insert "constants.agc"
#insert "game.scene"
game_setup()
global playerx as float
global playery as float
do
playerx = GetSpriteX(game_player)
playery = GetSpriteY(game_player)
if GetRawKeyState(KEY_LEFT) = 1 and GetRawKeyState(KEY_RIGHT) = 0
MoveLeft()
endif
if GetRawKeyState(KEY_RIGHT) = 1 and GetRawKeyState(KEY_LEFT) = 0
MoveRight()
endif
if GetRawKeyState(KEY_UP) = 1 and GetRawKeyState(KEY_DOWN) = 0
MoveUp()
endif
if GetRawKeyState(KEY_DOWN) = 1 and GetRawKeyState(KEY_UP) = 0
MoveDown()
endif
SetSpritePosition(game_player, playerx, playery)
game_sync()
Print(ScreenFPS())
Sync()
loop
function MoveUp()
playery = playery - 4
for x = game_walls.length to 0 step -1
if RectsOverlap(playerx, playery, 64, 64, getSpriteX(game_walls[x]), getSpriteY(game_walls[x]), 64, 64) = 1
playery = ( playery + 64 ) - mod(playery, 64)
endif
next
endfunction
function MoveDown()
playery = playery + 4
for x = game_walls.length to 0 step -1
if RectsOverlap(playerx, playery, 64, 64, getSpriteX(game_walls[x]), getSpriteY(game_walls[x]), 64, 64) = 1
playery = playery - mod(playery, 64)
endif
next
endfunction
function MoveRight()
playerx = playerx + 4
for x = game_walls.length to 0 step -1
if RectsOverlap(playerx, playery, 64, 64, getSpriteX(game_walls[x]), getSpriteY(game_walls[x]), 64, 64) = 1
playerx = playerx - mod(playerx, 64)
endif
next
endfunction
function MoveLeft()
playerx = playerx - 4
for x = game_walls.length to 0 step -1
if RectsOverlap(playerx, playery, 64, 64, getSpriteX(game_walls[x]), getSpriteY(game_walls[x]), 64, 64) = 1
playerx = ( playerx + 64 ) - mod(playerx, 64)
endif
next
endfunction
function RectsOverlap(x1, y1, w1, h1, x2, y2, w2, h2)
value = 1
If x1 >= (x2 + w2) Or (x1 + w1) <= x2 Then value = 0
If y1 >= (y2 + h2) Or (y1 + h1) <= y2 Then value = 0
endfunction value

Win 10 Pro - AMD RYZEN 7 Octacore 3.8ghz - 32GB DDR4 - RTX 2070 8GB