• Sábado 7 de Diciembre de 2024, 21:31

Autor Tema:  Movimiento  (Leído 2452 veces)

Diegosanchez

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Movimiento
« en: Sábado 31 de Julio de 2010, 15:25 »
0
Hasta ahora, para controlar el movimiento de los objetos como por ejemplo una bola, tenia las siguientes variables:
Posicion_X_Bola, Posicion_Y_Bola   (Para indicar la posicion de la bola en pantalla)
Velocidad_X_Bola, Velocidad_Y_Bola   (Para indicar el movimiento de la bola).

Cuando la bola rebotaba, por ejemplo, en la parte inferior de la pantalla multimiplicaba Velocidad_Bola_Y *= -1, y de este modo cambiaba su direccion facilmente.

Pero ahra me doy cuenta de que esto no es muy bueno, ya que por ejemplo al querer dirigir la bola hacia un punto especifico, o en una direccion especifica, no sabria que valores darle a las variables de la velocidad. ¿Alguien me explicaria como hacerlo?.


Espero se entienda, un saludo

ibito

  • Miembro HIPER activo
  • ****
  • Mensajes: 549
  • Nacionalidad: mx
  • Se mas de C++ que lo que se de ese CSS
    • Ver Perfil
    • http://www.ibquezada.com
Re: Movimiento
« Respuesta #1 en: Lunes 13 de Septiembre de 2010, 20:26 »
0
La verdad casi no entendí, pero creo que lo que buscas son vectores...
______________________________________
www.hazjuegos.com Una comunidad dedicada al desarrollo de videojuegos.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Movimiento
« Respuesta #2 en: Sábado 18 de Septiembre de 2010, 10:05 »
0
Hay algunas soluciones...
Se pueden precalcular trayectorias, y actualizarlas como venías haciendo hasta ahora...
Supongamos que tienes un área de 1024x768 px. hasta ahora tu venías moviéndote con valores fijos de ángulo (cantidad de avance X e Y en cada instante), de modo que invertías una ó 2 cordenadas de movimiento cuando chocaba con el borde, hasta ahora no te importaba hacia donde iba (sin rumbo), simplemente cuando llegaba a un borde le cambiabas la dirección. Ahora necesitas saber a donde vas, es decir necesitas 2 pares de cordenadas, donde estoy (móvil) y donde voy (objetivo), para el ejemplo imaginemos que estamos en la cordenada 100,23 y en este momento deicidmos ir hasta 600,459, entonces tenemos que hacernos una idea mental de un área rectangular que cubre sólo el área de donde estoy y como esquina opuesta del área, donde voy, mentalmente traza una diagonal... esa es la ruta, si decides avanzar en línea recta. En cifras se trata de una resta de cordenadas, es decir se trata de medir el ancho y alto del rectángulo descrito: 600-100= 500px de desplazamiento X (lo que mide el rectángulo de ancho); 459-23= 436 de desplazamiento Y(lo que mide el rectángulo de alto, luego damos por supuesto que nos desplazamos en línea 'recta', luego tenemos que saber cuantos px de X se avanzan con cada px de Y, esto resulta en una división (trazar la diagonal): avance=   500/436= 1'1467 ... es decir por cada píxel que avanzas en X debes avanzar 1'1467 píxeles en Y. A este respecto debes usar variables con decimales, ya que aunque no puedas avanzar físicamente 1'1467 píxeles, sin embargo los decimales se van incrementando (en la variable interna usada) con cada paso y llega un momento en que logran sumar 1 píxel más (que ahora si es físicamente representable)...

Luego está la velocidad, la velocidad es la cantidad de'pasos' que das cada vez que avanzas, es decir imaginemos que cada vez que dibujas avanzas 1 píxes, tuvelocidad es de 1 px. por paso. Si tienes que reocrrer una distancia de 120 necesitarás 120 pasos para cubrir la distancia (usando un bucle por ejemplo) supongamos que avanzas 3px, entonces para la misma distancia necesitarás 40 pasos y si tu velocidad fuera de 8px por paso necesitarías 120/8= 15 pasos. Entonces en el cáclculo anterior (párrafo anterior) obtuvimos los valores de avance 'unitarios', por tanto necesitas actualizarlos a tu velocidad, VelX = v * pasoX, VelY=v * PasoY.  Finalmente cuando dibujas debes agregar la cantidad expresada en velX y VelY a la cordenada en la que físicamente se encuentra tu móvil en el momento de moverse a cada paso.
MovilX= MovilX + velX : MovilY= MovilY + VelY ... y esto se repetirá tantos pasos como se necesiten, ya sabes la distancia a cubrir eran 500 px, luego si la velocidadx es de 3 pasos= 500/3= 166'66, y si la velocidad X es de 5 entonce, pasos= 500/5= 100.  Sólo te falta verificar cuando tu móvil 'choca' (alcanza) el objetivo, lo que puedes hacer usando un bucle con  la cantidad de pasos que resulta o bien si tus cálculos sabes que no son del todo correctos, usar un bucle While ... que compara la posición del móvil con la del objetivo, se sale del bucle (se alcanza el objetivo) cuando ambas cordenadas coinciden.

Ya lo tienes, eso sí fíjate en algunas cosas:
* Estamos haciendo una ruta en línea recta.
* La ruta está precalculada antes de 'partir'.
* Si desprecias decimales pasarás muy cerca pero no llegarás al punto  exacto.
* Podrías hacer un precálculo más dinámico, por ejemplo cada 20 pasos (recalculas, verificas la cordenada donde estás y ya conoces la de tu objetivo, entonces cualquier posible error de precisión anterior tiende a corregirse (especialmente si despreciaste decimales o no puedes/quieres trabajar con ellos), en este caso la ruta no será exactamente una línea recta.
* Puede aparecer un nuevo objetivo antes de alcanzar aquel al que te dirigías, con lo que debes volver a precalcular valores para encaminarte al nuevo destino.
* Lógicamente el par de pasos X e Y pueden tener valores positivos o negativos dependiendo de donde se encuentre el objetivo respecto de tu 'móvil'.
«Ma non troppo»
----> ModoVacaciones = False<----