Estoy haciendo un juego cenital de naves, y quiero que cuando mi nave colisione con un enemigo retroceda al instante unos cuantos pixeles, dependiendo del lado que toque al enemigo ya sea, si lo toco por la parte de arriba, retroceda al lado contrario para evitar la colisión.
ya he puesto la inmunidad de un segundo cada vez que colisione con el enemigo pero quiero que también se aleje de este a una velocidad precisa ya que el enemigo también esta en
movimiento.
Quiero que rebote dependiendo del lado que lo toque.
he intentado usar las instrucciones de movimiento como x+=4 o y+=4, pero no obtengo el resultado deseado.


Prueba con esto en el EVENTO COLISION de la nave:

if obj_enemigo.x>obj_nave.x{with(obj_nave){x+=3}}; //si enemigo está a la derecha
else
if obj_enemigo.x<obj_nave.x{with(obj_nave){x-=3}}; //si enemigo está a la izquierda
else
if obj_enemigo.y<obj_nave.x{with(obj_nave){y+=3}}; //si enemigo está arriba
else
if obj_enemigo.y>obj_nave.x{with(obj_nave){y-=3}};//si enemigo está abajo de la nave


Con esto rebota tres pixeles si lo choca.

Si lo que quiere es que antes de chocarlo, se retroceda para evitar el impacto. Entonces usa:
if distance_to_object(obj_enemigo.x)<5{with(obj_nave){x+=3}}; y así sucesivamente.

Si se te hace difícil, pide apoyo de nuevo. Ahora voy saliendo de mi oficina.

Saludos
La verdad es como la luz de una vela, que ni la oscuridad inmensa, puede opacarla.

Citarif obj_enemigo.x>obj_nave.x{with(obj_nave){x+=3}}; //si enemigo está a la derecha
else
if obj_enemigo.x<obj_nave.x{with(obj_nave){x-=3}}; //si enemigo está a la izquierda
else
if obj_enemigo.y<obj_nave.x{with(obj_nave){y+=3}}; //si enemigo está arriba
else
if obj_enemigo.y>obj_nave.x{with(obj_nave){y-=3}};//si enemigo está abajo de la nave
Ok creo que ya entiendo un poco mas claro, solo que el rebote vertical me falla un poco, en vez de rebotar hacia arriba o abajo se me dezplaza hacia los lados, no se cual es el error, este es el codigo:
if (obj_jefe.x > obj_nave.x){
   with(obj_nave){x-=64};
}
else
  if (obj_jefe.x < obj_nave.x){
   with(obj_nave){x+=64};
}
else
   if (obj_jefe.y < obj_nave.x){
   with(obj_nave){y+=64}
}
else
if (obj_jefe.y > obj_nave.x){
   with (obj_nave){y-=64}
}

Cita de: woolf7 en Febrero 12, 2015, 07:55:02 AM
solo que el rebote vertical me falla un poco, en vez de rebotar hacia arriba o abajo se me dezplaza hacia los lados, no se cual es el error,
La condición del if no es correcta en los dos últimos casos:

if (obj_jefe.y < obj_nave.x){
   with(obj_nave){y+=64}


Del lado izquierdo del signo "menor que" se está evaluando Y, pero del lado derecho se está usando una variable X. Como decimos por acá, "es como comparar peras con manzanas". Fíjate que en las dos primeras condiciones sí se compara x con x de manera correcta.

Tienes razón: se deben comparar y con y revisa a ver si así te funka.
Saludos
if (obj_jefe.x > obj_nave.x){
   with(obj_nave){x-=64};
}
else
  if (obj_jefe.x < obj_nave.x){
   with(obj_nave){x+=64};
}
else
   if (obj_jefe.y < obj_nave.y){
   with(obj_nave){y+=64}
}
else
if (obj_jefe.y > obj_nave.y){
   with (obj_nave){y-=64}
}
La verdad es como la luz de una vela, que ni la oscuridad inmensa, puede opacarla.

Si, ya habia intentado cambiarlas a ".y" pero me daba el mismo resultado.
Supongo que las ultimas 2 estructuras no se pueden cumplir, ya que siempre una de las dos primeras va a ser verdadera, creo..
En fin solo tengo una ultima duda:
¿el ".y" y el ".x" toman como referencia el origen del objeto?

#6 Febrero 13, 2015, 12:14:33 AM Ultima modificación: Febrero 13, 2015, 12:17:24 AM por penumbra
Cita de: woolf7 en Febrero 13, 2015, 12:08:51 AM
Si, ya habia intentado cambiarlas a ".y" pero me daba el mismo resultado.
Supongo que las ultimas 2 estructuras no se pueden cumplir, ya que siempre una de las dos primeras va a ser verdadera, creo..
En fin solo tengo una ultima duda:
¿el ".y" y el ".x" toman como referencia el origen del objeto?
Ese es el problema con esas condiciones, en realidad no van a funcionar tal como están del modo que quieres. las condiciones se tienen que plantear de modo diferente, como verificar simultaneamente la posición en X como en Y, para determinar la posición exacta de la nave respecto al enemigo (no nada más una coordenada, x o y, como actualmente ocurre).

Sí, x e y se refiere a la posición del origen del objeto (dado por las propiedades del sprite)

Acá hay una manera distinta de hacer un retroceso:
http://www.comunidadgm.org/preguntas-y-respuestas/fisicas-(solucionado)/msg110605/#msg110605