public BulletSplitter(GameScreen scrn, Bullet b, Direction8 d) : base(scrn) { scale = b.Scale; ShapePosition = b.BulletPosition; ShapeAlpha = 1f; Fraction = b.Fraction; velocity = VELOCITIES[(int)d] * FloatMath.GetRangedRandom(0.5f, 2f) + ConvertUnits.ToDisplayUnits(b.PhysicsBody.LinearVelocity)/10f; maxLifetime = FloatMath.GetRangedRandom(SPLITTER_LIFETIME_MIN, SPLITTER_LIFETIME_MAX); ShapeRotation = FloatMath.ToRadians((int) d * 45f); rotationSpeed = FloatMath.GetRangedRandom(-FloatMath.TAU, FloatMath.TAU); DrawingBoundingBox = new FSize(Bullet.BULLET_DIAMETER, Bullet.BULLET_DIAMETER) * scale; }
// ignore all bullets private bool IsHoming(Bullet b) { //TODO: Optimize IsHoming() // We could cache the target cannon in every bullet // and update it on collision or creation // would be faster (?) - optimization opportunity for later // i should measure how expensive ray tracing is GameEntity result = null; Func<Fixture, Vector2, Vector2, float, float> callback = (f, pos, normal, frac) => { if (f.UserData is Bullet) // ignore _all_ Bullets { return -1; // ignore } result = (GameEntity)f.UserData; return frac; // limit to this length }; var rayStart = b.PhysicsBody.Position; var rayEnd = rayStart + b.PhysicsBody.LinearVelocity * ConvertUnits.ToSimUnits(GDConstants.VIEW_WIDTH) / b.PhysicsBody.LinearVelocity.Length(); Owner.GetPhysicsWorld().RayCast(callback, rayStart, rayEnd); return (result == Cannon); }