Ok, my game is made up of 16px x 16px tiles. That's small, but that's okay. Everything is a 16x16 px image.
For my rooms, I have viewports and cameras.
The camera has a width of 304px and height of 240px. So at any given time I'm seeing a 19 x 15 tile screen (304/16 x 240/16).
However, I want my GUI to be to the right of the action, thusly:
That screen is showing all 19x15 tiles, but a bunch of them are covered up by the blue area (a large sprite), limiting the player's actual view to a 9x11 field. The way I get my camera to center there is to do this in the obj_player's End Step:
camera_set_view_pos(view_camera[0], x-80, y-96);
This sets the position of the camera (I believe the top left corner of it) to 80px left of the obj_player (x-80) and 96px above it (y-96). Note that in the room setup I am *not* having the camera follow obj_player. I'm doing that manually with the above command. Since 80/16 = 5 and 96/16 = 6, this places it 5 squares to the left of the player and 6 squares above.
The final piece is setting my view size. My camera view is 304px x 240px, which is teensy tiny. So my view size is 912px x 720px. The view stretches the camera, and 912 = 304 * 3, 720 = 240 * 3, so this view size "blows up" the camera by 3, giving me a decent final size. I don't mind that this means everything is heavily pixelated; that's an intended retro effect.
For the blue field, I created a 912 x 720 image and deleted holes in it (one for the actual game view and one for the message box at the bottom left.) An object called obj_gui does this in its Draw GUI event:
GML:
// text box
draw_set_color(c_black);
draw_rectangle(11, 566, 468, 704, false);
draw_set_font(fnt_playerFont);
draw_set_color(c_white);
draw_text_ext(30, 584, global.feedText, -1, 440);
// mask
draw_sprite(spr_gui_mask,1,0,0);
//Stats
draw_set_color(c_black);
draw_roundrect(475, 15, 684, 45, false)
draw_set_color(c_white);
draw_text(483, 19, "Hit Points: "+string(obj_player.hitPoints)
Draw GUI draws directly to the screen, so it's drawing elements at my final 912 x 720 size. It also draws in order, so things it draws later will be on top of things it drew earlier. So first it draws the text box. Then it draws the blue mask sprite over it. The mask extends slightly over the text box, so if text scrolls funny it won't be seen. And finally on top of the blue mask it draws the hit points stat.
The end result is the player is offset, the camera follows it manually, and I have a big clean area where I can draw in my stats and other things.