Hola gente, estoy creando un juego tipo Arkanoid, que para el que no lo conozca es el de la imagen de abajo.


Bueno, como veran el juego tiene unas paredes del lado izquierdo y derecho y cuando la pelota coliciona pues simplemente rebota y sigue su dirección.

Bien, en mi juego cuando la pelota coliciona con cuaalquiera de las paredes rebota perfectamente con este código:

hspeed = -hspeed;

Mi problema es porque a partir del nivel 20 e decidido aumentar la dificultar, para ello coloque un bloque que cuando la pelota coliciona aumenta la velocidad a 50 (anteriormente la velocidad era de 30).

Y aquí mi problema, la pelota por momentos va tan rápido que cuando coliciona la pared no rebota, simplemente la traspasa saliendose de la room.

Y digo por momentos pòrque aveces rebota en la pered y otras veces la transpasa.

Evidentemente me parece que tengo un problema de física. ¿Alguien sabe porque tengo este problema?

Aclaro que tanto el objeto pelota como el objeto pared son sólidos y sus sprites tienen preciss colicion

Las paredes son muy delgadas, mientras mayor sea la velocidad de la pelota mayor será el espacio que salte por step, si de casualidad el espacio saltado es el que ocupaba la pared no se reportará evento colisión y no rebotará la pelota.

Puedes usar máscaras o cajas de colisión personalizadas para aumentar el área de colisión de las paredes sin alterar su apariencia.

Cuando cambias la velocidad a 50 significa que la pelota se mueve 50 pixels cada step, como te dice @Killer seguramente tu pared es de menos de 50 pixels y por eso la "evita". Puedes poner algún otro objeto fuera de la room que contenga también el rebote o hacerlo por código, aunque lo más sencillo es poner un objeto sólido e invisible fuera del room :)

Te dejo una imagen explicando lo que digo.

¡Saludos!

Visita mi proyecto: Space Cadet

Cita de: Killer en Abril 29, 2014, 04:08:59 AM
Las paredes son muy delgadas, mientras mayor sea la velocidad de la pelota mayor será el espacio que salte por step, si de casualidad el espacio saltado es el que ocupaba la pared no se reportará evento colisión y no rebotará la pelota.

Puedes usar máscaras o cajas de colisión personalizadas para aumentar el área de colisión de las paredes sin alterar su apariencia.

Sigue igual, he aumentado mushisimo el ancho de la pared y no se soluciona

Tienes que detectar la pared de forma precisa (lo cual es dificil)... yo ocupo este loop que me encontre hace tieeeempo y que lo adapté a cualquier direccion XD:
   
    /***************************************************
      movimiento "preciso"
     ***************************************************/
   
    // velocidad de precision, va desde 0 a velocidad+1
    vp = 0;
    // loop para encontrar la velocidad adecuada
    for (i=0; i<velocidad+1; i+=1)
    {
        // buscando la velocidad
        if (place_free(x+lengthdir_x(i,direction),y+lengthdir_y(i,direction)))
            vp = i;
        else
            break;
    }
    // si vp es 0, le damos un valor muy pequeno a speed para que se pueda realiar el rebote
    if (vp<=1)
    {
        speed = 1;
        // he visto que cuando es preciso, se queda pegado a veces
        move_bounce_solid(0);
    }
    else
        speed = vp;
       
    // por si se pega en la pared
    while !(place_free(x,y))
    {
        x += lengthdir_x(vp+1,direction+180);
        y += lengthdir_y(vp+1,direction+180);
        move_bounce_solid(0);
    }

Solo pon esto en el evento step de la pelota. no agregues colisiones adicionales, en donde modifiques el rebote, no he visto que sucedería... debes crear la variable velocidad antes, y esa modifica a la hora de aumentar o disminuir la velocidad... espero que te ayude esto... XD hice un ejemplillo para que lo veas jeje...
El ayer es un recuerdo, el mañana un pensamiento, es el ahora en donde existo y vivo para ser feliz :D