It's probably not the best method, but here's how I do it. Player stats are stored in global variables. I have a save script and a set script So for example:
Code:
///scr_save_player_variables();
global.hp = hp;
global.level = level;
///scr_set_player_variables();
hp = global.hp;
level = global.level;
/////example use
///whatever creates the player object
with (instance_create_layer(x, y, layer, obj_player)) {
scr_set_player_variables();
}
///player destroy or code
scr_save_player_variables();
Depending upon how the rest of your project is set up, you'd have to change the above example to fit. Note that both scripts assume you are calling them from within the obj_player object. But it's easy to code around that if you aren't. Also note that this method requires you to be certain to save variables correctly.
Since I reference a lot of the player variables in the player object themselves, I think it is faster for my project to have duplicate variables one set of global and one set of instance variables. But if you don't have that many it may be easier to just have global variables or a persistent object that both holds and uses the variables directly, rather than as a method of saving between room changes.