public override void Procesar(float fDeltaSegundos) { Thing[] thingsAfectados = Galaxia.GetThingsEnRadio(Centro, radioAccion); foreach (Thing thing in thingsAfectados) { if (thing.Movible) { Vector2 distancia = thing.Centro - this.Centro; float velocidad = -velocidadAtraccion * (radioAccion - distancia.Length) / radioAccion; thing.MoverA(distancia.Normalized() * velocidad * fDeltaSegundos, true, true); } } }
public override void Procesar(float fDeltaSegundos) { Rotar(velocidadRotacion * fDeltaSegundos, false, false); Thing[] thingsAfectados = Galaxia.GetThingsEnRadio(Centro, radioAccion); foreach (Thing thing in thingsAfectados) { if (thing.Movible) { Vector2 distancia = thing.Centro - this.Centro; float velocidad = -velocidadAtraccion * (radioAccion - distancia.Length) / radioAccion; thing.MoverA(distancia.Normalized() * velocidad * fDeltaSegundos, true, true); float anguloDistancia = distancia.AngleInDegress + 180.0f; float anguloThing = thing.RotacionEnGrados; anguloDistancia = anguloDistancia % 360.0f; if (anguloDistancia < 0) { anguloDistancia += 360.0f; } float separacionRotacion = anguloDistancia - anguloThing; if (separacionRotacion < 0) { separacionRotacion += 360.0f; } if (separacionRotacion > 180.0f) { separacionRotacion = -(separacionRotacion - 180.0f); } float velocidadRotacionAngulo = (radioAccion - distancia.Length) / radioAccion; separacionRotacion *= velocidadRotacionAngulo * fDeltaSegundos; thing.Rotar(separacionRotacion, true, true); } } }
public override void Procesar(float fDeltaSegundos) { duracionTranscurrida += fDeltaSegundos; if (duracionTranscurrida > duracionSegundos) { Eliminar(); } else { //Daño los nuevos objetos con los que impacto, para lo cual calculo el nuevo radio y solo //daño a quellos objetos que se encuentren a una distancia mayor a la del radio viejo, de esta //forma no daño 2 veces al mismo objeto! Al menos que se mueva delante de la onda expansiva, en cuyo //caso esta bien que lo dañe. //Tambien mantengo un vector de los things que fueron afectados, asi me aseguro de afectarlos al menos una vez, //ya que existe la posibilidad de que el thing se mueva de forma tal que no lo afecte segun el chequeo anterior. float nuevoRadioActual = radioInicial + (radioMaximo - radioInicial) * duracionTranscurrida / duracionSegundos; Thing[] thingsImpactados = Galaxia.GetThingsEnRadio(Centro, nuevoRadioActual); foreach (Thing thingImpactado in thingsImpactados) { if (thingImpactado is ThingDaniable) { float distancia = (thingImpactado.Centro - Centro).Length; if (distancia > radioActual || !thingsAfectados.Contains(thingImpactado)) { ((ThingDaniable)thingImpactado).ProcesarDanio(this, danio); thingsAfectados.Add(thingImpactado); } } } radioActual = nuevoRadioActual; SetTamanio(new Vector2(radioActual * 2, radioActual * 2)); } }