Haha, I wrote a whole huge post and then accidently refreshed the screen...anyway, in Los Mineros I have a function like this:
function MoveLevel(x as float,y as float)
for g=1 to NoFloors
TempNo=Floors1(g)
b2PositionBody TempNo,b2GetBodyX(TempNo)+x,b2GetBodyY(TempNo)+y
next g
for g=1 to Array Count(RopeSegments(0))
TempNo=RopeSegments(g)
b2PositionBody TempNo,b2GetBodyX(TempNo)+x,b2GetBodyY(TempNo)+y
next g
b2PositionBody MainChar,b2GetBodyX(MainChar)+x,b2GetBodyY(MainChar)+y
endfunction
You'll notice that this is for Box2D, but you get the idea. I just call this function whenever the player gets too far from the center of the screen and everything moves onward.
One advantage of doing this is that the character does not have to be "locked" to the screen. If you call the function something like this, you can allow the character a small range of motion without the screen moving, and the screen will glide after the player rather than snapping to them:
MainCharXPos#=b2GetBodyX(MainChar)
MainCharYPos#=b2GetBodyY(MainChar)
if MainCharXPos#<screen width()/2-30 or MainCharXPos#>screen width()/2+30
MoveLevel((screen width()/2-MainCharXPos#)/20,0)
endif
if MainCharYPos#<screen height()/2-30 or MainCharYPos#>screen height()/2+30
MoveLevel(0,(screen height()/2-MainCharYPos#)/80)
endif
return