A small to medium sized pygame game
With respect to your title_screen function:


You are not using the standard python functions for operating on paths. Try using pathlib:

from pathlib import Path

Assets_base_path = Path('/path/to/assets')

def title_screen():
    background = Assets_base_path / 'title_screen.png'

In your while not enter_game loop, you are setting the enter_game 
status from the event loop, but that won't affect anything until the entire loop is completed. I'd suggest moving that code down to the bottom 
of the loop.
Your code calls this line:

game_display.blit(pygame.image.load(background), (0, 0))


over and over again. The loaded image should be cached - just load it into a variable outside the loop, instead of reading it from disk each time.
You have this code:

font = pygame.font.Font(fonts_path + 'Futura.ttf', font_size)
game_display.blit(font.render(str('An RPG'), True, Color.Black), (500, 111))


And a similar statement elsewhere in the function. I would suggest writing a helper function that does this work for you. Something like this:

def show_text(locn, text, *, color=None, font=None):
    global Game_display

    if font is None:
        font = get_current_font()

    if color is None:
        color = Color.Black

    Game_display.blit(font.render(text, True, color), locn)



Then you can just write:

  futura = pygame.font.Font(Fonts_path / 'Futura.ttf', font_size)
  # NB: Might have to use str() if pygame.font doesn't support pathlib

  show_text((500, 111), 'An RPG', font=futura)



In your collision-detection code, you have repeated code. I'd suggest that you write a function to handle updating your rectangle position:

future = copy(player)
move_rect(future)
future.refresh_rect()

Furthermore, you are concatenating two lists and then discarding the result, when all you really need to do is check the lists separately:

if pillar_hits or wall_hits:
    pass
else:  # No hits

Finally, you might consider just keeping the future-player variable, which is a copy() of player, when you accept the move:

else:  # No hits
    player = future