Pregunta

Me gustaría desviar una pelota en ángulo dependiendo de dónde golpea una pala. En este momento, solo estoy cambiando la coordenada y, lo que resulta en una desviación poco interesante. Se inclinará pero será independiente de la ubicación del impacto contra la pala. Me gustaría algo más divertido. No es necesario tener en cuenta la velocidad, el impulso, la masa y otros factores. Solo ángulo dependiendo de la ubicación del impacto de la pala. He leído esto No es un número error (NAN) al hacer la detección de colisión en una aplicación de iPhone pero parece demasiado complicado para lo que estoy buscando. ¿Existe una forma más sencilla de calcular la desviación?

Los objetos son dos UIImageViews.

¿Fue útil?

Solución

Bueno, nada realista, pero podrías hacer algo para que el ángulo de salida solo dependa de dónde golpea la pala.

Nunca he hecho ninguna codificación C de iPhone o de objetivo, así que escribiré algo en pseudo / código C.

Primero calcularía la velocidad, que es la longitud del vector de velocidad, o:

double speed = sqrt(velX * velX + velY * velY); // trigonometry, a^2 + o^2 = h^2

Entonces queremos calcular el nuevo ángulo en función de dónde golpeamos la pala. Asumiré que almacena la colisión X en impactX y la longitud de la pala en paddleLength. De esa manera podemos calcular un ángulo de salida. Primero, descubramos cómo calcular el rango para obtener un valor entre -1 y 1.

double proportionOfPaddle = impactX / (double) paddleLength; // between 0 and 1
double impactRange = proportionOfPaddle * 2 - 1; // adjust to -1 and 1

Supongamos que no queremos desviar la pelota completamente hacia un lado, o 90 grados, ya que sería bastante difícil recuperarse. Como voy a usar el ImpactRange como el nuevo velY, voy a reducirlo para decir -0.9 a 0.9.

impactRange = impactRange * 0.9;

Ahora necesitamos calcular el velX para que la velocidad sea constante.

double newVelX = impactRange;
double newVelY = sqrt(speed * speed - newVelX * newVelX); // trigonometry again

Ahora devuelve newVelX y newVelY y tiene un rebote dependiente del impacto y la velocidad.

¡Buena suerte!

(Bien podría haber errores aquí, y podría haber invertido la X o Y, pero espero que entiendas la idea general).

EDITAR : Agregar algunas ideas sobre cómo obtener el ImpactX.

Supongamos que tiene el ball.center.x y el paddle.center.x (no sé cómo lo llama, pero supongamos que paddle.center.x nos dará el centro de la paleta) deberíamos poder calcular el rango de impacto a partir de eso.

También necesitamos el radio de la bola (supondré ball.width como el diámetro) y el tamaño de la pala (paddle.width?).

int ballPaddleDiff = paddle.center.x - ball.center.x;
int totalRange = paddle.width + ball.width;

El valor más pequeño para ballPaddleDiff sería cuando la pelota solo toca el lado de la pala. Ese ballPaddleDiff sería entonces paddle.width / 2 + ball.width / 2. Por lo tanto, el nuevo ImpactRange sería

double impactRange = ballPaddleDiff / (double) totalRange / 2;

Probablemente deberías verificar el ImpactRange para que realmente esté entre -1 y 1 para que la pelota no se dispare hacia las estrellas o algo así.

Otros consejos

No necesariamente quieres realista, quieres diversión. Esos no son siempre uno y lo mismo. Si querías ser realista, no puedes tirar la velocidad, el impulso, la masa, etc. En un juego normal de ping pong, el punto donde golpea la paleta realmente no importa, no hay un punto dulce como en una raqueta de tenis .

Desarrolle una función matemática que devuelva un vector de salida, o un vector de velocidad y unidad, que represente el ángulo de salida y la velocidad de la pelota, dando un ángulo de entrada, velocidad, punto de impacto en la pala y velocidad de la pala. .

Esperamos ya que el ángulo de salida = -1 * ángulo de entrada. También se esperaría que la velocidad de salida fuera -1 * la velocidad de entrada. Entonces, si quieres mezclarlo, ajústalo. Puede aumentar el ángulo de salida proporcional a la distancia desde el centro de la pala. También podría aumentar el ángulo o la velocidad proporcional a la velocidad de la pala cuando golpea.

Hay muchas maneras en que puedes hacer eso, así que no puedo decirte exactamente qué función usarías, vas a tener que resolverlo probando y jugando. Si aún necesita más información, agregue más detalles a su pregunta.

El siguiente código (C ++ pero lo suficientemente fácil de convertir a ObjC), toma un vector 2D entrante y lo refleja en función de una superficie normal (la cara de su bate de pong).

Puede agregar algún "factor divertido" aleatorio al aleatorizar un desplazamiento que aplicaría a "escalar", para cambiar la velocidad, o a la superficie normal, para alterar el ángulo de reflexión.

Estoy usando esto en mi proyecto de iPhone, y funciona bien :)

void vec2ReflectScalar(vec2& vResult, const vec2& v1, const vec2& normal, float scalar)
{
    vec2  _2ndotvn;
    float dotVal = vec2DotProduct(v1, normal); 

    vec2Scale(_2ndotvn, normal, scalar * 2.f * dotVal);
    vec2Subtract(vResult, v1, _2ndotvn); 
}

void vec2Reflect(vec2& vResult, const vec2& v1, const vec2& normal)
{
    vec2ReflectScalar(vResult, v1, normal, 1.f);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top