Well, everyone does it slightly differently, but that's essentially what I do. I find that having a function called main_loop is a bit redundant; I do a loop in the main program, outside of any functions, and that loop calls functions (much like you are doing.)
That said, I prefer to have even fewer functions called directly in the main loop, and the functions are abstracted further. So rather than calling functions to move the player and check collisions and such, my main loop calls just two functions, UpdateGame and DrawEverything. Those functions call collision detection routines and drawing functions.
That said, I prefer to have even fewer functions called directly in the main loop, and the functions are abstracted further. So rather than calling functions to move the player and check collisions and such, my main loop calls just two functions, UpdateGame and DrawEverything. Those functions call collision detection routines and drawing functions.