Creador:
Yo, Mgbu
Versión de GM utilizada:
:GM8: GM8, se deberia poder usar en la mayoria de las versiones con pequeñas modificaciones
Descripción:
Es una pregunta bastante común, ¿Como hacer dos object_follow en una sola view?
El resultado sería algo así como la cámara de Super Smash Bros, que siempre muestra a todos los jugadores son importar lo separados que están, y si los personajes están juntos se hace zoom para no desperdiciar pantalla. Este script soporta a dos objetos, si necesitas mas puedes modificarlo. No es un script muy complejo
Código:
actualizarView(borde_h, borde_v, prop_h, prop_v, min_h, min_v, obj0, obj1);
EDIT: gusfavio me dio el consejo de añadir una fricción a la camara. Para no hacer demasiados argumentos es mejor poner todo en un objeto:
CREATE:
[gml]
//************//
// ARGUMENTOS //
//************//
//Bordes: Distancia del objeto al borde de la pantalla
borde_h = 100 //Borde horizontal
borde_v = 100 //Borde vertical
//Proporciones: Relacion de aspecto de la view, por ejemplo las pantallas de PC son 3:2,
// las pantallas anchas 16:9, etc. Se puede obtener dividiendo el ancho por
// el alto del puerto
prop_h = 3 //Numero antes de los dos puntos (horizontal)
prop_v = 2 //Numero despues de los dos puntos (vertical)
//Minimo del tamaño de pantalla: Porque si se acercan mucho los jugadores se
// podría ver con mucho zoom, deberia seguir la relacion de aspecto
min_h = 300
min_v = 200
//Objetos a seguir
obj0 = obj_0
obj1 = obj_1
// Velocidad de la cámara
// En porcentaje, 0.5 = 50%, 0.25 = 25%, etc. Valores mayores a 0 y menores a 1 para no hacer lio (salvo que seas Chuck Norris, claro)
vel_mov = 0.1 // Porcentaje de distancia a la que se mueve la camara en cada step (si se pone 1 siempre va a moverse a
// la posición ideal instantaneamente, si se pone 0.5 sólo se mueve la mited de lo que debería)
vel_zoom = 0.1 // Porcentaje de tamaño que se modifica por step (pasa lo mismo que con el anterior)
[/gml]
STEP:
[gml]
//************//
// CODIGO //
//************//
// -----------------OBTENER POSICION OPTIMA------------------
// Es decir la posición donde debería ir la cámara
//Saber la altura y anchura de la view
optimo_ancho = abs(obj0.x-obj1.x) + borde_h //El ancho de la view es la distancia horizontal entre los jugadores mas el borde
optimo_alto = abs(obj0.y-obj1.y) + borde_v //El alto de la view es la distancia vertical entre los jugadores mas el borde
if optimo_ancho<min_h optimo_ancho=min_h //Si el ancho de la view es muy poco limitarlo al minimo
if optimo_alto<min_v optimo_alto=min_v //Si el alto de la view es muy poco limitarlo al minimo
//Hacer las proporciones
if optimo_ancho*prop_v > optimo_alto*prop_h { //Si el ancho es mayor que lo que deberia
optimo_alto = optimo_ancho / (prop_h/prop_v) //Hacer el alto como corresponde
}
else { //Si en cambio el alto es mayor que lo que deberia
optimo_ancho = optimo_alto * (prop_h/prop_v) //Hacer el ancho como corresponde
}
//Mover la camara
optimo_x = (obj0.x+obj1.x)/2 - (optimo_ancho/2) //La coordenada horizontal es igual al promedio de la posicion de los
//jugadores, es decir justo al medio. Luego se le resta la mitad del
//ancho porque la coordenada correponde a la esquina superior izquierda
optimo_y = (obj0.y+obj1.y)/2 - (optimo_alto/2) //La coordenada vertical es igual al promedio de la posicion de los
//jugadores, es decir justo al medio. Luego se le resta la mitad del
//alto porque la coordenada correponde a la esquina superior izquierda
// -----------------MOVER CAMARA------------------
// Mover la cámara respetando las velocidades
view_xview -= (view_xview - optimo_x)*vel_mov
view_yview -= (view_yview - optimo_y)*vel_mov
view_wview -= (view_wview - optimo_ancho)*vel_zoom
view_hview -= (view_hview - optimo_alto)*vel_zoom
[/gml]
Recuerda activar "Enable the use of views", "Visible when room starts"
Ejemplo de uso adjuntado
Moverse con WASD y flechas
ejemplo.gmk es la versión vieja, no incluye fricción pero contiene todo en un script
ejemplo avanzado.gmk tiene fricción y es lo mismo que está escrito arriba
Muy bueno! genial para combates !
al zoom de la pantalla no se le puede poner velovicidad y friccion por asi decirlo? para que el zoom no sea a la misma velocidad a la que se mueve el personaje, sino un poco mas lento, y bueno la friccion para agregarle un poco de suavidad al momento de llegar el borde de la pantalla hasta el personaje (cuando el personaje se acerca al otro, osea cuando la pantalla se va achicando)
Buena idea. Se puede. Se podría hacer algo así como guardar la posición "ideal" o final en variables. Y luego acercarse a ellas con la view
Modifiqué el tema