Pesadilla con la orietación.

Micq85

Buenos días a todxs!
Me llamo Miquel, y soy muy nuevo en esto de la programación.. Así que por favor, no me mateis si la cago demasiado.
Tengo un pequeño gran problema.. Estoy empezando a crear un videojuego en 2D, en Game Maker. Nunca habia programado, y voy poco a poco entendiendo y haciendo cosas. Cada dia avanzo en algo.. pero llevo tres o cuatro dias estancado.
Mi personaje es operativo, excepto cuando salta a la izquierda, se crea un bug y aparece por debajo de lo que tengo como suelo.
Explico lo que hago para hacer las animaciones..
En el elemento Create, tengo:

//Hacia donde estamos mirando
intFaceX = 0;
intFaceY = 0;
strFacing = "east";

Y en otra linea de codigo, tambien tengo:

//Maquina de estados
enum statePlayer
{
idle = scrPlayerIdle,
walk = scrPlayerWalk,
jump = scrPlayerJump
}
staPlayer = statePlayer.idle;

Despues en Scripts, tengo uno para cada animación, quieto, andando, y saltando (todos escritos igual, solo que cambiando los Sprites).
Para andar lo tengo así:

switch (strFacing)
{
case "west":
sprite_index = sprBillyWalkW;
break;

case "east":
	sprite_index = sprBillyWalkE;
	break;

}

Y para cuando salto, lo tengo así:

switch (strFacing)
{
case "west":
sprite_index = sprBillyJumpW;
break

case "east":
	sprite_index = sprBillyJumpE;
	break;

}

Despues en el Evento Steep, tengo la posición para que se oriente, escrito así:

//Hacia donde miramos mientra andamos
if (intVX > 0)
{
strFacing = "east";
intFaceX = 1;
intFaceY = 0;
}
else if (intVX < 0)
{
strFacing = "west"
intFaceX = -1;
intFaceY = 0;
}

//Hacia donde estamos mirando mientras saltamos
if (intVY < 0)
{
strFacing = "east";
intFaceX = 0;
intFaceY = -1;
}
else if (intVY < 0)
{
strFacing = "west";
intFaceX = -1;
intFaceY = -1;
}

Y tambien dentro de Steep, pero en otra linea de codigo, escribí, las animaciones:

///Animacines

//Quieto y andando
if (intVX == 0) && (intVY == 0)
{
staPlayer = statePlayer.idle;
}
else staPlayer = statePlayer.walk;

//Saltando
if (!bolGround)
{
staPlayer = statePlayer.jump;
}
script_execute(staPlayer)

Bien.. como decía arriba, algo pasa cuando salto a la izquierda. y ojo, solo pasa cuando intento que tenga una animación.
si yo quito el script, o que no lea, o se posiciones con StrFacing. todo va bien. Las fisicas estan correctas. Algo pasa con alguna linea de lo que he puesto, casi seguro..
Si alguien que entiende, no se echa demasiado las manos a la cabeza y puede ayudarme, estaría super agradecido. Mi frustración a llegado al limite! :(
Un saludo, y suerte con vuestros juegos!

B

Nunca lo he utilizado así que no sabría decirte ... pero me llama la atención que tienes un "Break" sin punto y coma al final ... ¿influye? además es en código que parece estar destinado al movimiento de izquierda creo.

¿Imagino que el engine tendrá consola? ¿No indica nada?

Micq85

Hola.
Nada me indica un error, por eso voy medio loco.
El ";" en GML no es necesario, yo lo escribo para tener una buena costumbre, peor no influye... -_-

AngelRc

No entiendo esta parte, puedes explicar que quieres hacer aqui?:
//Hacia donde estamos mirando mientras saltamos
if (intVY < 0) {
strFacing = "east";
intFaceX = 0;
intFaceY = -1;
}
else if (intVY < 0) {
strFacing = "west";
intFaceX = -1;
intFaceY = -1;
}

Micq85

Te explico. La idea es hacer entender al personaje que cuando no toque el suelo y además se mueva a la izquierda o a la derecha. El personaje mire a la izquierda o a la derecha. y con la animación del script correspondiente. "east" y "west" es para que reconozca cual de los dos sprites escritos en el script, tiene que leer. Cuando ando, si lee las animaciones correspondientes (hechas de la misma forma). peor cuando salto no, aparece un bug y no funciona correctamente.

1 respuesta
AngelRc

#5 Por qué compruebas la intVY para ver si gira derecha o izquierda? Deberia ser la intVX no?

1 respuesta
Jastro

Es un plataformas entiendo no? hay mejores forma de definir el code por ejemplo:

Create event

grav = 0.2; hsp = 0; vsp = 0; jumpSpeed = 4; moveSpeed = 2;

Step Event

    // Get input kLeft = -keyboard_check(vk_left); kRight = keyboard_check(vk_right); kJump = keyboard_check_pressed(vk_up);

// Use input move = kLeft + kRight; hsp = move * moveSpeed; if (vsp < 10) { vsp += grav; };

if (place_meeting(x, y + 1, obj_wall)) { vsp = kJump * -jumpSpeed }

// H Collisions if (place_meeting(x + hsp, y, obj_wall)) { while (!place_meeting(x + sign(hsp), y, obj_wall)) { x += sign(hsp); } hsp = 0; } x += hsp;

// v Collisions if (place_meeting(x, y + vsp, obj_wall)) { while (!place_meeting(x, y + sign(vsp), obj_wall)) { y += sign(vsp); } vsp = 0; } y += vsp;

Tambien los de gamemaker, teneis: http://www.gmlscripts.com/

1 respuesta
Micq85

#6 La comprovación de la izquerda o derecha la hago con intFaceX = -1.
A ver, lo que pongo es:
cuando intVY es menor a 0, (o sea Y -1, -5, -12.. lo que sea), si intFaceX es -1 (mira a la izquierda), que strFacing = sea "West" (lo cual tengo descrito en el Script de salto para que cargue la animacion de salto a la izquierda. Pero no lo hace. :(
Se que hay poco codigo aqui, y que os falta informacíon. :/

Micq85

#7 Hola! Es un pataformas si.
No tengo problemas con las fisicas, ni con los saltos.
Mi personaje es totalmente funcional. Salta bien, y anda bien.
El problema bien con la animacion concreta que quiero que tenga cuando esta en el aire, y mirando hacia un lado u otro.. solo, cuando está en el aire.
Tengo un Script para cada animacion, Idle, Walk.. arriba pongo primero un ejemplo de la que tengo para andar, y de como funciona correctamente. Y abajo pongo la de saltar, que es exactamente igual, solo que cambiando el Steep.. Para la animacion de andar, simplemente diciendo que intVX sea menor o mayor a cero, si intFace es =-1, ó 1, que cargue el sprite dentro del script denominado "west", o "east"..
pero al saltar, intento hacer lo mismo y no sale. Cuando intVY sea menor a 0, (o sea, este en el aire) si intFaceX es =-1 por ejemplo, cargue "west" para la animacion de la izquierda.. pero no lo hace.

B

Tienes que ser mas especifico para que se te pueda ayudar. Poner el codigo con [ code] también ayuda.

No ejecuta el script porque hace otra animación?
No ejecuta el script porque ignora que lo haga?

Los scripts no es que no hagan nada. Es que simplemente el flujo de trabajo no llega a ellos. En tu caso miraria los condicionales si realmente entre tanto vx vy y demás no tienes bien definido que lo haga correctamente.

Micq85

Lo solucioné y se me pasó contestar, perdón.
¡Muchas gracias por vuestra atención
;)

Usuarios habituales