From c8f2ffb108ba9f1efd9d0d880c68fbdf7c1abdca Mon Sep 17 00:00:00 2001 From: Glatzemann Date: Wed, 29 Aug 2012 12:32:14 +0000 Subject: [PATCH] - added basic support for GameComponents (update- and draw-order missing) --- ANX.Framework/Game.cs | 58 ++++++++++++++++++++---- ANX.Framework/GameComponent.cs | 16 +++---- ANX.Framework/GameComponentCollection.cs | 52 +++++++++++++++------ 3 files changed, 92 insertions(+), 34 deletions(-) diff --git a/ANX.Framework/Game.cs b/ANX.Framework/Game.cs index 2c3a93ec..b45074fa 100644 --- a/ANX.Framework/Game.cs +++ b/ANX.Framework/Game.cs @@ -5,6 +5,7 @@ using ANX.Framework.Content; using ANX.Framework.Graphics; using ANX.Framework.NonXNA; using ANX.Framework.NonXNA.PlatformSystem; +using System.Collections.Generic; #endregion // Using Statements @@ -36,6 +37,9 @@ namespace ANX.Framework private ContentManager content; + private GameComponentCollection components; + private List drawableGameComponents; + // Events public event EventHandler Activated; public event EventHandler Deactivated; @@ -77,11 +81,20 @@ namespace ANX.Framework this.inactiveSleepTime = TimeSpan.Zero; this.targetElapsedTime = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / 60L); // default is 1/60s + //TODO: implement draw- and update-order handling of GameComponents + this.components = new GameComponentCollection(); + this.components.ComponentAdded += new EventHandler(components_ComponentAdded); + this.components.ComponentRemoved += new EventHandler(components_ComponentRemoved); + this.drawableGameComponents = new List(); + Logger.Info("finished initializing new Game class"); } ~Game() { + this.components.ComponentAdded -= components_ComponentAdded; + this.components.ComponentRemoved -= components_ComponentRemoved; + //TODO: implement } @@ -130,12 +143,24 @@ namespace ANX.Framework protected virtual void Update(GameTime gameTime) { - + foreach (IUpdateable updateable in this.components) + { + if (updateable.Enabled) + { + updateable.Update(gameTime); + } + } } protected virtual void Draw(GameTime gameTime) { - + foreach (IDrawable drawable in this.drawableGameComponents) + { + if (drawable.Visible) + { + drawable.Draw(gameTime); + } + } } protected virtual void LoadContent() @@ -446,13 +471,11 @@ namespace ANX.Framework } } - public GameComponentCollection Components - { - get - { - throw new NotImplementedException(); - } - } + public GameComponentCollection Components + { + get; + private set; + } public void Dispose() { @@ -483,5 +506,22 @@ namespace ANX.Framework { throw new NotImplementedException(); } + + private void components_ComponentRemoved(object sender, GameComponentCollectionEventArgs e) + { + if (e.GameComponent is IDrawable) + { + drawableGameComponents.Remove(e.GameComponent); + } + } + + private void components_ComponentAdded(object sender, GameComponentCollectionEventArgs e) + { + if (e.GameComponent is IDrawable) + { + drawableGameComponents.Add(e.GameComponent); + } + } + } } diff --git a/ANX.Framework/GameComponent.cs b/ANX.Framework/GameComponent.cs index 70955e74..b7d9aeed 100644 --- a/ANX.Framework/GameComponent.cs +++ b/ANX.Framework/GameComponent.cs @@ -13,6 +13,12 @@ namespace ANX.Framework public class GameComponent : IGameComponent, IUpdateable, IDisposable { private bool enabled = true; + private int updateOrder; + private Game game; + + public event EventHandler EnabledChanged; + public event EventHandler UpdateOrderChanged; + public event EventHandler Disposed; public bool Enabled { @@ -27,8 +33,6 @@ namespace ANX.Framework } } - private int updateOrder; - public int UpdateOrder { get { return updateOrder; } @@ -42,19 +46,11 @@ namespace ANX.Framework } } - private Game game; - public Game Game { get { return game; } } - public event EventHandler EnabledChanged; - - public event EventHandler UpdateOrderChanged; - - public event EventHandler Disposed; - public GameComponent(Game game) { this.game = game; diff --git a/ANX.Framework/GameComponentCollection.cs b/ANX.Framework/GameComponentCollection.cs index 4113d0f9..83b38cb1 100644 --- a/ANX.Framework/GameComponentCollection.cs +++ b/ANX.Framework/GameComponentCollection.cs @@ -12,43 +12,65 @@ namespace ANX.Framework { public sealed class GameComponentCollection : Collection { + #region Events public event EventHandler ComponentAdded; public event EventHandler ComponentRemoved; + #endregion + public GameComponentCollection() { - throw new NotImplementedException(); + // nothing to do here } protected override void ClearItems() { - throw new NotImplementedException(); + for (int i = 0; i < base.Count; i++) + { + OnComponentRemoved(base[i]); + } + + base.Clear(); } protected override void InsertItem(int index, IGameComponent item) { - throw new NotImplementedException(); - } + if (item == null) + { + throw new ArgumentNullException("item"); + } - private void OnComponentAdded(GameComponentCollectionEventArgs eventArgs) - { - throw new NotImplementedException(); - } - - private void OnComponentRemoved(GameComponentCollectionEventArgs eventArgs) - { - throw new NotImplementedException(); + base.Insert(index, item); + OnComponentAdded(item); } protected override void RemoveItem(int index) { - throw new NotImplementedException(); + IGameComponent component = base[index]; + base.Remove(component); + OnComponentRemoved(component); } protected override void SetItem(int index, IGameComponent item) { - throw new NotImplementedException(); + base[index] = item; + OnComponentAdded(item); + } + + private void OnComponentAdded(IGameComponent component) + { + if (ComponentAdded != null) + { + ComponentAdded(this, new GameComponentCollectionEventArgs(component)); + } + } + + private void OnComponentRemoved(IGameComponent component) + { + if (ComponentRemoved != null) + { + ComponentRemoved(this, new GameComponentCollectionEventArgs(component)); + } } } - }