Last active
April 4, 2020 22:50
-
-
Save davesade/4c6a73472a9e6ddd9e58ddaf451d25c7 to your computer and use it in GitHub Desktop.
There were too many recommendations for GM older versions, how to set a camera and proper scaling of pixelart, so I decided to translate it into GMS2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// CREATE EVENT | |
/// @description Set camera | |
global.debug = true | |
// Scaling based on: https://www.youtube.com/watch?v=wv3R2Q536ZU | |
ideal_width = 0; //Doesn't matter because we are going to calculate this. | |
ideal_height = 256; | |
zoom = 3; | |
max_zoom = 1; | |
view_zoom = 5 | |
view_max_zoom = 10 | |
//Aspect ratio | |
aspect_ratio = display_get_width() / display_get_height(); | |
aspect_ratio = clamp(aspect_ratio, 16 / 9, 21 / 9) | |
//Calculate new ideal width and height. | |
ideal_width = round(ideal_height * aspect_ratio); | |
ideal_height =round(ideal_width/aspect_ratio); | |
// Enable perfect pixel scaling | |
if(display_get_width() mod ideal_width != 0){ | |
var d = round(display_get_width() / ideal_width) | |
ideal_width = display_get_width() / d | |
} | |
if(display_get_height() mod ideal_height != 0){ | |
var d = round(display_get_height() / ideal_height) | |
ideal_height = display_get_height() / d | |
} | |
ideal_width = round(ideal_width); | |
ideal_height = round(ideal_height); | |
//Check to make sure our ideal width and height isn't an odd number, as that's usually not good. | |
if (ideal_width & 1) | |
ideal_width++; | |
if (ideal_height & 1) | |
ideal_height++; | |
max_zoom = floor(display_get_width() / ideal_width) | |
// Resize surface, GUI and game window base on newly calculated values | |
surface_resize(application_surface,ideal_width,ideal_height); | |
display_set_gui_size(ideal_width,ideal_height); | |
window_set_size(ideal_width*zoom,ideal_height*zoom); | |
// Create camera - permanent object, accessible from global | |
globalvar CAMERA; | |
CAMERA = camera_create(); | |
camera_set_view_size(CAMERA,ideal_width,ideal_height) | |
// Center window | |
alarm[0] = 1 | |
// STEP EVENT | |
/// @description Follows player object, zooming | |
if (keyboard_check_pressed(ord("Z"))) { | |
zoom++ | |
if (zoom > max_zoom) zoom = 1 | |
window_set_size(ideal_width * zoom, ideal_height * zoom) | |
surface_resize(application_surface, ideal_width * zoom, ideal_height * zoom) | |
alarm[0]=1 | |
} | |
var zoom_speed = 0.1 | |
if (keyboard_check(vk_up)) view_zoom += zoom_speed | |
if (keyboard_check(vk_down)) view_zoom -= zoom_speed | |
view_zoom = clamp(view_zoom, 1, view_max_zoom) | |
// View zoom only resizes certain elements of the screen, not whole screen... weird | |
surface_resize(application_surface, ideal_width * view_zoom, ideal_height * view_zoom); | |
if instance_exists(obj_parent_player) { | |
var behindX = obj_parent_player.x - ideal_width / 2 | |
var behindY = obj_parent_player.y - ideal_height / 2 | |
camera_set_view_pos(CAMERA, behindX, behindY) | |
} | |
// Reset the game | |
var resetKey | |
resetKey = keyboard_check_pressed(ord("R")); | |
if (resetKey) { | |
game_restart(); | |
} | |
// Room start - very important! | |
/// @description Enable viewport | |
view_set_camera(0, CAMERA) | |
view_enabled = true | |
view_visible[0] = true | |
// ALARM 0 | |
window_center() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment