Hola a todos, tengo un problemilla, a ver si algún amable compañero me puede dar con la solución.

Como otras veces he comentado poco a poco voy aprendiendo cosas de este pedazo de programa que es GM. El caso es que ahora estoy viendo como se puede mover un personaje por un camino predefinido, la pantalla está formada por baldosas y el personaje puede andar por un determinado tipo de ellas (concretamente las blancas, que no están marcadas como sólidas), el caso es que a una determinada velocidad el personaje se mueve bien pero a una algo superior se queda atascado.

Os pongo un enlace  que contiene los dos ejemplos, uno a cada velocidad, si alguien sabe como hacer que el personaje no se quede atascado a mitad de camino se lo agradecería enormemente.

Nota: hay que clickear el personaje para que comienze a andar.

https://mega.co.nz/#!xkpVjarA!_tg-o7fY9yaj-P_nos8-mIFkSLlmpL4Wrm65IyYnV_g

Saludos.

#1 Marzo 20, 2014, 08:04:40 PM Ultima modificación: Marzo 20, 2014, 08:07:02 PM por DarkKRuleR
Tienes que programarte tú el movimiento. Usar el "start moving in direction"; o esas flechas rojas, no mola, es normal que se atasque :)

CREATE:
[gml]xVelo = 0; yVelo = 0;[/gml]

-Al iniciar el moverte a la derecha, pon xVelo = 5. A la izquierda, xVelo = -5. Arriba, yVelo = -5. Abajo, yVelo = 5. SÓLO UNA VEZ en cuanto inicias el movimiento.

STEP:
[gml]if (xVelo != 0) if (place_free(x+xVelo, y)) x += xVelo else xVelo = 0;
if (yVelo != 0) if (place_free(x, y+yVelo)) y += yVelo; else yVelo = 0;[/gml]

No lo he probado pero tiene buena pinta, prueba y nos dices qué tal :) la idea es que tú manejas tus propias variables de movimiento, y la clave es que SÓLO TE MUEVES HACIA CIERTO LUGAR si hay place_free en ese lugar. Si hay muro no te mueves (o quedarías atascado) y cancelas el movimiento.

IMPORTANTE: funciona para CUALQUIER velocidad, por alta que sea NUNCA se quedará atascado (aunque debe ser como mínimo 1 o -1 para evitar fallos, y mejor sin decimales, no sé qué podría pasar). PERO CON VELOCIDAD ALTA atravesarás muros. Si quieres evitar esto dímelo y te escribo rápidamente una mejora para evitarlo, que trata de usar bucles for (por ahora sin ellos es más fácil de entender :)  )

yo estoy intentando hacer algo parecido, pero invirtiendo, son los objetos del escenario los que se mueven a la derecha al empezar, y al chocarme con ellos el personaje los arrastra. Hay alguna variante similar a este código para que me sirva a mi? la velocidad a la que se mueven los objetos es 7, pero uso la opción de evento "create" y le pongo "start moving" a la izquierda a esa velocidad., pero uso el objeto suelo tambien como pared (por el tema de las esquinas, al haber plataformas). Podría modificar esto de alguna forma para que al chocar con mi personaje, lo mueva a la misma velocidad a la izquierda? o simplemente para que se lo lleve consigo?

especifico un poco más. mi personaje tiene 2 sprites (los he hecho objeto ambos, por lo que tengo 2 objetos, para que no salte indefinidamente) uno corriendo y otro saltando, si sigue corriendo sin saltar, arrastra la pared y se queda atascado, y si salta lo arrastra un poco y termina atascado igual

Bueno, lo principal es no moverse hacia una posición si hay algo sólido en ella, con el código que puse antes. Con eso te aseguras que nunca te atascarás. En tu caso, podrías hacer que, si no hay place_free, o sea, colisionas con un muro, pues según la situación muevas el muro.

Muchas gracias DarkKRuleR por tu ayuda, pero no entiendo esto que me comentas,

Cita de: DarkKRuleR en Marzo 20, 2014, 08:04:40 PM
-Al iniciar el moverte a la derecha, pon xVelo = 5. A la izquierda, xVelo = -5. Arriba, yVelo = -5. Abajo, yVelo = 5. SÓLO UNA VEZ en cuanto inicias el movimiento.

Quiero decir que no sé como transformarlo en código, ¿Podrías concretarlo un poco más, por favor?

Saludos.


Depende de tu código. Por ejemplo, evento de pulsar tecla derecha, ahí asignas xVelo = 5, y lo mismo para las demás teclas, solo una vez por pulsación. Luego en step el otro código, que hará que se mueva y evite colisiones

Hola, DarkKRuleR.

Gracias por tu ayuda pero no es eso lo que busco, yo no manejo el personaje, este debe de moverse por si sólo a través del camino de baldosas blancas, el personaje empieza parado y clickeando sobre él con el botón del ratón se pone en marcha y anda el solo a través del camino, no hay que manejarlo con teclas.

Muchas gracias por tu tiempo.

En ese caso, por ejemplo en el inicio, dices que al hacerle click se mueve hacia abajo (según vi). Entonces, al hacerle click, pones yVelo = 5 (que significa movimiento hacia abajo), y ya, el código de step se encargará de moverlo hacia abajo (debido a que yVelo es mayor que cero) y a frenarlo antes de atascarse con una pared. Lo mismo: yVelo = -5 para moverlo arriba, xVelo = 5 para la derecha y xVelo = -5 para la izquierda. Debes asignarlo UNA VEZ en el momento en que el personaje empieza a moverse, cambiando el 5 si quieres más velocidad :)

Hola de nuevo, siento mucho ser pesado Dark, pero he pasado el código que me has escrito a mi ejemplo y se atasca (no consigue girar la primera esquina).

Te dejo el enlace con el ejemplo adaptado a tu código a ver si de un vistazo puedes dar con el problema, no hay prisa, miralo cuando puedas ( si quieres hacerlo faltaría más  :-[ ) y si ves que tiene mucho jaleo déjalo estar, paso a otra cosa mariposa.

https://mega.co.nz/#!JlJAlQKJ!-6OjHu_UILaQrf9Et-xceRk-tBliUMSnfAG94lqu_7A

Saludos y gracias de nuevo.


Ahí va. Primero, he hecho el movimiento con bucles FOR. La idea es:

en vez de ver si tengo espacio libre en x+5, y moverme 5, hago:
veo si tengo espacio en x+1, me muevo +1, vuelvo a ver si tengo espacio en x+1, me muevo +1... y esto lo hago 5 veces.

Es lo mismo, pero chequea PIXEL A PIXEL. Con esto funciona para CUALQUIER VELOCIDAD (antes con velocidad alta podías saltar muros) y evitas el quedarte estancado. Antes, como las paredes eran estrechas, se estancaba. Con este método el personaje, al ir hacia abajo, se quedará TOTALMENTE PEGADO A LA PARED INFERIOR (al chequear pixel a pixel) así que entrará perfectamente en la pared derecha. De la forma anterior no entraba porque un píxel o dos quedaban fuera.

Te he montado un CONTADOR para que, cada vez que le hagas click, escoja la dirección correcta, aunque no le veo mucho sentido. Pero ahí verás cómo funciona y harás lo que tengas que hacer :)

http://www.mediafire.com/download/90givq2kteqcz4z/prueba_darkKruleR.gmk

Perfecto, muchísimas gracias DarkKRuleR por todo.  ;)