Create event:
view_enabled = true;
view_visible[0] = true;
camera = view_camera[0];
follow = noone;
cameraSmoothSpeed = 15;
//smooth camera stuff
cameraWidth = GAME_W;
cameraHeight = GAME_H;
surface_resize(application_surface, cameraWidth + 1, cameraHeight + 1);
application_surface_draw_enable(false);
viewWidthHalf = camera_get_view_width(camera) * 0.5;
viewHeightHalf = camera_get_view_height(camera) * 0.5;
xTo = xstart;
yTo = ystart;
//shake effect
shakeLength = 0;
shakeMagnitude = 0;
shakeRemain = 0;
//camera states
cameraState = -1;
Step event:
if (follow != noone)
{
xTo = follow.x;
yTo = follow.y;
}
//Update Object Position
x += (xTo - x) / cameraSmoothSpeed;
y += (yTo - y) / cameraSmoothSpeed;
//Keep camera center inside room
x = clamp(x, viewWidthHalf, room_width-viewWidthHalf);
y = clamp(y, viewHeightHalf, room_height-viewHeightHalf);
//Screenshake
x += random_range(-shakeRemain,shakeRemain);
y += random_range(-shakeRemain,shakeRemain);
shakeRemain = max(0, shakeRemain - ((1/shakeLength) * shakeMagnitude));
camera_set_view_pos(camera, floor(x - viewWidthHalf), floor(y - viewHeightHalf));
Post draw event:
gpu_set_blendenable(false);
var _scale = window_get_width() / cameraWidth;
draw_surface_ext(
application_surface,
0 - (frac(x) * _scale),
0 - (frac(y) * _scale),
_scale,
_scale,
0,
c_white,
1.0
);
gpu_set_blendenable(true);
Room start:
view_enabled = true;
view_visible[0] = true;
camera = view_camera[0];
if (instance_exists(oPlayer))
{
follow = oPlayer;
}
else
{
follow = noone;
}
x = follow.x;
y = follow.y;
// reset the view values so they don't default to half the room size
viewWidthHalf = camera_get_view_width(camera) * 0.5;
viewHeightHalf = camera_get_view_height(camera) * 0.5;