Hola Makeros!  :). Ultimamente he estado realizando un juego a lo tipo pong, y como comunmente pasa, la pelotita se queda atrapada en algunas ocasiones en las murallas (por alta velocidad), en el jugador (que mas comunmente pasa porque el jugador se mueve), o con las mismas pelotitas... estuve jugando un poco con la fisica, pero no quiero algo tan realista (en el sentido de que al chocar una pelotita, no disminuya su velocidad), solo quiero que cambie su direccion.

Asi que me puse a hacer codigos  :D :

Para hacer de el movimiento mas preciso y que no se salte un objeto que esté entremedio del trayecto de la bolita hice esto
en el evento step:


// variable que chequea la velocidad correcta
velp = 0;

// for de precision
for (i = 0; i <= max_speed + 1; i += 1)
{
    // solo se chequea el objeto solido que es un cuadrado
    colision = instance_place(x+lengthdir_x(i,direction),y+lengthdir_y(i,direction),obj_solido);
    if (colision != noone)
    {
        break;
    }
    else
        velp = i;
}

// asignamos la velocidad
speed = velp;


Hasta este momento, sólo la pelotita se mueve a una velocidad que esta entre 0 y max_speed, y no se salta ningun objeto, en este caso chequea sólo a obj_solido, pero tambien se puede hacer para el obj_jugador y obj_pelota.

Ya que hasta ahí es un movimiento mas preciso, no puedo hacer que la pelotita rebote en una muralla, ya que en ese momento speed = 0, y creo que la función move_bounce_solid() o move_bounce_all(), multiplica vspeed *=-1 o hspeed *=-1.

Que sería lo mas recomendable que pueda hacer? he intentado recurrir a modificar la variable "direction", pero no siempre
me hace como el efecto de rebote. por ejemplo, antes tenía esto para cuando la pelota chocaba con otra:


direction = 180 - direction + 2*point_direction(x,y,other.x,other.y)


Pero no sirve cuando hay un choque con otra pelota que va practicamente en una direccion similar, no se produce un buen efecto.

hasta ahora el obj_pelota es solido y el obj_jugador tambien, el obj_jugador tiene un sprite como se muestra abajo, y cuando el jugador choca con la pelota, esta debe desviarse.

Es recomendable utilizar fisicas? hasta ahora no he podido hacer un buen efecto  :-\

Saludos bien saludosos  XD.
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D

#1 Febrero 26, 2014, 11:10:37 PM Ultima modificación: Febrero 26, 2014, 11:33:05 PM por penumbra
Cita de: fab62 en Febrero 26, 2014, 10:46:31 PM
no puedo hacer que la pelotita rebote en una muralla, ya que en ese momento speed = 0

¿por qué no haces que la muralla expulse a la pelota? Ya que dices que no quieres exactitud física, sino que únicamente rebote, la muralla le puede dar una velocidad de expulsión (predefinida en el propio obj_muralla) a la pelota.

Que la velocidad sea cero no es problema, se pueden crear variables de respaldo
if velp != 0
{
     bk_velp = velp          //velocidad
     bk_dirp = dirp           // dirección
}


Para evitar pelotas atrapadas, la misma muralla puede contar si una pelota ha estado en contacto con ella por más de uno o dos pasos, y ponerla en movimiento de nuevo usando la información de las variables de respaldo.

EDIT: Te puede beneficiar el uso de la nueva función CLAMP

velp = clamp(velp, min_speed, max_speed);
velp no bajaría de min_speed ni podria sobrepasar max_speed