Bola de rebote de Android

Así que sólo estoy tratando de hacer una pelota rebotar alrededor de la pantalla que debe reducir la velocidad debido a la gravedad y reflejar (rebote) de la pared como una bola normal sería. ¿Puede alguien dar algunos conceptos básicos y la implementación muy simple de esto? Otros ejemplos parecen un poco "exagerados" y parecen ir más allá de lo que quiero hacer. He intentado esto:

public void updateLogic() { if (x < -1) { xPos += (-x * gravity); } else if (x > 1) { xPos -= (x * gravity); } if (y > 1) { yPos += (y * gravity); } else if (y < -1) { yPos -= (-y * gravity); } } 

Éste es el más cercano que conseguí por mí mismo. Por cierto, los valores xey son del acelerómetro. ¡Cualquier ayuda sería muy apreciada, gracias!

Creo que necesitarás 3 cosas para esto, fuerzas (xyy, que tienes), velocidades (llamarlas xVel e yVel) y posiciones (xPos y yPos que también tienes). La posición de la bola se actualiza (de la manera más sencilla) por:

 xPos += dt*xVel; yPos += dt*yVel; xVel += dt*x; yVel += dt*y; 

La variable 'dt' es el timestep , que controla la velocidad de movimiento de la pelota. Sin embargo, si esto es demasiado grande, ¡el programa será inestable! Intente dt = 0.001 o así para comenzar y gradualmente ajuste más alto.

Luego, para conseguir que la pelota refleje desde las paredes, simplemente vuelca la velocidad si golpea una pared:

 if (xPos > xMax) { xPos = xMax; xVel *= -1.0; } else if (xPos < 0.0) { xPos = 0.0; xVel *= -1.0; } 

Y lo mismo para y. El 'xPos = …' es sólo para detener la bola que sale del borde de la pantalla. Si quieres que la pelota rebote un poco menos cada vez que golpea una pared, cambia el '-1.0' a '-0.9' o algo así (este es el coeficiente de restitución ).

Espero que eso sea todo. ¡Buena suerte!

Algunos comentarios sobre su código actual:

  • Ambas líneas hacen exactamente lo mismo:

     yPos -= (-y * gravity); yPos += (y * gravity); 

    Igualmente, ambas líneas hacen lo mismo:

     xPos += (-x * gravity); xPos -= (x * gravity); 
  • No está manejando los casos -1 <= x <= 1 o -1 <= y <= 1

Algunos comentarios sobre los conceptos:

  • Comience con una pelota.
  • Desea que la bola tenga dos velocidades separadas (ambas positivas o negativas), una en la dirección x y otra en la dirección y. A cada cuadro, añada esas velocidades a la posición de la pelota.
  • A continuación, agregue la detección de colisión. Compruebe cada marco si el centro de la bola está fuera de la pantalla. Si es así, haz que rebote (la manera más fácil de hacer esto es hacer que la velocidad de y de la bola sea positiva cuando se apaga el valor de y negativo más negativo que se muestra en la pantalla, y hacer de manera similar para los otros bordes de pantalla) .
  • Mejora la detección de colisiones: mira si puedes averiguar si alguna parte de la pelota está fuera de la pantalla (sugerencia: para comprobar si la pelota está fuera del lado izquierdo de la pantalla, sólo tienes que comprobar la izquierda- La mayoría de la coordenada de la pelota)
  • Luego tome la gravedad en consideración – la gravedad será un número constante restado de la velocidad y cada trama, hasta que la velocidad y golpee 0.

video de Youtube

Código fuente disponible en github .

  1. Su coordenada x no debe verse afectada por la gravedad.
  2. Les aconsejo no usar acelerómetros hasta que entiendan cómo funciona la física para el caso sencillo.

Romperlo en etapas. En primer lugar, asegúrese de que usted puede conseguir la bola que cae a una velocidad constante.

Una vez que tiene que trabajar, preocuparse por la gravedad que causa la velocidad para aumentar.

Una vez que tenga que trabajar, preocuparse por la intersección con las paredes y los cambios de velocidad. Un simple algoritmo para rebotar de las paredes sería multiplicar la velocidad x por -1 cuando se golpea una pared vertical, y multiplicar la velocidad y por -1 cuando se golpea una pared horizontal.

  • ¿Cuándo necesita un servidor de aplicaciones para la mensajería de Cloud Firebase?
  • Cómo obtener el número de artículo (posición) de una cadena
  • ¿Por qué no puedes lanzar directamente el tipo en java?
  • Android: pesadas operaciones de DB con diálogo de progreso
  • Android - ¿Es posible acceder a datos de entrada capacitivos en bruto?
  • Animar transiciones de elementos compartidos usando fragmentos de Android parece ser una pesadilla
  • Excepción; No se puede establecer la propiedad de la solicitud después de realizar la conexión; Se produce en Android Lollipop HTC M8
  • Reflexión de Java que maneja cambios de la biblioteca
  • ¿Existe una utilidad o API para convertir abreviaturas abreviadas de SMS a oraciones adecuadas?
  • ¿Cómo implementar Moquette broker en Android?
  • Creación de GIF está tomando tanto tiempo en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.