Hola de nuevo! pues estaba trabajando en unos checkpoints para mi juego pero me resultaron algunos problemas, el checkpoint no funciona cuando el jugador se sale del room, creo que algo esta mal en la tutorial por eso quisiera que alguien me explicara como hacer un checkpoint que funcione incluso cuando el jugador se va del room. Muchas gracias  :D

#1 Enero 12, 2013, 12:50:18 AM Ultima modificación: Enero 12, 2013, 05:22:00 PM por Creador de juegos GM
hola.deverias mandar editable para mostrarnos de que hablas,se hacer checkpoints pero me gusta decirle
a la gente como funciona y en que se equivocó.
ademas no dijiste como hiciste el checkpoint. te recomiendo ver unas cosas al estilo guardar como en descargas
no creo que aya hecho mal ya que el ejemplo en descargas no dise que sea checpoint,solo dice como guardar algo pero podrias  hacer que cuando pase la partida guarde eso con un nombre en la carpeta del videojuego yluego cuando pierda lo abra,pero recomiendo que si haces de un solo nivel el juego sea asi: (haya varios objetos de checpoint llamados checkpoin1 checkpoin2 y checkpoin3
y entonces alla tres variables: checkpoin1=false checkpoin2=false y checpoin3=false
y pon que si el jugador colisiona a checpoin1(el objeto) checpoin1=true
si el jugador colisiona con checpoin2(el objeto) checpoin2=true
si el jugador colisiona con checpoin3(el objeto) checpoin3=true
if checpoin1=true &vidas=0 sehaceloquequieras
ifchecpoin2=true&vidas=0 se haceloquetuquieras
if checpoin3=true&vidas=0 sehaceloquetuquieras
if checpoin2=true checpoin1=false
if checpoin3=true checpoin2=false;) espero que te haya servido
si te fui de ayuda no dudes en tirar un puntito en un tema mio. ;)
CREADOR DE JUEGOS GM.


- Como hacer preguntas inteligentes
- Reglamento General

HOLA COMUNIDAD,HOLA A TODOS




uso game maker 8 pro 8) y game maker studio Master Collection

#2 Enero 12, 2013, 03:23:34 AM Ultima modificación: Enero 12, 2013, 07:22:04 PM por calio
EDIT: Se me pasó por alto un caso xD lo acabo de arreglar en el código :)

Como mencionan anteriormente, es mucho más fácil proponer una solución cuando tienes el problema en frente. Ahora vamos a tener que trabajar con suposiciones :p

Vamos a ir al evento Create de éste objeto y vamos a definir un par de variables nuevas

checkpoint_x = -1;
checkpoint_y = -1;
checkpoint_room = -1;
dead = false;

Estas van a ser las variables que nos van a ayudar a devolver al personaje al lugar adecuado. Añado además una variable que defina si nuestro personaje está o no muerto.

Ahora vamos a nuestro objeto de checkpoint, al que llamaremos convenientemente obj_checkpoint.
Vamos a definir una variable en el evento Create del checkpoint:

active = false;


Ahora vamos a hacer un evento de colisión entre el objeto de jugador y obj_checkpoint, para eso vamos nuevamente al objeto del jugador y agregamos un evento de colisión con obj_checkpoint y en éste escribimos el siguiente código:

if (other.active == false)
{
with (obj_checkpoint) { active = false; }
checkpoint_x = other.x;
checkpoint_y = other.y;
checkpoint_room = room;
other.active = true;
}


y ahora, vamos al evento Step del objeto del actor que controla el jugador y escribimos el siguiente código:

if (dead == true)
{
if (checkpoint_room == room)
{
x = checkpoint_x;
y = checkpoint_y;
}
else
{
room_goto(checkpoint_room);
//este código asume que tu objeto de personaje no es persistente, por lo que crea una instancia nueva del objeto de jugador en lugar de sólo cambiarla de room.
instance_create(checkpoint_x,checkpoint_y,obj_player);
}
dead = false;
}
else
{
//todo el código de movimiento y control del personaje mientras está vivo
}


Con éste código el personaje debería volver inmediatamente al último checkpoint cada vez que la variable dead sea verdadera.

Como adendo, me gustaría aclarar que sería preferible si tu personaje es un objeto persistente, así te evitas tener que crear y destruir instancias cada vez que cambies de room. De todos modos, también puedes trabajar con un objeto de personaje que no sea persistente y dejar que los datos queden guardados en un objeto de control que sí sea persistente (el objeto que ocupas para dibujar el hud del juego en pantalla, por ejemplo) o incluso que al cambiar de room el objeto anterior del personaje cree una instancia nuevo de personaje y manualmente le traspase cada una de las variables a la instancia nueva.
Para hacer esto puedes hacerlo de la siguiente forma:

var player;
player = instance_create(checkpoint_x,checkpoint_y,obj_player);
player.checkpoint_x = checkpoint_x;
player.checkpoint_y = checkpoint_y;
//etc etc etc


Espero esto te ayude :)

Cita de: calio en Enero 12, 2013, 03:23:34 AM
Como mencionan anteriormente, es mucho más fácil proponer una solución cuando tienes el problema en frente. Ahora vamos a tener que trabajar con suposiciones :p

Vamos a ir al evento Create de éste objeto y vamos a definir un par de variables nuevas

checkpoint_x = -1;
checkpoint_y = -1;
dead = false;

Estas van a ser las variables que nos van a ayudar a devolver al personaje al lugar adecuado. Añado además una variable que defina si nuestro personaje está o no muerto.

Ahora vamos a nuestro objeto de checkpoint, al que llamaremos convenientemente obj_checkpoint.
Vamos a definir una variable en el evento Create del checkpoint:

active = false;


Ahora vamos a hacer un evento de colisión entre el objeto de jugador y obj_checkpoint, para eso vamos nuevamente al objeto del jugador y agregamos un evento de colisión con obj_checkpoint y en éste escribimos el siguiente código:

if (other.active == false)
{
with (obj_checkpoint) { active = false; }
checkpoint_x = other.x;
checkpoint_y = other.y;
other.active = true;
}


y ahora, vamos al evento Step del objeto del actor que controla el jugador y escribimos el siguiente código:

if (dead == true)
{
x = checkpoint_x;
y = checkpoint_y;
dead = false;
}
else
{
//todo el código de movimiento y control del personaje mientras está vivo
}


Con éste código el personaje debería volver inmediatamente al último checkpoint cada vez que la variable dead sea verdadera.

Espero esto te ayude :)
pero seria mas facil como digo y esto:
if checpoin2=true checpoin1=false
if checpoin3=true checpoin2=false
CREADOR DE JUEGOS GM.


- Como hacer preguntas inteligentes
- Reglamento General

HOLA COMUNIDAD,HOLA A TODOS




uso game maker 8 pro 8) y game maker studio Master Collection

Cita de: Creador de juegos GM en Enero 12, 2013, 05:21:34 PM
pero seria mas facil como digo y esto:
if checpoin2=true checpoin1=false
if checpoin3=true checpoin2=false
No lo creo... El método de calio lo podés programar una vez y después olvidarte. Simplmente posicionás las instancias del obj_checkpoint donde las quieras en el room y listo. Sin modificar el código, funciona para cualquier cantidad de checkpoints colocados de cualquier forma y en cualquier room.

Aunque también se podría hacer de forma más eficiente y con menos variables. El obj_checkpoint alcanza con que tenga un sprite con el que se pueda colisionar, y nada más. el objeto personaje debe tener la siguiente variable:
[gml]checkpoint = noone;[/gml]
También el siguiente código en el evento de colisión con obj_checkpoint:
[gml]checkpoint = other.id;[/gml]
Y el siguiente código que se ejecute cuando muera:
[gml]if (checkpoint == noone) {
    x = xstart;
    y = ystart;
} else {
    x = checkpoint.x;
    y = checkpoint.y;
}[/gml]
Vim.

#5 Enero 13, 2013, 01:23:41 AM Ultima modificación: Enero 13, 2013, 02:16:19 AM por calio
Cita de: Wadk en Enero 13, 2013, 12:59:27 AM
Cita de: Creador de juegos GM en Enero 12, 2013, 05:21:34 PM
pero seria mas facil como digo y esto:
if checpoin2=true checpoin1=false
if checpoin3=true checpoin2=false
No lo creo... El método de calio lo podés programar una vez y después olvidarte. Simplmente posicionás las instancias del obj_checkpoint donde las quieras en el room y listo. Sin modificar el código, funciona para cualquier cantidad de checkpoints colocados de cualquier forma y en cualquier room.

Aunque también se podría hacer de forma más eficiente y con menos variables. El obj_checkpoint alcanza con que tenga un sprite con el que se pueda colisionar, y nada más. el objeto personaje debe tener la siguiente variable:
[gml]checkpoint = noone;[/gml]
También el siguiente código en el evento de colisión con obj_checkpoint:
[gml]checkpoint = other.id;[/gml]
Y el siguiente código que se ejecute cuando muera:
[gml]if (checkpoint == noone) {
    x = xstart;
    y = ystart;
} else {
    x = checkpoint.x;
    y = checkpoint.y;
}[/gml]

Heh :D esa es una buena solución también, mucho más elegante y sencilla de entender a simple vista, pero por lo que le entendí a nano06, el principal problema viene "cuando el jugador se sale del room", lo que entiendo como que cuando el jugador está en otra room, no tiene cómo volver al checkpoint anterior, porque la instancia sencillamente ya no existe.

Por cierto, me acabo de dar cuenta que la variable active en mi solución es completamente inutil xD aunque puede servir estética y funcionalmente para indicar cuando un checkpoint está activado, añadiendo algo así como

if (active == true)
{
//acá va el gráfico de cuando el checkpoint está activo
sprite_index = spr_ungrafico;
}
else
{
//acá va el gráfico que tiene por defecto, o lo que es lo mismo, cuando está desactivado
sprite_index = spr_otrografico;
}

//Si quieres implementar otros estados para un checkpoint además de encendido apagado (bloqueado, destruido, qué se yo...) te recomendaría hacerlo con un switch en lugar de un if/else


...pero ahí surge otro problema: cuando entras en una room, todos los checkpoints están desactivados. Dado que la forma de volver al último checkpoint se realiza exclusivamente en la instancia de jugador, esto no supone ningún problema fuera de uno estético. De todos modos, el siguiente código reemplazando el código del evento Create en obj_checkpoint debería solucionar el problema :D

active = false;
if (instance_exists(obj_player) == true)
{
//Doble condicional para que no arroje un error si es que no existe una instancia de obj_player
if (obj_player.checkpoint_room == room)
{
(instance_place(obj_player.checkpoint_x,obj_player.checkpoint_y,obj_checkpoint)).active = true;
}
}

Cita de: calio en Enero 13, 2013, 01:23:41 AMHeh :D esa es una buena solución también, mucho más elegante y sencilla de entender a simple vista, pero por lo que le entendí a nano06, el principal problema viene "cuando el jugador se sale del room", lo que entiendo como que cuando el jugador está en otra room, no tiene cómo volver al checkpoint anterior, porque la instancia sencillamente ya no existe.
Vaya, sinceramente no leí el post inicial. Mal yo.

Por cierto, ¿por qué usás un switch para comprobar si una variable es verdadera? ¿por qué no un if?
Vim.

Cita de: Wadk en Enero 13, 2013, 01:56:22 AM
¿por qué usás un switch para comprobar si una variable es verdadera? ¿por qué no un if?

Mera comodidad :p en realidad no tiene mucho sentido ahora que reviso mi código xD
Lo voy a cambiar para hacer más sencillo de leer :B

Yo hago hasta dos checkpoint en mis juegos usando este simple sistema.
Event create del jugador
checkpoint1=false; //declaro la variable checkpoint1
checkpoint2=false; //declaro la variable checkpoint2

Event de cuando algo le sucede al jugador un ejemplo de cuando cae en un juego de plataformas cae en un hueco.
Event step
if Y > room_heght then
{
if checkpoint1 and !checkpoint2 then
{
x=objCheckpoint1.x y=objCheckpoint1.y;
}
else
if checkpoint2 then
{
x=objCheckpoint2.x y=objCheckpoint2.y;
}
else
{
x=xstart y=ystart;
}
/* como adivinaras uso dos instancias de los objects objCheckpoint1 y el objCheckpoint2 los cuales
son visibles mientras estas variables sean false, al momento de colicionar con alguno de estos 2 checkpoint
se vuelven visible=false y pasan las variables checkpoint1 y checkpoint2 a true, no las dos al mismo tiempo
solo la que corresponde a esa instancia de checkpoint */

 ya esta arreglado cambie unos valores de la variable y agregue otras gracias me ayudaron