Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Spawn_x3 en Febrero 16, 2012, 07:10:19 PM

Título: Mover Personaje(Codigo + Corto)
Publicado por: Spawn_x3 en Febrero 16, 2012, 07:10:19 PM
Buenos días y tardes para el otro lado del continente :-[. ya estoy por aquí molestando con una duda, espero puedan ayudarme, es muy sencilla. Comento que estoy haciendo mi propio código sin ayuda para así poder aprender las posibilidades de GML por lo cual si tengo alguna duda trataré de primero buscar una solución antes de preguntar.

Tengo 3 dudas referente a el movimiento de mi personaje:

1.-Estoy realizando lo siguiente en el evento step para mover mi personaje en varias direcciones.
//CONTROLES GENERALES

//Mover Personaje
switch (keyboard_key)
{
case vk_up:Up_s.image_speed=0.2;Personaje1_obj.y-=5;Personaje1_obj.sprite_index=Up_s;break;
case vk_down:Down_s.image_speed=0.2;Personaje1_obj.y+=5;Personaje1_obj.sprite_index=Down_s;break;
case vk_right:Rigth_s.image_speed=0.2;Personaje1_obj.x+=5;Personaje1_obj.sprite_index=Rigth_s;break;
case vk_left:Left_s.image_speed=0.2;Personaje1_obj.x-=5;Personaje1_obj.sprite_index=Left_s;break;
case vk_nokey: Personaje1_obj.image_index=3;break;
}


1.-Mi duda es si hay otras opciones para hacer este codigo + corto, ya que como ven soy nuevo en esto de la
programación y como hago para no tener que llamar a el objeto Personaje1_obj en cada sentencia.

2.-Como puedo hacer que mi personaje no solo se mueva lineal (que pueda usar combinación de teclas), sólo requiero que me den una idea para yo trabajar en el código.

3.-Si requiero que mi personaje también al colisionar con un objeto cambie la serie de sprites de movimiento por unos similares, pero que tenga un arma en la mano ¿como podría cambiar los de cada dirección? o si es más fácil agregar un arma al existente (si esto es posible).

Gracias por su ayuda, un saludo amigos.
Título: Re:Mover Personaje(Codigo + Corto)
Publicado por: Mgbu en Febrero 16, 2012, 07:17:27 PM
Yo añadiria mas opciones, pero nunca use switchs sino ifs (if vk_left and vk_down...)
aunque espera ya que alguien te va a dar un codigo bien copado  :D
Título: Re:Mover Personaje(Codigo + Corto)
Publicado por: Sdo.Ivan en Febrero 16, 2012, 07:54:41 PM
lo de lineal no lo entendi muy bien...pero para combinar teclas puedes usar el "if" y al "and"
por ejemplo
if ("pulso una tecla") and ("pulso la otra") {"mi player se mueve palli y palla"};

sobre lo del sprite....supongo que dependerá de tu destreza para editar sprites....yo personalmente haria un nuevo sprite con el arma en la mano ya que,por lo menos para mi,es mas facil que tener que añadir un arma a un sprite ya existente y que quede bien.un saludo
Título: Re:Mover Personaje(Codigo + Corto)
Publicado por: Spawn_x3 en Febrero 16, 2012, 08:02:45 PM
Cita de: Mgbu en Febrero 16, 2012, 07:17:27 PM
Yo añadiria mas opciones, pero nunca use switchs sino ifs (if vk_left and vk_down...)
aunque espera ya que alguien te va a dar un codigo bien copado  :D
Saludos, voy a probar con el and a ver si se puede de esa forma y les platico que pasa. XD
Título: Re:Mover Personaje(Codigo + Corto)
Publicado por: Spawn_x3 en Febrero 16, 2012, 08:10:03 PM
Cita de: Sdo.Ivan en Febrero 16, 2012, 07:54:41 PM
lo de lineal no lo entendi muy bien...pero para combinar teclas puedes usar el "if" y al "and"
por ejemplo
if ("pulso una tecla") and ("pulso la otra") {"mi player se mueve palli y palla"};

sobre lo del sprite....supongo que dependerá de tu destreza para editar sprites....yo personalmente haria un nuevo sprite con el arma en la mano ya que,por lo menos para mi,es mas facil que tener que añadir un arma a un sprite ya existente y que quede bien.un saludo

probare su sugerencia, gracias, en relación a movimiento lineal me refiero a que solo se mueve  en dirección up,down,left,rigth(x-,x+,y-,y+) Quisiera que cuando combino teclas se mueva en diagonales.
ejemplo si se mueve al presionar la tecla left  x+=10, que cuando combine la tecla left con up se mueva así: x+=10, y+=10.
Pero no se si tenga que definir posiciones de sprites para estas combinaciones.
Título: Re:Mover Personaje(Codigo + Corto)
Publicado por: brunoxzx en Febrero 16, 2012, 09:43:32 PM
Para juegos cenitales yo uso este código, espero que le sirva a todos ya que me he topado con algunos juegos cenitales en los que al colisionar con un muro se quedan algo atascados.

Código (Ev step) [Seleccionar]

//.
dirx=0;
//.
diry=0;
//Variable que indica si te has movido en este step.
mover=0;
//Belocidad del personaje
vel=4;


Código (Ev step) [Seleccionar]
/**************************MOVIMIENTO***********************/

dirx=keyboard_check(vk_right)-keyboard_check(vk_left);
x+=dirx*vel;
//Si queda dentro de un muro sale de el moviéndose en dirección contraria pixel a pixel hasta que no haya colisión.
while (!place_free(x,y)){
    x-=dirx;
}

diry=keyboard_check(vk_down)-keyboard_check(vk_up);
y+=diry*vel;
//Lo mismo que anteriormente pero en Y.
while (!place_free(x,y)){
    y-=diry;
}

//Básicamente mover dirá si presionaste alguna tecla de movimiento en este step.
mover=sign(abs(diry)+abs(dirx));


Explico lo de "keyboard_check(vk_right)-keyboard_check(vk_left)" por si no lo entiendes.

Bien, lo que hace la función "keyboard_check" es devolver si se esta pulsando determinada tecla en este step, por lo que si se esta pulsando la tecla devuelve "1", de lo contrario "0".

Citar
dirx=keyboard_check(vk_right)-keyboard_check(vk_left);
//Reemplazando por lo que devuelve cada uno y considerando que se esta presionando la tecla izquierda.
dirx=(0)-(1);
//entonces
dirx=-1;

entonces seguidamente se ejecuta esto.

x+=dirx*vel;
//reemplazando
x+=(-1)*(4);
//reemplazando otra vez
x+=-4;
//Por lo que se moverá 4 pieles a la izquierda en este step.


De allí en mas te imaginaras como funciona todo, "sign()" devuelve el signo de un numero y abs() el absoluto de un numero por si aun no sabias, y conforme al bucle while la verdad casi no dormí y tengo sueño, ademas tal vez sea algo pronto para explicarte así que si quieres busca en google lo que hace hay miles de explicaciones ya que esta en la mayoría, si no es que en todos los lenguajes de programación.

P.D: ah lo olvidaba los sprites si quieres ponerlos puedes usar un switch() o "if y elses" y usar las variables "mover", dirx y diry para que se seleccione el sprite correcto, yo uso otros métodos pero son algo avanzados y es mejor que lo hagas tu mismo. Tal vez el código no sea el mas corto del mundo pero es bastante bueno, es posible hacer el movimiento en un solo renglón pero bah no es tan legible y no te quedarían variables para definir cual es el sprite actual.
Título: Re:Mover Personaje(Codigo + Corto)
Publicado por: Spawn_x3 en Febrero 16, 2012, 10:25:47 PM
Cita de: brunoxzx en Febrero 16, 2012, 09:43:32 PM
Para juegos cenitales yo uso este código, espero que le sirva a todos ya que me he topado con algunos juegos cenitales en los que al colisionar con un muro se quedan algo atascados.

Gracias muy buen codigo de movimiento, voy a ver si lo puedo aplicar a mi juego, el problema que mi juego tiene más aspecto isometrico, ¿ habría algún problema para el desplazamiento?.
Título: Re:Mover Personaje(Codigo + Corto)
Publicado por: Mgbu en Febrero 16, 2012, 11:03:13 PM
No, solo que hacia arriba y abajo se deberia mover mas lentamente (creo que 1,7 aproximadamente)

Es decir, si hacia arriba y abajo se mueve a 4 pixeles por step hacia los costados a 6,8 pixeles por step (4*1,7, si esa es la relacion que creo que era)

La relacion es la longitud de A dividido la longitud de B (mira la imagen)

Tene en cuenta que de isometria no se mucho  :-[ (nunca hice un juego isometrico), pero se me ocurre que asi funcionara bien  :)

EDIT: Adjunte una imagen .pdn, creo que no usas Paint.net XD asi que te adjunte un jpeg ;)
EDIT2: De nuevo adjunte el .pdn :o, hoy no es mi dia XD