Agosto 24, 2014, 06:34:58 PM Ultima modificación: Agosto 24, 2014, 07:51:34 PM por venus
Tengo un objeto que se mueve de arriba a abajo y a veces colisiona con otro objeto (Otra copia de ese mismo objeto)
Estos objetos se van creando aleatoriamente y lo que hacen es únicamente moverse de arriba a abajo rebotando en las paredes.
El problema es que no consigo que cuando colisionen estos vayan en direcciones contrarias en las que vienen.





Antes de poner los códigos voy a aclarar que cuando direccion == 0 se tiene que mover hacia ariba, y cuado direccion == 1 hacia abajo.


En el evento create del objeto tengo un script con lo siguiente:
direccion = random(1)

En el evento step del objeto tengo un script con lo siguiente:
if(direccion == 0){y-=2} else {y+=2}
Y otro script con esto:
// -- Para que no se salga

// De abajo
if(y > view_hview[0]-global.largo_coche){direccion = 0}
// De arriba
if(y < view_yview[0]){direccion = 1}


Por último en el evento de colisionar del objeto (Que lo he puesto para cuando colisione con si mismo) tengo un script con lo siguiente:
if(direccion == 0){direccion = 1} else {direccion = 0}






No se porque no funciona, y además de eso cuando se crean los coches siempre van hacia abajo.

PD:
El primer script es para dar la dirección del objeto en la que tiene que ir nada mas crearse.
El segundo script es para que se mueva según la dirección asignada.
El tercer script es para que rebote y vuelva pr donde ha venido cuando colisiona con los límites del mapa.
El cuarto script (El que no funciona) sirve para hacer que reboten cuando colisionan con una de sus copias.

Ahora si.

Si el objeto con el que colisionas es de su mismo tipo, no hace falta indicar que tanto ese objeto y el otro se deben alejar, porque entonces se contrarrestan.
Con que pongas que se tuerza 180º solo el objeto es suficiente. ;)


Hola, el primer error es la forma de determinar la dirección; la función random(1)  tiene pocas probabilidades de devolver un cero. Y en vez de usar la variable "direccion" que tu has definido sería más fácil usar la variable "direction", así el movimiento se hace de manera automática.
Prueba de la siguiente forma, he comprobado que funciona:
[gml]
///Inicializar (evento create)
speed = 2;
direction = choose( 90, 270 );
[/gml]
[gml]
///Mantenerse dentro de la vista (evento step)
if( y < view_yview[0] ) direction = 270;
if( y > view_yview[0]+view_hview[0]-sprite_height ) direction = 90;
[/gml]
[gml]
///Rebotar con otra instancia del mismo objeto (evento collision)
x = xprevious;
y = yprevious;
if( direction == 270 ) direction = 90;
else if( direction == 90 ) direction = 270;
[/gml]
En el evento "collision" el objeto vuelve a su posición anterior para que no se traslape con la otra instancia (usando las variables "xprevious" y "yprevious"), se obtiene el mismo resultado si el objeto es sólido.

Gracias!! Ahora por fin voy a poder terminar mi primer juego. Solo me hacen falta el menú, la música y los gráficos!
Ahora si.