Hello there and welcome aboard!
There are different ways to architecture your code :
- Only global variables and functions (quick and dirty but very messy in complex programs)
- structures and functions (a kind of compromise)
- Go full object oriented and use only classes (the "proper" way)
Usually, in the Arduino world, people go for the first option, as Arduino is for people who don't know much about programming. It's totally fine for simple programs, but get very messy when you try to make a fully featured game. You can tidy things up by putting your code in several tabs in the Arduino IDE (which are saved as several .ino files). The files are simply concatenated before compilation, so that only to makes it easier to navigate through your code. An example of this way of doing is Crabator : you can see it's very messy and difficult to understand (it's because it's started as a simple test and evolved into a game. I should re-factor it).
If you want you code to be more compact and efficient, you can create structures so you can reuse them. For example you can create a class "Rectangle", which can be used to define the mobs' hitbox or other thing as well. This way you can use only one function to process collision between rectangles, whether they belong to a mob, to the player, or to the level. The function are global functions which takes structures as arguments. An example of this way of coding would be "physics". Moreover this example could help you to understand how to create a function that checks the collision between one rectangle (the player) and several other rectangles (the map). If your games is tiled, then you should look at the game "UFO-race".
The "proper" way it to make everything object oriented like you've learned to do at school. Problem is that object oriented isn't fully supported on Atmel atmega chips (look for "arduino object oriented" in your favorite search engine). For examples there is no constructor or destructors (so people usually create a method named "begin()" which is used in place of the constructor).This is because there is no dynamic memory allocation on these chip. Everything has to be declared at compilation time.
You might consider using rectangle collision instead of bitmap collision as it's much faster.
That was my long answer to your long question. It's my vision of the things and might not be exact, but I hope it helps