void CreateNewUnit(PlayerTeam team, UnitType type, Vector spawnPoint, Vector gatherPoint) { // Use tag to detect a friend from foe string teamTag = "h"; string enemyTag = "m"; if (team==PlayerTeam.Monsters) { teamTag = "m"; enemyTag = "h"; } teams[team].UnitCreationProgress[type].Value = 0; PhysicsObject unit = new PhysicsObject(30, 30, Shape.Circle); unit.Position = spawnPoint; unit.Tag = teamTag; unit.CanRotate = false; DoubleMeter hp = new DoubleMeter(100.0); ProgressBar hpbar = new ProgressBar(30, 5, hp); hp.AddTrigger(50.0, TriggerDirection.Down, () => hpbar.BarColor = Color.Yellow ); hp.AddTrigger(20.0, TriggerDirection.Down, () => hpbar.BarColor = Color.Red ); hp.MaxValue = 100.0; hp.MinValue = 0.0; hp.LowerLimit += () => OnUnitFlee(unit); hpbar.Color = Color.DarkGray; hpbar.BarColor = Color.BrightGreen; hpbar.BorderColor = Color.Black; hpbar.Y = 15; Add(unit, 1); unit.Add(hpbar); if (team==PlayerTeam.Humans) { unit.CollisionIgnoreGroup = 1; switch (type) { case UnitType.Preparer: unit.Image = hPreparer; break; case UnitType.Repeller: unit.Image = hRepeller; break; case UnitType.Gatherer: unit.Image = hGatherer; break; default: break; } } else { unit.CollisionIgnoreGroup = 2; switch (type) { case UnitType.Preparer: unit.Image = mPreparer; break; case UnitType.Repeller: unit.Image = mRepeller; break; case UnitType.Gatherer: unit.Image = mGatherer; break; default: break; } } // Start moving to deploy point and add to deploy queue. MoveToDeployQueue(team, unit, 0); AddCollisionHandler(unit, enemyTag, OnEnemiesCollide); }
void CreateMeterFactories(PlayerTeam team) { teams[team] = new PlayerData(); for (int i = 0; i < 3; i++) { Color barBaseColor = barColors[i]; // Next messy line just fetches enum value by index UnitType unit = (UnitType)(Enum.GetValues(typeof(UnitType)).GetValue(i)); // Target when a new unit is produced DoubleMeter targetMeter = new DoubleMeter(0); targetMeter.MaxValue = 100.0; //% targetMeter.Value = 33.3; //% teams[team].UnitCreationAllocation.Add(unit, targetMeter); ProgressBar targetBar = new ProgressBar(100, 30, targetMeter); targetBar.Angle = Angle.FromDegrees(90); targetBar.X = (i - 1) * 50; targetBar.Y = team == PlayerTeam.Humans ? Screen.Top - 55 : Screen.Bottom + 55; targetBar.BorderColor = Color.Black; var bcol = Color.Darker(barBaseColor, 75); bcol.AlphaComponent = 125; targetBar.BarColor = bcol; targetBar.BorderColor = Color.Black; Add(targetBar, 2); Mouse.ListenOn(targetBar, MouseButton.Left, ButtonState.Released, () => ChangeResouceAllocation(team, targetBar), "Click do change resource allocation"); // Progress to target (when a new unit is produced) DoubleMeter progressMeter = new DoubleMeter(0); progressMeter.MaxValue = 100.0; //% progressMeter.Value = 1.0; //% teams[team].UnitCreationProgress.Add(unit, progressMeter); //progressMeter.AddOverTime(maxGameLenInS * trickleRate, maxGameLenInS); ProgressBar progressBar = new ProgressBar(100, 30, progressMeter); progressBar.Angle = targetBar.Angle; progressBar.Position = targetBar.Position; progressBar.BorderColor = Color.Black; progressBar.Color = Color.Darker(barBaseColor, 150); progressBar.BarColor = barBaseColor; Add(progressBar, 1); progressMeter.AddTrigger(100.0, TriggerDirection.Up, () => CreateNewUnit( team, unit, targetBar.Position + new Vector(0, team == PlayerTeam.Humans ? -65 : 65), GatherPoints[team] )); } switch (team) { case PlayerTeam.Humans: AddButtons(team, GatherPoints[team], 3); break; case PlayerTeam.Monsters: AddButtons(team, GatherPoints[team], 3); break; } }