Voy a hacer un juego y lo que quiero hacer es esto:
Cuando el objeto player (es un cubo 32x32) toque con la pared horizontalmente (si va a la pared va en una velocidad mayor) cuando toque el objeto wall horizontalmente no vertical tiene que revertir la velocidad pero que sea menor, y que cuando este en su posicion inicial con la coordenada X la variable con la que se mueve a los lados es true y que pare de moverse, y así hace para esquivar, el problema es que no se como hacer ya que yo tengo una variable en el create llamada previousx que tiene el valor de la coordenada X inicial ya que ahi es edonde tiene que estar, el problema es que si pongo
if(x == previousx){hspeed = 0;}
obviamente a lo que empieze no se va a poder mover y no se como hacer, este es el codigo:
if(keyboard_check_pressed(vk_right))
{
hspeed = spd
}
if(keyboard_check_pressed(vk_left))
{
hspeed = -spd
}
if(place_meeting(x-4,y,obj_wall))
{
hspeed = returnspd;
}
if(place_meeting(x+4,y,obj_wall))
{
hspeed = -returnspd;
}
Podes crear una variable que te sirva de interruptor, por ejemplo activo=false y despues de 1 segundo o el tiempo (con una alarma) que quieras pase a activo=true
Luego en el codigo que tenes
if(x == previousx){hspeed = 0} lo cambias a if x == previousx and activo=true {hspeed = 0}
Esta condición
if(x == previousx){hspeed = 0;}
Da por hecho que al regresar, va a haber un STEP donde la posición actual del objeto coincida con la posición previousx, pero puede suceder que esto nunca ocurra. Según su velocidad, en un STEP, el objeto podría estar a uno, dos, tres, etc pixeles a la derecha de previousx, y al siguiente STEP, el objeto podría haber pasado más allá (hacia la izquierda) del punto previousx, por lo que nunca se cumpliría la condición.
Creo que para evitar fallas, la condición debería cambiarse para que evalúe un margen (rango) de distancia en lugar de un punto exacto.
Cita de: 3dgeminis en Marzo 04, 2015, 03:34:27 AM
Podes crear una variable que te sirva de interruptor, por ejemplo activo=false y despues de 1 segundo o el tiempo (con una alarma) que quieras pase a activo=true
Luego en el codigo que tenes
if(x == previousx){hspeed = 0} lo cambias a if x == previousx and activo=true {hspeed = 0}
hice esto, que le cambio ahora, tiene un alarm puesto en 10 ya que hay un else que pone de que si no es igual a previousx que sea falso y si es falso hspeed es igual a cero, creo que hice una locura XD
if(x == previousx && moverse == true)
{
if(keyboard_check_pressed(vk_right))
{
hspeed = spd;
moverse = false;
}
if(keyboard_check_pressed(vk_left))
{
hspeed = -spd;
moverse = false;
}
alarm[0] = 10;
} else if (x != previousx && moverse == true) {
moverse = false;
}
if(place_meeting(x-4,y,obj_wall))
{
hspeed = returnspd;
}
if(place_meeting(x+4,y,obj_wall))
{
hspeed = -returnspd;
}
if(moverse == false)
{
hspeed = 0;
}