Julio 24, 2015, 07:07:00 PM Ultima modificación: Julio 25, 2015, 05:38:23 PM por DarkKRuleR
Buenash! Imagen. Izquierda el resultado, derecha el sprite real


(Fondo de Resident Evil 3, personaje de Ragnarok Online)

Podéis ver cómo, al hacer PANTALLA COMPLETA y hacer algo de zoom a la imagen, se destroza totalmente. He pensado este código para simular el "mantener escala en fullscreen" que tenía el GM8 y NO tiene el GMS:

/// Ajustes clave
view_wview[0] = display_get_width();
view_hview[0] = display_get_height();

view_wport[0] = display_get_width();
view_hport[0] = display_get_height();

view_xview[0] = obEli.x - display_get_width()/2;
view_yview[0] = obEli.y - display_get_height()/2;


Pero no sé por qué no funciona. La idea es coger un tamaño de view igual al monitor del jugador, ajustar el viewport igual, y poner al personaje en el centro. Con eso el jugador SIEMPRE, independientemente de la resolución de su monitor, al poner pantalla completa, debería verlo con calidad 100%, SIN ningún zoom, pero obviamente cogiendo y viendo a la vez mucho más room respecto a un jugador con una pantalla pequeña. Y si no me equivoco, si la room es menor al monitor o el jugador está en el borde, vería todo negro (fuera de room), cosa que no pasaba en GM8. Por qué no funciona? En su lugar lo veo como reducido, alejado... y cuadrado, cuando el background es 1024x768!

#1 Julio 24, 2015, 08:02:38 PM Ultima modificación: Julio 24, 2015, 08:06:44 PM por penumbra
A ver si entendí. Tu fondo es de 1024X768, es decir, un aspecto de 1.33

PERO al entrar al terreno android, es imposible pensar que cada uno de los dispositivos maneje ese aspecto. El código que usas adapta la vista y el puerto a las medidas del display actual, pero está ignorando cuál es el aspecto, que puede ser distinto a 1.33. Si quieres que la vista sea dapte, es decir, que se vea más o menos, entonces no puedes simplemente decir: "vista, adáptate al tamaño del display actual", porque como el aspecto varía, en ocasiones será necesario recortar más en la dimensión horizontal o más en la dimensión vertical, o dicho de otra manera, la vista a veces tiene que ser más "chata" y a veces tendrá que ser más alargada, y esto no se puede lograr "maximizando" la vista y el puerto, que es lo que hace el código.

#2 Julio 24, 2015, 08:09:38 PM Ultima modificación: Julio 24, 2015, 08:18:07 PM por DarkKRuleR
El juego será sólo para PC ^_^

No he etendido qué dices. Mi idea es, si yo le digo "el tamaño y el port de la view hazlos igual a la pantalla", debería darme igual la resolución de la room, del fondo y de todo. Yo quiero coger una parte para la view igual a la pantalla, para que se vea resolución 1:1 exacta, me da igual si tengo que recortar o si tengo que coger más o menos parte de la room, y ahí es dónde no veo por qué falla. O mi razonamiento está mal? D:

PD: incluso si fuera para android, si yo le dijera que la view y port tengan el tamaño de la pantalla del móvil, debería valer igual. Cogería un cacho de la room igual a la pantalla, siendo resolución 1:1. Dejando al lado el tema de HUD que podría ser un desastre y obviamente lo tendré en cuenta, debería poder funcionar para cualquier resolución, no? A lo mejor mi código está mal pero mi idea es esa, que la view coja exactamente toda la pantalla, para tener siempre 1:1

#3 Julio 24, 2015, 08:25:20 PM Ultima modificación: Julio 24, 2015, 08:27:56 PM por penumbra
Cita de: DarkKRuleR en Julio 24, 2015, 08:09:38 PM
No he etendido qué dices. Mi idea es, si yo le digo "el tamaño y el port de la view hazlos igual a la pantalla", debería darme igual la resolución de la room, del fondo y de todo.
¿Tienes un fondo que cambie sus medidas dinamicamente? Porque en el primer mensaje mencionaste que el fondo es de 1024X768. Si GM ajusta una vista/puerto a 1280X720, qué pasa con un fondo que no es de ese tamaño ni de ese aspecto? A mi me parece que esta discrepancia invariablemente va a causar deformación en la imagen, a pesar de que desactives la interpolación de color, etc.

La resolución será 1:1 pero sólo en las medidas de la vista/puerto, pero un  fondo de 1024X768 va a tener que estirarse horizontalmente con un valor distinto a 1:1 para poder ajustarse a un aspecto de 1.77 y no de 1.33

Cada fondo sería distinto, claro. Mi idea es, si el fondo fuera 1000x1000, y la pantalla 1280x720, pues a los laterales se vería negro, y la parte superior e inferior del fondo se cortaría. SI la pantalla fuera 800x600, pues cogería el centro del fondo y cortaría por TODOS los lados.

Olvida mi código, porque ya no lo entiendo. La idea es: yo quiero que el tamaño de la view (cuánto coge) sea igual al viewport e igual a la pantalla. Que si tengo una PANTALLA de 800x600, da igual cómo sea el room de grande, SIEMPRE coja 800x600 del room, y lo ponga en la pantalla. Quiero que coja el mismo tamaño de la pantalla en el room, y lo coloque en la pantalla, para que se coja con resolución 1:1, da igual si eso implica que haya que cortar unos lados o añadir fondo negro en otros. Ignora el tema del hud por ahora. Diferentes pantallas cogerían diferente trozo de la room (más o menos, cortando por un lado o por otro) pero SIEMPRE con resolución 1:1, sin deformaciones ni zooms. Qué fallaría en mi código, si realmente intenta hacer eso? Gracias :D

#5 Julio 24, 2015, 09:38:45 PM Ultima modificación: Julio 24, 2015, 09:57:34 PM por penumbra
Punto 1
Cita de: DarkKRuleR en Julio 24, 2015, 07:07:00 PM
Por qué no funciona? En su lugar lo veo como reducido, alejado... y cuadrado, cuando el background es 1024x768!
Para los fines que persigues, no es correcto ajustar la vista al mismo tamaño que el viewport. Esta es la causa de la deformación y lo he comprobado haciendo pruebas. Lo que mencioné en los mensajes anteriores resulta cierto: si el fondo tiene un aspecto distinto a las dimensiones del display actual, se introducen deformaciones, por eso lo ves alejado y cuadrado, porque la vista no debe coincidir con la medida del display, sino con la medida del fondo. En mi prueba, al cambiar la vista a las dimensiones del fondo, éste se dibuja sin deformación.

Seguro alguien podrá decir, y qué pasa si no quiero dibujar la vista al tamaño del fondo, bueno, pues de todas maneras habría que respetar el aspecto del fondo, pero para el asunto de este hilo, ya pasarían cosas distintas, como que el fondo se dobujaría o con zoom o con alejamiento.

Punto 2.
Cuando yo mencioné un fondo dinámico, no me refería a que si cada imagen que usas es distinta (distintos paisajes), sino a las dimensiones de los fondos. Si tus fondos siempre tienen la misma dimensión, no hay problema, pero si son dinámicos en su tamaño, entonces habría que reajustar el tamaño de la application_surface, ya que como menciona YoYo, el tamaño de la application surface se ajusta por defecto al tamaño de la primer habitación o vista.

Esto último no es importante a menos que los fondos cambien de tamaño y, por lo tanto de aspecto

#6 Julio 25, 2015, 05:02:13 PM Ultima modificación: Julio 25, 2015, 05:08:42 PM por DarkKRuleR
Cuando te refieres al tamaño del fondo, dices la room? En ese caso... cada room tendría un tamaño distinto.

Hm, pues ahora no lo entiendo, y creo que lo que tengo en mente no ha llegado. Voy a exponerlo con detalle, gracias por la atención

Imaginemos una room de 1000x1000. Dependiendo del tamaño de la pantalla del jugador (pantalla completa), mi idea es que NO IMPORTE EL TAMAÑO DE LA PANTALLA DEL JUGADOR (display_get_width etc), SIEMPRE funcione

Si es 1280x720, para mantener resolución 1:1, habría bordes negros a los lados (fuera de la room) de 140px y se cortaría arriba y abajo (720 de alto, pero la room tiene 1000), sobraría un total de 280, o sea, 140 arriba y 140 abajo estaría CORTADO.

Si la pantalla es 800x600, habría 100 píxeles a cada lado de negro y 200 arriba y 200 abajo en negro. Mantenemos la resolución 1:1 añadiendo bordes.

Si la pantalla es 1920x1080, la room 1000x1000 cabría entera. Habría un borde negro de 40 arriba y 40 abajo, y sobraría horizontalmente 920, o sea, 460 de borde negro a cada lado.

Si la pantalla es 455x123 funcionaría. Si es 1245x412 también. Da igual el tamaño, siempe puedo hacer un rectángulo de ese tamaño y coger un trozo de la room del mismo, aunque tenga que coger fondo negro.

La idea es que no importa el tamaño de la pantalla, siempre vea la room con resolución real, sin zoom in NI zoom out NI deformaciones, añadiendo bordes negros o cortando la room donde toque. Yo cojo el rectánculo que es LA PANTALLA, lo plasmo en la room, recorto ese trozo tal cual, y lo muestro, da igual si corto trozo de room o estoy cogiendo trozo negro fuera de la room, SIEMPRE puedo ver la pantalla 1:1 con cualquier monitor. Monitores grandes cogerían borde negro, y monitores pequeños recortarían room.

Es posible hacer eso? :D gracias

Creo que tu idea es correcta (y en eso discrepo con penumbra): si el tamaño de la view y el tamaño del port son iguales entonces no debe existir ningún tipo de escalamiento de la imagen. De hecho, cuando yo quiero crear efectos de zoom o deformación lo que hago es justamente hacer diferentes esos tamaños. Creo que tu error va por otro lado. Mencionaste que tus rooms no son todos iguales en dimensiones y eso es algo que debe ser evitado. Como dice penumbra, la application surface comienza siendo del tamaño de tu primer room (o view, si usas views) y luego no se ajusta automáticamente a los nuevos tamaños de tus rooms o views a menos que tú la cambies manualmente con surface_resize. Si es el caso, tienes que igualar el tamaño de la application surface con el tamaño de la view.


#8 Julio 25, 2015, 05:27:15 PM Ultima modificación: Julio 25, 2015, 05:37:34 PM por DarkKRuleR
Pero sólo tengo una room, no he hecho aún una segunda, y tengo el código que os puse (tamaño view = viewport), no debería ir bien? Aunque viene bien saber esto, para cuando haga más rooms y de distinto tamaño recordaré el cambiar con surface_resize.

Lo probaré ahora y si eso edito, pero teniendo sólo una room debería ir bien, no?

EDIT: ÉXITO!

/// Tamaño correcto para la vista
surface_resize(application_surface, display_get_width(), display_get_height());


Puse eso en ROOM_START, y FUNCIONA! Da igual si la room es pequeña o grande, y debería dar igual el tamaño de la pantalla, siempre coge con resolución 1:1, con bordes negros si hace falta. Creo que esto lo da por resuelto, que raro que hiciera falta aún con una sola room. Esto es justamente lo que ambos dijísteis al final (debo ajustar el tamaño de la app surface), así que perfecto

Y lo mejor es que no estoy obligado a hacer el fondo que sobra negro. Puedo poner tiles fuera de la room y funciona igual

#9 Julio 25, 2015, 05:36:24 PM Ultima modificación: Julio 25, 2015, 05:38:01 PM por Guacusio
Supongo que estás probando con tu propio display. Para facilitar el análisis de tu problema, ¿podrías indicar lo siguiente?

-Las dimensiones de tu display
-Las dimensiones del room
-Si ejecutas el juego en full screen y tienes activado keep aspect ratio en Global Game Settings

También podrías probar el no usar views y ver si en pantalla completa sigues teniendo el mismo grado de deformación.

EDIT: ¡vaya que rápido fuiste para probar! Me alegro que ahora te funcione.


Sep, gracias a los dos, la clave era ese display_resize, el tema está resuelto :D