Marzo 27, 2013, 08:05:32 PM Ultima modificación: Marzo 30, 2013, 12:33:01 AM por Klind
Epale gente!

Otra vez yo pidiendo ayuda  :-[

Esta vez no sé cómo explicar el problema, por lo que creé una demostración aparte del proyecto original para mostrarles lo que pasa.

Descarguen el ejemplo y muevan el personaje hacia una pared varias veces, es decir, que el personaje choque contra la pared, y luego hacen que vuelva a moverse en esa dirección para que siga chocando. Hasta que vean que el personaje queda viendo a una sola dirección (generalmente hacia arriba y a la izquierda) y queda ahí estancado. No se mueve más. ¿Cómo puedo solucionar eso y crear una mejor colisión?

La forma de moverse es darle click al personaje y soltar el botón donde queramos moverlo. Luego le dan a la tecla Espacio.

OJO: NO pueden soltar el mouse en una zona donde haya pared porque NO se creará la ruta. Simplemente le dan Click a la bolita, y sueltan el mouse en una zona verde pero de manera que la ruta atraviese una pared para que la bolita choque.

Gracias de antemano y disculpen la molestia, pasan y pasan los años y las colisiones en el Game Maker siguen siendo un dolor de cabeza para mí  :(
Solo intento crear ideas, en forma de obras de arte interactivas.

Aun no veo tu ejemplo, pero me imagino que tu problema es que el personaje se te queda atascado en la pared, cierto? O me equivoco. Bueno, yo lo solucionaba con INSTANCE_PLACE. Con ella verificaba si al poner mi objeto en una nueva coordenada, iba en ella colisionar con otra, entonces ponia un FOR con para probar coordenadas menores y encontrar el espacio libre. A ver, revisa esa funcion y me dices si algo asi te sirve.

Cita de: metalfox6383 en Marzo 27, 2013, 08:54:47 PM
Aun no veo tu ejemplo, pero me imagino que tu problema es que el personaje se te queda atascado en la pared, cierto? O me equivoco. Bueno, yo lo solucionaba con INSTANCE_PLACE. Con ella verificaba si al poner mi objeto en una nueva coordenada, iba en ella colisionar con otra, entonces ponia un FOR con para probar coordenadas menores y encontrar el espacio libre. A ver, revisa esa funcion y me dices si algo asi te sirve.

Conozco ese método, pero en mi caso no sé cómo usarlo ya que para mover a la bolita uso una coordenada (x,y) y un move_towards_point(x,y,speed) para que vaya dando steps hacia esa coordenada, entonces no sé cómo chequear con el instance_place la coordenada a la que voy a caminar, porque siempre es una dirección distinta.

Cuando puedas revisa el ejemplo a ver qué se te ocurre, ¡muchas gracias por responder!

¿Alguien más se anima a ayudar? Les aseguro que les va a gustar el juego cuando lo termine  ;D
Solo intento crear ideas, en forma de obras de arte interactivas.

Sigo sin poder resolver este problema, alguien que por favor me eche una manito. Me tiene frustrado no poder continuar el proyecto por este rollo de la colisión.
Solo intento crear ideas, en forma de obras de arte interactivas.

No puedo ver el ejemplo, pero algo simple que podrias hacer es usar un "move_outside_solid" en end step para salir de la colision en la que estabas metido.

No recuerdo bi[en pero creo que la funci'on de move_towards_point modificaba variables predefinidas como speed y direction para funcionar. As[i que es probable que poniendo este c[odigo en end step y borrando todo lo de mas que tenga que ver con colisiones funcione.
move_outside_solid(-direction, speed, false);.

Qué tal brunoxzx,

todo lo que me faltaba era ese "-direction" en el move_outside_solid"  :-[.

Lo que hice fue agregarle ese código que me dijiste al evento de colisión con la pared y me quedó así:

move_outside_solid(-direction, speed)
mover = false
ds_queue_clear(xCola)
ds_queue_clear(yCola)


¡Mil gracias hermano!

Saludos.
Solo intento crear ideas, en forma de obras de arte interactivas.

Probando el nuevo código de distintas maneras, me doy cuenta que ahora cuando el personaje está muy muy pegado de una pared (de manera que se detecta una colisión) y lo hago moverse hacia la dirección contraria a la pared, el personaje se "teletransporta", atraviesa toda la pared apareciendo del otro lado.

Sé por qué pasa eso, pero no sé cómo solucionarlo.

Si alguien puede descargar el ejemplito para que vea el modo de movimiento, se lo agradecería un montón. No pesa nada de verdad.
Solo intento crear ideas, en forma de obras de arte interactivas.

Primero que nada intentalo de este modo.
[gml]move_outside_solid(direction+180, speed).[/gml]

Se como lo har[ia de otro modo pero me da flojera escribirlo ahorita, ademas es mejor no cambiar tus codigos. intentar[e descargar el ejemplo aunque no lo podre ver por que estoy en linux, mientras comenta que tal te va usandolo as[i.

Intenté con eso y nada, sigue pasando lo mismo de que cuando está muy pegado a la pared y lo hago caminar en sentido contrario a la pared, en vez de moverse normal salta al otro lado de la pared.

Ok, voy a estar pendiente aquí.
Solo intento crear ideas, en forma de obras de arte interactivas.

OK como ultimo ultimo (ahora si ultimo) intento hazlo de este modo.
[gml]
if !place_free(x, y){
       move_outside_solid(direction+180, speed);
}[/gml]

asegurate de ponerlo en @end step@ y poner el move_towards en step.

#10 Marzo 29, 2013, 09:29:34 PM Ultima modificación: Marzo 29, 2013, 09:40:27 PM por Klind
Me sigue pasando lo mismo.

Y tiene sentido, porque supongamos que voy caminando de abajo hacia arriba, y la bolita pega contra la pared, entonces la hago moverse hacia abajo y la derecha, la dirección contraria es hacia arriba y a la izquierda entonces por eso atraviesa la pared y aparece del otro lado de la pared y en la dirección contraria a la que yo le dije que se moviera.

EDIT:

Es curioso porque SOLO pasa cuando el movimiento del personaje es en diagonal. Cuando lo tengo pegado a la pared y me muevo en linea recta hacia abajo se mueve perfecto.
Solo intento crear ideas, en forma de obras de arte interactivas.

#11 Marzo 29, 2013, 10:01:55 PM Ultima modificación: Marzo 29, 2013, 10:14:45 PM por brunoxzx
Cita de: Klind en Marzo 29, 2013, 09:29:34 PM
Es curioso porque SOLO pasa cuando el movimiento del personaje es en diagonal. Cuando lo tengo pegado a la pared y me muevo en linea recta hacia abajo se mueve perfecto.
Reviza que no tengas colisiones precisas activadas en tus sprites...

.
Bueno, para hacerlo a la antigua se har[ia as[i.
[gml]
var dx, dy;
dx=legthdir_x(1, point_direction(x,y, xx,yy));
dy=legthdir_y(1, point_direction(x,y, xx,yy));
repeat(vel){
    if !place_free(x+dx, y+dy) break;
    x+=dx:
    y+=dy;
}
[/gml]
Cambia tu movimiento por algo este, elimina el move towards y las cosas que tengan que ver con speed.
Edit: ups me faltaba un y+=dy en el c[odigo.

#12 Marzo 29, 2013, 10:27:00 PM Ultima modificación: Marzo 29, 2013, 10:43:03 PM por Klind
No me funciona, le puse varios valores a "vel" pero o no se mueve, o se mueve todo extraño, o se queda titilando el personaje, se duplica... O.o

Qué karma las colisiones en el Game Maker  :'(

EDIT:

¡ME FUNCIONO! Es que me había puesto a cambiar los "1" de los lengthdir por números más altos pensando que así iba a subir la velocidad (no me preguntes por qué pensé eso xD una laguna mental ahí jajaja).

Pero sí, ya funciona perfecto el movimiento y la colisión, lo único que tuve que modificar fue:

image_angle = point_direction(x,y,xx,yy)

Porque como lo tenía igual a direction y ahora no usa direction, la imagen no rotaba.

Muchas gracias otra vez, no había visto nunca ese código para movimiento, grande bruno  ;D
Solo intento crear ideas, en forma de obras de arte interactivas.

Que raro reviza que la speed sea 0 siempre 0 en el debug mode. Elimina todo lo que tenga que ver con ella. reviza que en las variables xx e yy sean a las que quieres ir, es decir las que estaban antes en el move_towards, fuera de eso no se me ocurre nada m[as.

No no, ya está listo hermano, lee el EDIT de mi post anterior. Tu código funcionó perfecto.
Solo intento crear ideas, en forma de obras de arte interactivas.