Creando Proyectiles (Beam)

Estoy haciendo un juego de disparos simple para Android, donde el jugador es un humano y está siendo atacado por extraterrestres. ¿Cómo haré un rayo láser para que cuando el usuario toque la pantalla o presione la bola de seguimiento el láser simplemente dispare en línea recta?

Ayer mismo alguien preguntó casi exactamente la misma pregunta en stackoverlow.com. Voy a citar mi respuesta desde allí y editarla un poco para que se ajuste a tu publicación:

https://stackoverflow.com/questions/6300169/moving-objects-help/6300303#6300303

No sé qué tipo de biblioteca está utilizando para dibujar todas sus cosas, pero eso básicamente no importa ya que solo necesita saber dos cosas para hacer esto:

Probablemente desees configurar una class vectorial para tratar este tipo de cosas de manera más cómoda. Voy a suponer que ya tienes uno. En caso de que no conozca las matemáticas vectoriales, aquí encontrará una página de tags muy útil con enlaces a dos excelentes artículos sobre el tema: https://gamedev.stackexchange.com/tags/vector/info

Necesitas calcular la dirección en que se mueve el rayo dependiendo de la position del tacto. Obtienes esta dirección simplemente restando la position del toque de la position del jugador:

 Vector2 direction = Vector2.subtract(touchPosition,playerPosition); 

Para get una dirección en lugar de agregar un componente de velocidad a este vector, necesita normalizarlo (para que tenga una longitud de 1):

 direction.normalize() 

El código de normalización dentro del Vector 2 se vería así:

 public void normalize() { float length = this.length(); this.x /= length; this.y /= length; } 

Y el código de longitud así:

 public void length() { return math.sqrt(this.x*this.x + this.y*this.y); } 

Luego debe actualizar la position del rayo agregando el producto de la dirección y la velocidad con la que desea que viaje el rayo.

 projectilePosition.add(Vector2.multiply(direction,speed)); 

Si tiene alguna manera de medir el time entre dos fotogtwigs, la variable de velocidad debe depender del time transcurrido entre esos fotogtwigs, para crear movimientos suaves en diferentes plataforms. Entonces, el código simplemente agregaría otra multiplicación:

 projectilePosition.add(Vector2.multiply(direction,speed*t)); //t = elapsed time