public override bool Control( GameEntity control, TimeSpan gameTime, KeyboardState keyState ) { if ( isDestructed ) { InstantControl( control, gameTime ); control.RemoveController( this ); } return true; }
public override bool Control( GameEntity control, TimeSpan gameTime, KeyboardState keyState ) { if ( !shouldExplode ) { if ( Vector2.Distance( control.Position, master.Position ) > master.VacuumSpeed ) { // This occurs when the projectile is further than the amount it's going to pass this frame. // So I move it towards me. control.Move( master.VacuumSpeed, Tools.Mod( MathHelper.ToDegrees( ( float )Math.Atan2( position.Y - control.Position.Y, position.X - control.Position.X ) ), 360 ) ); isLastOneInside = false; } else { // Otherwise, I cannot move it towards me, as it may go to the other side, then I will try to pull it and it will return to where it started, etc. control.Position = master.Position; // So I center it in me. // From now on, it is considered "Inside" me. // A little explanation on the next few lines: // I Assume the HashSet goes through a cycle, and will not break the cycle. // For instance, if we have ["A","B","C"], I assume it will go either ABCABCABC.. or CBACBA.. but never ABACABC... // So that means the following: // Assume there is a projectile inside me. // If I do a cycle and all projectiles are inside me, then I reach the SAME projectile, that means ALL projectiles are inside me, as the control has completed a full cycle. // Then I can explode. if ( !isLastOneInside ) { // So here, I set the projectile to begin the cycle with, since the previous projectile was outside. LastOneInside = control; isLastOneInside = true; } else // If the previous projectile was already inside, I am in the middle of a cycle. if ( control == LastOneInside ) // And if the projectile I began with is now the control, I have completed the cycle. { // Thus I can explode. shouldExplode = true; master.Vanish(); Game.StopController( this ); } } return false; } else { control.Angle = r.Next( 360 ); control.RemoveController( this ); return true; } }
public override bool Control( GameEntity control, TimeSpan gameTime, Microsoft.Xna.Framework.Input.KeyboardState keyState ) { if ( control is Projectile ) { control.Angle = ( float )control.Variables[ angleString ]; } float speed = ( float )control.Variables[ speedString ]; float currentdist = ( float )control.Variables[ currentdistString ]; float ang = ( float )control.Variables[ angleString ]; speed *= speedFactor; currentdist += speed; float dist = Vector2.Distance( position, control.Position ); if ( dist <= currentdist ) { control.Move( speed, ang ); control.Position = control.Bound( control.Position ); dist += speed; } if ( control is Tank && ( ( Tank )control ).Controller != null ) { TankController t = ( TankController )( ( Tank )control ).Controller.Clone(); ( ( Tank )control ).RemoveTankController(); TankControllerPickup p = new TankControllerPickup( t, 3000 ); float d = maxdist; p.Position = control.Bound( control.PositionShift( d, ang ) ); p.Initialize( Game, gameTime ); p.Variables[ speedString ] = speed; p.Variables[ currentdistString ] = currentdist + d; p.Variables[ angleString ] = ang; p.AppendController( this ); Game.QueueEntity( p ); } control.Variables[ speedString ] = speed; control.Variables[ currentdistString ] = currentdist; if ( currentdist >= maxdist - epsilon || speed <= epsilon ) { control.Variables.Remove( angleString ); control.Variables.Remove( speedString ); control.Variables.Remove( currentdistString ); control.RemoveController( this ); } return true; }