That was really just a proof of concept, I can limit speeds and it's improving a lot.... But collisions like this are difficult.
Why not store an array, that amounts to a very fine collision tile map. Any value that is 1 is collidable, 0 is not. Write a function that returns true if a given x,y location is 1 in this array and bam, accurate collision detection. When the player moves, you let them move 5px/10px/however small each "tile" is, check if theres a collision and undo the move appropriately.
This is how collision are usually mapped in 3d games, however a 3d array is used. It should transfer to your situation nicely!