Hey, good job so far! I remember one of my first games in C++ and SDL 1.1 way back in the day and it was tough, so mad respect!
A couple of suggestions if I may:
1) Have you thought about using a 2 dimensional array for your tile layout? I think it would be helpful since you'll be able to directly address any tile with that quick math you already figured out.
For example, since each tile is 64x64 and you know the absolute position of the player, you can find out the tile the player is in like:
tile = tiles[(int)playerX/64][(int)playerY/64]
So if the player is at x = 139, y = 73, the current tile is [2][1] or the third tile to the right and two down. Now, you only have to check 8 tiles to see if they're walk-able or not, and each of those are directly address-able as well! Of course, since you're allowing free movement it's not quite that simple since you could be on the border of two tiles, as you've discovered...
2) How deep is the 'interact' mode? Is it an actual state the player can enter? If so, can your player just not accept new velocity info while in this mode? Having not seen the code I'm sure the problem is tougher than this, but if you want some help debugging, I wouldn't mind looking at any code snippets you like to give!
PS
Oh yeah, your earlier issue with framerates and animation speed is exactly why a lot of old games are unplayable today because the simulation running on modern computers is so fast. You're right in that games today typically separate the simulation speed (or 'tick rate' in a multiplayer server) from the render loop. :)