Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: minordioso en Septiembre 02, 2018, 12:54:27 PM

Título: Enemigo que se mueva de izquierda a derecha
Publicado por: minordioso en Septiembre 02, 2018, 12:54:27 PM
Pues estuve buscando por internet como hacerlo, y todos lo hacen con acciones y no programando. Por eso queria saber si hay alguna forma de hacerlo programando o solo puedo hacerlo con acciones.
Título: Re:Enemigo que se mueva de izquierda a derecha
Publicado por: Clamud en Septiembre 02, 2018, 01:43:46 PM
Todo lo que se puede hacer con Acciones (DnD) se puede hacer con GML.
¿Qué condiciones necesitan los enemigos para cambiar de dirección?
Título: Re:Enemigo que se mueva de izquierda a derecha
Publicado por: minordioso en Septiembre 02, 2018, 02:46:51 PM
No se muy bien a que te refieres, el metodo que yo uso para mover algo o alguien es el mas simple del mundo x = x + 5 esa es mas o menos la velocidad que me gustaria que tuvieran, y me gustaria que solo cambiaran cuando choquen con algo solido.
Título: Re:Enemigo que se mueva de izquierda a derecha
Publicado por: Hezz en Septiembre 03, 2018, 02:15:29 AM
Hola minordioso! Creo que querés que tu enemigo se mueva a la derecha sin detenerse hasta encontrarse con una pared u otro objeto, y que luego cambie de sentido. Si es así, yo lo haría de esta forma.

Objeto enemigo
Create
[gml]dir = -1; //Direccion en la que se mueve. -1 izquierda. 1 derecha.
spd = 4; //Velocidad de movimiento

hsp = 0; //Velocidad horizontal
vsp = 0; //Velocidad vertical

glimit = 12; //Límite de la velocidad de caída vertical
g = 0.5; //Gravedad

//Colisionar con otros obj_enemigo
friend_collision = false;[/gml]

Step
[gml]//Movimiento
hsp = spd * dir;
//La velocidad horizontal es igual a la velocidad de movimiento
//multiplicado por la dirección


//Gravedad
if (vsp < glimit) {vsp += g;}


//Colision horizontal
if (place_meeting(x+hsp, y, obj_suelo)) {
    while(!place_meeting(x+sign(hsp), y, obj_suelo)) {x += sign(hsp);}
    hsp = 0;
   
    //Invertir el lado al que caminar. Por ejemplo, -1 * -1 = 1, de izquierda a derecha.
    dir *= -1;
}

//Colision vertical
if (place_meeting(x, y+vsp, obj_suelo)) {
    while(!place_meeting(x, y+sign(vsp), obj_suelo)) {y += sign(vsp);}
    vsp = 0;
}


//Detectar si no hay suelo
if (instance_position(x+hsp + (dir * (sprite_width/2)), y + sprite_height/2 + 1, obj_suelo) == noone) {dir *= -1; hsp = 0;}


//Colisionar con otros obj_enemigo
if (friend_collision){
    //Colision horizontal
    if (place_meeting(x+hsp, y, obj_enemigo)) {
        while(!place_meeting(x+sign(hsp), y, obj_enemigo)) {x += sign(hsp);}
        hsp = 0;
       
        //Invertir el lado al que caminar. Por ejemplo, -1 * -1 = 1, de izquierda a derecha.
        dir *= -1;
    }
   
    //Colision vertical
    if (place_meeting(x, y+vsp, obj_enemigo)) {
        while(!place_meeting(x, y+sign(vsp), obj_enemigo)) {y += sign(vsp);}
        vsp = 0;
    }
}


//Mover al enemigo
x += hsp;
y += vsp;[/gml]
Este código mueve al enemigo en la direccion que deba moverse hasta que se encuentre a un "obj_suelo" frente suyo o un espacio vacío en el camino, y luego cambia de dirección.
Tiene una variable en el evento create que es "friend_collision", que al estar activada hace que al chocar con otro obj_enemigo cambie de sentido, como con la pared.

Espero que te sirva! :D