Bruno, el código funciona excelente, pero a veces se sigue quedando atascada la bola cuando, estando pegada a una pared, el ángulo en el que la muevo está muy cerrado pero no lo suficiente como para que su trayectoria sea casi paralela a la pared.

Te pongo una imagen para explicarme bien. (Ve la imagen por favor) Cuando estoy así de pegado a la pared y trato de moverlo en esa dirección o un poco más abajo, no se mueve. En cambio si le trazo una línea recta hacia la derecha sí se mueve (a veces).
Muy rara vez pasa que tengo que hacerle la línea casi completamente hacia abajo para que pueda moverse de ahí.
He probado tildando y destildando la Precise collision checking de la pared y de la bola pero nada que se acomoda.
Solo intento crear ideas, en forma de obras de arte interactivas.

Mmmm, es cierto se me paso pensar en eso  :P. Perdon  :-[.

[gml]
image_angle=point_direction(x,y, xx,yy);
var dx, dy;
dx=lengthdir_x(1, image_angle);
dy=lengthdir_y(1, image_angle);
repeat(vel){
    x+=place_free(x+dx, y);
    y+=place_free(x, y+dy);
}
[/gml]
Creo que asi funcionara  :-X.

Hermano revisa el código, el place_free(x,y) devuelve true o false, con ese código le estas sumando siempre 1 a la "x" y a la "y" del personaje, se va a mover siempre hacia abajo y la derecha xD
Solo intento crear ideas, en forma de obras de arte interactivas.

Ahh era así.
[gml]
image_angle=point_direction(x,y, xx,yy);
var dx, dy;
dx=lengthdir_x(1, image_angle);
dy=lengthdir_y(1, image_angle);
repeat(vel){
    x+=place_free(x+dx, y)*dx;
    y+=place_free(x, y+dy)*dy;
}
[/gml]

Con ese código se mueve bien el personaje, pero cuando toca la pared se queda todo trancado porque no tengo un condicional donde diga que:

if (el personaje llega a la pared) {mover = false; limpiar colas; destruir el punto al que uno llega;}

Entonces a éste último código le puse el condicional que usábamos en los códigos anteriores, quedando así:

image_angle = point_direction(x,y, xx,yy);
var dx, dy;
dx=lengthdir_x(1, image_angle);
dy=lengthdir_y(1, image_angle);
repeat(velocidad){
    x += place_free(x+dx, y)*dx;
    y += place_free(x, y+dy)*dy;
   
if !place_free(x+dx, y+dy)
{
    mover = false
    ds_queue_clear(xCola)
    ds_queue_clear(yCola)
    with (obj_point) {instance_destroy()}
    break;
}


Pero entonces sigue pasando lo mismo, por lo que creo que el problema está en ese condicional.
Solo intento crear ideas, en forma de obras de arte interactivas.

Bruno ¿sabes de qué me he dado cuenta? Que sea cual sea el código que usemos para movimiento, el problema de quedarse atascado el personaje NUNCA pasa cuando quito el image_angle = point_direction(x,y, xx,yy)
Solo intento crear ideas, en forma de obras de arte interactivas.

#21 Marzo 30, 2013, 07:52:43 PM Ultima modificación: Marzo 30, 2013, 07:54:37 PM por Maitreya
No he leído todo el post, pero en el ultimo código TODO debería estar dentro del condicional if(!place_free... porque primero te mueves y luego si verificas que el espacio este libre, por eso es que se atasca.
Y por cierto, evita hacer doble post, por ahí hay una opción de modificar asi como lo hiciste antes
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

#22 Marzo 30, 2013, 08:24:07 PM Ultima modificación: Marzo 30, 2013, 08:32:01 PM por Klind
Lo coloqué de este modo haciendo lo que dices de primero chequear y luego mover:
if mover = true
{
var dx, dy;
dx=lengthdir_x(1, point_direction(x,y, xx,yy));
dy=lengthdir_y(1, point_direction(x,y, xx,yy));

if !place_free(x+dx, y+dy)
{
    mover = false
    ds_queue_clear(xCola)
    ds_queue_clear(yCola)
    with (obj_point) {instance_destroy()}
}
else
{
repeat(velocidad)
    {
    x += place_free(x+dx, y)*dx;
    y += place_free(x, y+dy)*dy;
    }
image_angle = point_direction(x,y, xx,yy);
}


Pero sigue pasando lo mismo.

Estoy buscando la forma de que el personaje detenga el movimiento 1 o 2 píxeles antes de llegar a la pared, pero se hace difícil por la forma en la que se mueve el personaje.

EDIT:

El problema lo da el image_angle = point_direction(x,y, xx,yy). Al girar la imagen queda un píxel dentro de la pared o algo así.

Cierto, disculpa por el doble post. Es que ando ya desesperado.
Solo intento crear ideas, en forma de obras de arte interactivas.

¿Qué tipo de mascara usa el sprite?
Si es cuadrada cambiala por la mascara circular, o mira cual sirve mejor
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

Tiene máscara circular. Cada vez que le cambio algo al código, lo pruebo con las distintas máscaras (precisa, circular). Con rectangular ni hablar, el sprite es redondo por lo que no funciona esa máscara.

¿Con ese tipo de movimiento que uso hay alguna forma de saber la coordenada de cada step antes de darlo? En ese caso puedo usar instance_place para que el personaje nunca llegue a tocar la pared.
Solo intento crear ideas, en forma de obras de arte interactivas.


Cita de: Maitreya en Marzo 30, 2013, 07:52:43 PM
No he leído todo el post, pero en el ultimo código TODO debería estar dentro del condicional if(!place_free... porque primero te mueves y luego si verificas que el espacio este libre, por eso es que se atasca.
Y por cierto, evita hacer doble post, por ahí hay una opción de modificar asi como lo hiciste antes
Mmm podría tener el "place_free" antes pero no es realmente necesario, ademas el código verifica si el espacio está libre antes de moverse.

Cita de: Klind en Marzo 30, 2013, 09:33:56 PM
Tiene máscara circular. Cada vez que le cambio algo al código, lo pruebo con las distintas máscaras (precisa, circular). Con rectangular ni hablar, el sprite es redondo por lo que no funciona esa máscara.
Mmmm que raro, teóricamente no debería suceder, en todo caso una solución algo fea a eso es dejar de usar image_angle, creas una nueva variable llamada por ejemplo "angulo" y modificas esa en lugar de image_angle, entonces en el evento draw pones esto.
[gml]draw_sprite_ext(sprite_index, image_index, x, y, image_scale, image_yscale, angulo, image_alpha, image_blend);[/gml]


Cita de: Klind en Marzo 30, 2013, 09:33:56 PM
¿Con ese tipo de movimiento que uso hay alguna forma de saber la coordenada de cada step antes de darlo? En ese caso puedo usar instance_place para que el personaje nunca llegue a tocar la pared.
En teoría eso es lo que debería de hacer el código que puse. Que alguien me corrija si me equivoco.

Aunque pensándolo bien esta este código que tenia en un juego viejo con el mismo tipo de movimiento. No recuerdo de donde lo saque, pero en general la idea del código no es mala a pesar de no ser el más eficiente.

Solo ponlo en end step y sigue usando el move_towards sin usar algún otro código para las colisiones.
[gml]var xmot, ymot;
if place_meeting(x,y,muro){

    x = xprevious;y = yprevious

    for (i=0; i<90; i+=2){
        xmot=x+lengthdir_x(speed,direction+i)
        ymot=y+lengthdir_y(speed,direction+i)
        if place_free(xmot,ymot){
            x = xmot;
            y = ymot;
            exit
        }
        xmot=x+lengthdir_x(speed,direction-i)
        ymot=y+lengthdir_y(speed,direction-i)
        if place_free(xmot, ymot){
            x = xmot;
            y = ymot;
            exit
        }
    }
}[/gml]

Demasiado enredo jaja  XD...

Solucioné el problema de una forma un tanto "fea" y "pobre" pero a fin de cuentas está solucionado, puse esto en el evento press <Space> del personaje (que es la tecla que lo hace caminar por la ruta luego de que uno la traza:

if xx > x && place_free(x+1.5, y) {x += 1.5}
if xx < x && place_free(x-1.5, y) {x -= 1.5}
if yy > y && place_free(x, y+1.5) {y += 1.5}
if yy < y && place_free(x, y-1.5) {y -= 1.5}
mover = true


Eso lo desatasca de las paredes justo antes de mover la bolita. Igualmente espero en un futuro darle una solución decente a eso.

Una pregunta, ¿cómo haces que tu código se vea así grande y con los colores que identifican a las variables y funciones?
Solo intento crear ideas, en forma de obras de arte interactivas.

Cita de: Klind en Marzo 31, 2013, 06:52:46 PM
Demasiado enredo jaja  XD...

Solucioné el problema de una forma un tanto "fea" y "pobre" pero a fin de cuentas está solucionado, puse esto en el evento press <Space> del personaje (que es la tecla que lo hace caminar por la ruta luego de que uno la traza:

if xx > x && place_free(x+1.5, y) {x += 1.5}
if xx < x && place_free(x-1.5, y) {x -= 1.5}
if yy > y && place_free(x, y+1.5) {y += 1.5}
if yy < y && place_free(x, y-1.5) {y -= 1.5}
mover = true


Eso lo desatasca de las paredes justo antes de mover la bolita. Igualmente espero en un futuro darle una solución decente a eso.

Una pregunta, ¿cómo haces que tu código se vea así grande y con los colores que identifican a las variables y funciones?
Que mal que no te haya podido ayudar, me habira gustado hacerte un ejemplo pero aqui en linux no puedo, me siento como wadk  :-[.

Para hacer lo de los colores tienes que usar el tag de codigo gml, durante un tiempo habia un icono pero con las actualizaciones murio  ;D. Se usa as'i [gml]if wololo then transformar() end;[/gml].
[gml]if wololo then transformar() end;[/gml]

¿Cómo que no? Al contrario, ayudaste un montón.

Excelente, mucho mejor ese formato jajaja.

Gracias por todo bro!
Solo intento crear ideas, en forma de obras de arte interactivas.