Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: arcangelcaos en Enero 10, 2015, 03:55:26 PM

Título: Esperar a que termine un scrips
Publicado por: arcangelcaos en Enero 10, 2015, 03:55:26 PM
Hola, otra vez parado, voy avanzando, pero tengo mis dudas.
Yo estoy acostrumbrado un poco a VB, que tenia una función que era WAIT, que hacia que esperara a que terminara una función antes de seguir con la otra.
Aquí no se si eso existe, y si no, necesito crear algo parecido.
Yo tengo lo siguiente

criatura = argument0
movi = criatura.Mov
repeat (movi)
{
i=1
a= criatura.DistAtk

while (i <> (a+1))
{
    if not place_free((criatura.x+(96*i)),y)
    {
        obstaculo = collision_point( (criatura.x+(96*i)),y, objAmigo, false, false)
        if obstaculo = -1
        {
            obstaculo = collision_point( (criatura.x + (96*i)),y, objEnemigo, false, false)
            scrAtake(criatura,obstaculo)
            break;
        }
    i+=1
    break;
     }
    i+=1
  }
    with (criatura)
    {
        sprite_index = sprEspada2Mov
        mipath = path_add()
        path_add_point(mipath, x, y, 100)
        path_add_point(mipath, (x+96), y,100)
        path_set_closed (mipath, false)
        path_start (mipath, 10,0,true)
     }
         


Vale, esto es un scrips que es llamado desde otro.
Las criaturas tiene un alcance para el daño, y unos puntos de movimientos. Pues el primer movimiento por decirlo asi si lo hace bien.
Comprueba si hay enemigos enfrente, si no, luego en el 2 cuadrado. Si los hay en alguno ataka.
Si no, avanza un cuadrado, y vuelve a comprobar, y avanzara tanto cuadrados como movimientos tenga asignados, y también comprobara si hay enemigos hasta la distancia que tenga asignada, el problema es lo que hace todo super rápido, no se espera que llegue al final del path para volver a repetir, como podría hacer eso.

Es en la función repetir() la que quiero que espere hasta que llegue al final del path.

Gracias
Título: Re:Esperar a que termine un scrips
Publicado por: 3dgeminis en Enero 10, 2015, 07:30:15 PM
Se me ocurrre que podes usar alarmas o mejor crear un contador
Título: Re:Esperar a que termine un scrips
Publicado por: Clamud en Enero 10, 2015, 08:12:59 PM
No se bien lo que quieres hacer, pero entiendo algo así: quieres que el script mueva a la criatura por celdas hasta que encuentre algo que atacar, y que se vayan mostrando las animaciones de todo lo que hace. Eso no se puede hacer en un solo step en GMS, porque el evento Draw tiene que ser ejecutado varias veces. En versiones anteriores si se podía con las funciones sleep y screen_redraw, pero ya son obsoletas.

Como dice 3dgeminis se pueden usar alarmas o ,se me ocurre, que la criatura actúe conforme a un sistema de estados.

Además, en el código hay partes que pueden ocasionar un comportamiento inesperado: el operador <> no marca errores, pero no aparece en la documetación, y no tengo idea de cómo funciona o si es aplicable ahí; la condición if obstaculo = -1 puede que nunca se cumpla, porque la variable obstaculo se asignó con la función collision_point que devuelve el id de una instancia o la constante noone que es igual a -4.
Título: Re:Esperar a que termine un scrips
Publicado por: arcangelcaos en Enero 10, 2015, 09:08:43 PM
Gracias a los dos, he usado un contador, mas o memos. Hay un evento que es al final del paht. Pues con ese contador cuento cuantas veces lanza ese evento, asi desde hay rellamo a el scrip para que se mueva y haga las comprobaciones. Cuando ese contador llega a lo mismo que movimientos tiene, ya no vuelve a llamar al scrip. Es un contador global. Por si a alguien le interesa
Ahora estoy atascado en esto, no entiendo donde fallo
while (i <> (a+1))
{
x1= criatura.x+5+(96*i)
y1= criatura.y+5

        if not (place_free(x1,y1))
        {
            obstaculo = collision_point( x1,y1, objAmigo, false, false)
            if (obstaculo = -4)
            {
            obstaculo = collision_point( x1,y1, objEnemigo, false, false)
            scrAtake(criatura,obstaculo)
            criatura.Mov = criatura.MovO
            break;
            }
        }
    i+=1
  }


Con este scrip pretendo que busque objetos delante de mi criatura, la criaturas no se pueden mover libremente, tiene establecidos unos cuadros, donde se centran al moverse, por eso con esto hago que vaya buscando en cada posición, que están separados uno 96pixeles, hasta que encuentre un objeto.
objAmigo  es un padre
objEnemigo es un padre

Se lo signo a cada instancia para saber si es amigo o enemigo. Y asi pasar de él, o atacarle.

El problema es que place_free simpre me detecta que hay una criatura, cuando no hay nada, nada de nada, he comprobado la room, en los puntos que se le asignan a x1 e y1.
Y lo peos es que collision_point siempre me devuelve -4, incluso si hay criatura.

No se donde puede estar el fallo.

PSEUDOCODIGO
1Comprar en la casilla delante de mi 96pixle, si no hay objeto, pasar a la siguiente casilla.
            Si hay objeto, si es amigo, pasar de él y comprobar la siguiente casilla
            Si es enemigo, obtener la instancia, y llamar al scrAtake para realizar los cálculos.

Gracias
Título: Re:Esperar a que termine un scrips
Publicado por: penumbra en Enero 10, 2015, 11:08:39 PM
Antes de usar las funciones, lo mejor es consultar el manual para entender su funcionamiento.
http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/index.html (http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/index.html)


Cita de: arcangelcaos en Enero 10, 2015, 09:08:43 PM
El problema es que place_free simpre me detecta que hay una criatura, cuando no hay nada, nada de nada.
¿Estás seguro que debes usar place_free? place_free es una función que sólo funciona CON OBJETOS MARCADOS COMO SÓLIDOS. Lo que pienso que pasa es que como las instancias que pruebas no son sólidos, y la condición busca !place_free, entonces eso devuelve true, aunque en ese lugar no haya nada.

Cita de: arcangelcaos en Enero 10, 2015, 09:08:43 PM
Y lo peos es que collision_point siempre me devuelve -4, incluso si hay criatura.

Porque las funciones collision() se basan en dos máscaras de colisión: la del objeto que llama la función y la del objeto usado como argumento en la función. En tu caso, estás moviéndote en múltiplos de 96 pixeles ;MÁS ALLÁ de los límites de la máscara de colisión del objeto que llama la función, por lo que NUNCA habra colisión, a menos que la máscara de esa instancia fuera enorme y cubriera todo el terreno donde buscas objetos. Por eso nunca se detecta colisión.





Título: Re:Esperar a que termine un scrips
Publicado por: arcangelcaos en Enero 11, 2015, 11:10:03 AM
Cita de: penumbra en Enero 10, 2015, 11:08:39 PM
Antes de usar las funciones, lo mejor es consultar el manual para entender su funcionamiento.
http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/index.html (http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/index.html)


Cita de: arcangelcaos en Enero 10, 2015, 09:08:43 PM
El problema es que place_free simpre me detecta que hay una criatura, cuando no hay nada, nada de nada.
¿Estás seguro que debes usar place_free? place_free es una función que sólo funciona CON OBJETOS MARCADOS COMO SÓLIDOS. Lo que pienso que pasa es que como las instancias que pruebas no son sólidos, y la condición busca !place_free, entonces eso devuelve true, aunque en ese lugar no haya nada.

Cita de: arcangelcaos en Enero 10, 2015, 09:08:43 PM
Y lo peos es que collision_point siempre me devuelve -4, incluso si hay criatura.

Porque las funciones collision() se basan en dos máscaras de colisión: la del objeto que llama la función y la del objeto usado como argumento en la función. En tu caso, estás moviéndote en múltiplos de 96 pixeles ;MÁS ALLÁ de los límites de la máscara de colisión del objeto que llama la función, por lo que NUNCA habra colisión, a menos que la máscara de esa instancia fuera enorme y cubriera todo el terreno donde buscas objetos. Por eso nunca se detecta colisión.

Gracias, con instance_place lo he solucionado.
Y si, eran todos solidos, lo tengo mas que comprobado. El problema es que place_free no es muy preciso, y por eso me ponía que había una criatura cuando en realidad no. No se si seria eso, pero con el instance_place lo he arrglado, funciona perfectamente.

Ahh, y en encontrado un evento que se llama animation_end, que esto hace que cuando termine la animación sigua, por lo tanto es perfecto para mi.
Alguna vez se le nota un poco de retraso, pero funciona, hace una animación, y continua con el codigo
Título: Re:Esperar a que termine un scrips
Publicado por: arcangelcaos en Enero 11, 2015, 11:16:29 AM
Cita de: Clamud en Enero 10, 2015, 08:12:59 PM
No se bien lo que quieres hacer, pero entiendo algo así: quieres que el script mueva a la criatura por celdas hasta que encuentre algo que atacar, y que se vayan mostrando las animaciones de todo lo que hace. Eso no se puede hacer en un solo step en GMS, porque el evento Draw tiene que ser ejecutado varias veces. En versiones anteriores si se podía con las funciones sleep y screen_redraw, pero ya son obsoletas.

Como dice 3dgeminis se pueden usar alarmas o ,se me ocurre, que la criatura actúe conforme a un sistema de estados.

Además, en el código hay partes que pueden ocasionar un comportamiento inesperado: el operador <> no marca errores, pero no aparece en la documetación, y no tengo idea de cómo funciona o si es aplicable ahí; la condición if obstaculo = -1 puede que nunca se cumpla, porque la variable obstaculo se asignó con la función collision_point que devuelve el id de una instancia o la constante noone que es igual a -4.

Gracias

El <> para mi significa diferente, y me funciona perfectamente. No tengo problemas con el.
Título: Re:Esperar a que termine un scrips
Publicado por: arcangelcaos en Enero 11, 2015, 01:13:35 PM
Sigo desesperado, no hay manera de dar con la tecla. No subo el proyecto aquí porque ya ocupa 11mb.
Haber si me explico y haber si alguien me entiendo y me puede echar una mano.

Tengo un mapa con el de la foto.
Con el botón pasar turno, bajo un turno a cada criatura de la que están abajo, y las alineo si se han puesto alguna arriba.
Arriba al soltar el raton dentro de alguno de esos cuadrados la criatura se alinea al cuadrado.
Todas las criaturas son solidas. Los cuadrados NO
La criatura que esta en medio, la que pone un 10, tiene como pariente objEnemigo, la otra objAmigo, es una prueba
Al darle pasar turno entro otros códigos hace esto

// andar criaturas
global.CriaturaAvan=0
do
{
    inst = instance_place( 768 -(64*global.CriaturaAvan),224, objAmigo)
        if (inst > 0)
        {
        scrMoverse(inst)
        global.CriaturaAvan +=1
        break;
        }
        else
        {global.CriaturaAvan+=1}
}
until (global.CriaturaAvan>10)


Va cuadrado por cuadrado comprobando si hay un objeto amigo, y si es asi llama al scrip scrMoverse

criatura = argument0
i=0
a= criatura.DistAtk

global.obstaculo = instance_place(criatura.x, 224, objEnemigo)
        if (global.obstaculo= -4)
        {
        with (criatura)
        {
        Accion = 1
        mipath = path_add()
        path_add_point(mipath, x, y, 100)
        path_add_point(mipath, (x+64), y,100)
        path_set_closed (mipath, false)
        path_start (mipath, 10,0,true)
        Mov -=1
        }}
        else
        {
        criatura.Accion = 2
        }


Este scrip crea un path temporar de adonde debe ir la criatura. Asi se para sola al llegar. Si la criatura tiene varios "Mov", repite esto, por que en el evento End_Paht tengo esto
Accion = 0
i=1
a = DistAtk
aa=0

if (Mov > 0)
{
    while not (i = a)
    {
        global.obstaculo = instance_place(self.x, 224, objEnemigo)
        if (global.obstaculo >0)
            {
            Accion = 2
            aa=1
            break;
            }
    i+=1
    }
scrMoverse (id)
}
else
{
    while not (i = a)
    {
        global.obstaculo = instance_place(self.x, 224, objEnemigo)
        if (global.obstaculo >0)
            {
            Accion = 2
            aa=1
            break;
            }
    i+=1
    }
Mov = MovO
scrSiguienteCriatura()
}


AHHH, ACCION ES PARA LOS SPRITE
switch (Accion)
{
    case 0:
    sprite_index = sprEspada2Espera
    break
    case 1:
    sprite_index = sprEspada2Mov
    break
    case 2:
    sprite_index = sprEspada2Atk
    scrAtake(id,global.obstaculo)
    break
}


Con el código mejor o peor me lo hace, pero aquí estas el problema
global.obstaculo = instance_place(criatura.x, 224, objEnemigo)
en la acción al moverse, no se porque, estando a 128pixees de distancia, mas o menos, (2 Cuadrados) me detecta que hay un objEnemigo,(padre de la objeto), he probado +32, +64, y nada, me detecta siempre un enemigo a 128pixeles, y no tengo ni idea por que.

Haber si alguien me puede echar una mano
PSEUDOCODIGO.
criatura amigo comprueba si hay alguna criatura delante, si no, anda 64pix, el siguiente cuadrado (esto lo hace bien cuando no hay criaturas objenemigas cerca)
vuelve a comprobar si hay objenemigo cerca. Si es asi ataka, y si no, no hace nada.
Al siguiente turno, repetimos, si no hay objenemigo anda, y si lo hay ataka.

Es asi de simple. Haber si alguien me arroja luz.

Gracias de antemano