hola.
¿existe alguna variable que impida al jugador salirse de la pantalla, en lugar de hacer bloques solidos para hacer el recuadro de las rooms?

Si, debes verificar su posicion, por ejemplo:

Verifica si el personaje está en una posicion mayor a 0.
[GML]
if (x > 0) // si el personaje no se sale del limite izquierdo de la pantalla
{
   x-=1; // mueve a la izquierda
}
[/GML]
Luego la condición de arriba puede adaptarse para el limite derecho con:
[GML]
if (x < room_width) // si el personaje no se sale del limite derecho de la pantalla
{
   x +=1; // mueve a la derecha
}
[/GML]

Saludos!

ese codigo lo he puesto en step y no va bien, supongo que sera x=-1 y no x-=1... en fin, yo me entiendo mejor con acciones que con codigo, a ver si encuentro la forma de jugar con room_width, ya que se deduce que tb habra una room_height. saludos y sigo con la duda... si pudieras ser mas especifico para un pobre torpe...

en si el codigo de silver_light estaba bien, pero te lo adapto de otra manera, pon esto en el end_step

[gml]
if (x < 0 || x > room_width) x = xprevious;
if (y < 0 || y > room_height) y = yprevious;
[/gml]

ahora bien esto solo funciona si no estas usando views para cuyo caso sería

[gml]
if (x < view_xview[0] || x > view_xview[0]+view_wview[0]) x = xprevious;
if (y < view_yview[0] || y > view_yview[0]+view_hview[0]) y = yprevious;
[/gml]

Espero que te sirva, saludos

Checa mi canal de Youtube para tutoriales y charlas sobre desarrollo de videojuegos.


No, no.
No va en Step, sino en el evento de la tecla que hace de dirección, ya sea para la izquierda o para la derecha.

Y si, es x-=1, y x+=1 respectivamente puesto que se suman al valor anterior, no lo establece, como lo haría x = -1

Los códigos de hace rato pueden traducirse así con acciones:





EDIT: dejo mi respuesta, de todas formas a ver, si te sirve :P

#5 Abril 09, 2013, 04:50:28 AM Ultima modificación: Abril 09, 2013, 04:52:40 AM por Wadk
Yo recomendaría lo siguiente:
[gml]x = max(0, min(room_width, x));
y = max(0, min(room_height, y));[/gml]
Al final de step, o en end step.

Usar -1 y +1 no es una buena idea, porque si el personaje se mueve a más de un pixel por step, el código disminuiría su velocidad al llegar al borde, pero no impediría que siga moviéndose.
xprevious y yprevious son más efectivos pero tienen un pequeño problema. Consideremos un caso en el que el jugador se mueve a 5 pixeles por step, y se encuentra a 4 pixeles del borde. Al moverse contra el borde, si el código usa xprevious y yprevious, lo devuelve a la posición anterior, a 4 pixeles del borde otra vez. El resultado final es que el personaje solo puede acercarse a cierta distancia al borde (que incluso puede ir variando de manera aparentemente aleatoria).
El código que puse arriba no tiene ninguno de esos problemas (y es un poco más rápido, creo yo).

EDIT: Otra alternativa escribir un código que coloque bloques alrededor del room automáticamente. Eso debería funcionar bien.
Vim.

gracias a todos , al final lo he solucionado con el de wadk . se come medio muñeco, no se queda justo justo al borde,  pero eso ya lo resuelvo yo trasteando, saludos

Disculpame, no puedo dejar mi respuesta a medias :P.

Para evitar que se salga parte del sprite, podés probar con este código en lugar del código anterior:
[gml]x = max(sprite_get_bbox_left(sprite_index), min(room_width - sprite_width + sprite_get_bbox_right(sprite_index), x));
y = max(sprite_get_bbox_top(sprite_index), min(room_height - sprite_height + sprite_get_bbox_bottom(sprite_index), y));[/gml]

El problema acá es que si el sprite cambia a otro de distinto tamaño, el personaje podría moverse de forma no deseada cerca de los bordes (siempre intentando evitar que parte del sprite se salga de la room). Para remediarlo podés ponerle una mask al objeto (si es que no tiene una ya) y usar este código en su lugar:
[gml]x = max(sprite_get_bbox_left(mask_index), min(room_width - sprite_get_width(mask_index) + sprite_get_bbox_right(mask_index), x));
y = max(sprite_get_bbox_top(mask_index), min(room_height - sprite_get_height(mask_index) + sprite_get_bbox_bottom(mask_index), y));[/gml]
Solo tené cuidado con cambiar la mask durante el juego.
Vim.

perfecto ahora me queda mas claro, muchas gracias