Refactoring, added more logging, minor command structure change.

This commit is contained in:
Harrison Deng 2020-07-05 23:32:03 -05:00
parent 63a31c491d
commit b2a47ebefc
5 changed files with 43 additions and 37 deletions

View File

@ -163,7 +163,7 @@ namespace SlatedGameToolkit.Framework {
timePassedFromLastUpdate += difference;
while (timePassedFromLastUpdate > updateDeltaTime) {
//Updates.
manager.update(updateDeltaTime.TotalSeconds <= 0 ? timePassedFromLastUpdate.TotalSeconds : updateDeltaTime.TotalSeconds);
manager.Update(updateDeltaTime.TotalSeconds <= 0 ? timePassedFromLastUpdate.TotalSeconds : updateDeltaTime.TotalSeconds);
timePassedFromLastUpdate -= updateDeltaTime;
if (updateDeltaTime.TotalSeconds <= 0) {
timePassedFromLastUpdate = TimeSpan.Zero;
@ -174,14 +174,14 @@ namespace SlatedGameToolkit.Framework {
timePassedFromLastRender += difference;
if (timePassedFromLastRender > frameDeltaTime) {
//Draw calls.
manager.render(updateDeltaTime.TotalSeconds <= 0 ? updateDeltaTime.TotalSeconds : (timePassedFromLastUpdate / updateDeltaTime));
manager.Render(updateDeltaTime.TotalSeconds <= 0 ? updateDeltaTime.TotalSeconds : (timePassedFromLastUpdate / updateDeltaTime));
timePassedFromLastRender = TimeSpan.Zero;
} else {
Thread.Yield();
}
}
stopped = true;
manager.Dispose();
manager.Deinitialize();
SDL.SDL_Quit();
SoLoudEngine.deinit();
WindowContextsManager.DisposeAllWindowContexts();

View File

@ -4,7 +4,7 @@ namespace SlatedGameToolkit.Framework.Logging
{
FATAL,
INFO,
DEBUG,
WARNING,
DEBUG,
}
}

View File

@ -5,18 +5,18 @@ using System.Threading;
using SlatedGameToolkit.Framework.Graphics.Window;
using SlatedGameToolkit.Framework.StateSystem.States;
using SlatedGameToolkit.Framework.Utilities;
using SlatedGameToolkit.Framework.Graphics;
using SlatedGameToolkit.Framework.Graphics.OpenGL;
using SlatedGameToolkit.Framework.Logging;
using System.Collections.Concurrent;
namespace SlatedGameToolkit.Framework.StateSystem
{
public sealed class StateManager : IDisposable {
public sealed class StateManager {
public Thread thread;
public Color backgroundColour;
private IState currentState;
private IState nextState;
private Dictionary<string, IState> states;
private ConcurrentDictionary<string, IState> states;
/// <summary>
/// Instantiates a game state manager with an initial state, and a set of states to be added at the start.
@ -28,17 +28,18 @@ namespace SlatedGameToolkit.Framework.StateSystem
internal StateManager() {
backgroundColour = Color.Orange;
this.states = new Dictionary<string, IState>();
this.states = new ConcurrentDictionary<string, IState>();
}
internal void Initialize(IState initialState) {
if (initialState == null) throw new ArgumentNullException("initialState");
Logger.Log("Initialized state manager with state: " + initialState.getName());
thread = Thread.CurrentThread;
currentState = initialState;
addState(initialState);
AddState(initialState);
}
internal void update(double timeStep) {
internal void Update(double timeStep) {
if (nextState != null) {
if (currentState.Deactivate() & nextState.Activate()) {
currentState = nextState;
@ -48,7 +49,7 @@ namespace SlatedGameToolkit.Framework.StateSystem
currentState.Update(timeStep);
}
internal void render(double delta) {
internal void Render(double delta) {
WindowContext windowContext = WindowContextsManager.CurrentWindowContext;
windowContext.Context.ClearColor(backgroundColour.RedAsFloat(), backgroundColour.GreenAsFloat(), backgroundColour.BlueAsFloat(), 1f);
windowContext.Context.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
@ -60,7 +61,7 @@ namespace SlatedGameToolkit.Framework.StateSystem
/// Begins a state change. The current stage will be notified, and so will the state that is being changed to.
/// </summary>
/// <param name="name">The name of the state that we are turning to.</param>
public void changeState(string name) {
public void ChangeState(string name) {
if (thread != Thread.CurrentThread) throw new ThreadStateException("State cannot be changed from a different thread.");
if (!states.TryGetValue(name, out nextState)) throw new ArgumentException("The requested state to change to does not exist in this manager.");
}
@ -73,12 +74,12 @@ namespace SlatedGameToolkit.Framework.StateSystem
/// </summary>
/// <param name="states">The states to add.</param>
/// <returns>True if all the states were unique, and false if there were repetitions determined by name.</returns>
public bool addStates(IState[] states) {
public bool AddStates(IState[] states) {
if (states == null || states.Length == 0) throw new ArgumentException("The array of states cannot be null, and cannot be of size 0");
bool unique = true;
foreach (IState state in states)
{
unique = unique && addState(state);
unique = unique && AddState(state);
}
return unique;
}
@ -90,13 +91,11 @@ namespace SlatedGameToolkit.Framework.StateSystem
/// </summary>
/// <param name="state">The state to be added to this manager.</param>
/// <returns>False if a state of this name has already been registered.</returns>
public bool addState(IState state) {
public bool AddState(IState state) {
if (thread != Thread.CurrentThread) throw new ThreadStateException("Cannot add a state from a different thread.");
try {
Logger.Log("Adding state: " + state.getName(), LogLevel.WARNING);
this.states.Add(state.getName(), state);
} catch (ArgumentException) {
return false;
Logger.Log("Adding state: " + state.getName(), LogLevel.DEBUG);
if (!this.states.TryAdd(state.getName(), state)) {
Logger.Log(string.Format("State with name \"{0}\" already exists in manager.", state.getName()), LogLevel.WARNING);
}
state.Initialize(this);
return true;
@ -109,7 +108,7 @@ namespace SlatedGameToolkit.Framework.StateSystem
/// </summary>
/// <param name="name">The name of the state.</param>
/// <returns>False if the state is being used, or the state doesn't exist.</returns>
public bool removeState(string name) {
public bool RemoveState(string name) {
if (thread != Thread.CurrentThread) throw new ThreadStateException("Cannot remove a state from a different thread.");
if (states[name] == currentState) return false;
IState state = states[name];
@ -120,27 +119,26 @@ namespace SlatedGameToolkit.Framework.StateSystem
Logger.Log(e.ToString(), LogLevel.WARNING);
Logger.Log("Failed to deinitialize state: " + state.getName(), LogLevel.WARNING);
}
return states.Remove(name);
IState removedState;
return states.Remove(name, out removedState);
}
/// <summary>
/// Removes all the states in this state manager except for the current one.
/// Disposes of the removed states.
/// Deinitializes the removed states.
/// </summary>
public void removeAllStates() {
Logger.Log("Beginning to remove all states...", LogLevel.DEBUG);
public void RemoveAllStates() {
foreach (String state in this.states.Keys)
{
removeState(state);
RemoveState(state);
}
Logger.Log("Completed removing all states...", LogLevel.DEBUG);
}
public void Dispose()
{
internal void Deinitialize() {
if (currentState == null) return;
currentState = null;
removeAllStates();
RemoveAllStates();
Logger.Log("Deinitializing state manager.");
}
}
}

View File

@ -10,7 +10,7 @@ namespace SlatedGameToolkit.Tools.Commands
public class GraphicalPlaygroundCommand : IInvocable
{
private readonly string[] invokers = new string[] {"playground"};
private ConsoleLogListener logListener;
private ConsolePlaygroundListener logListener;
private bool debugging;
public bool Execute(IInteractable interactable, string[] args)
@ -22,8 +22,6 @@ namespace SlatedGameToolkit.Tools.Commands
interactable.Tell("Engine is already running!");
return true;
}
Logger.AddLogListener((logListener = new ConsoleLogListener(interactable as ConsoleInteraction)));
logListener.Debug = debugging;
GameEngine.Ignite(new MainState());
return true;
} else if (args[0].Equals("stop")) {
@ -31,7 +29,6 @@ namespace SlatedGameToolkit.Tools.Commands
interactable.Tell("Engine was never running!");
return true;
}
Logger.RemoveLogListener(logListener);
GameEngine.Stop();
return true;
} else if (args[0].Equals("status")) {
@ -49,6 +46,17 @@ namespace SlatedGameToolkit.Tools.Commands
interactable.Tell(string.Format("Debug will be turned {0} when playground is started.", debugging ? "on" : "off"));
}
return true;
} else if (args[0].Equals("log")) {
if (logListener == null) {
Logger.AddLogListener((logListener = new ConsolePlaygroundListener(interactable as ConsoleInteraction)));
logListener.Debug = debugging;
interactable.Tell("Listening to game engine's logging.");
} else {
Logger.RemoveLogListener(logListener);
logListener = null;
interactable.Tell("Stopped listening to game engine's logging.");
}
return true;
}
return false;
}

View File

@ -4,21 +4,21 @@ using SlatedGameToolkit.Tools.CommandSystem.Interaction;
namespace SlatedGameToolkit.Tools.Utilities.Playground
{
public class ConsoleLogListener : ILogListener
public class ConsolePlaygroundListener : ILogListener
{
public bool Debug { get; set; }
public LogLevel Level => Debug ? LogLevel.DEBUG : LogLevel.INFO;
private ConsoleInteraction interaction;
public ConsoleLogListener(ConsoleInteraction interaction = null) {
public ConsolePlaygroundListener(ConsoleInteraction interaction = null) {
this.interaction = interaction;
}
public void LogMesesage(string message, DateTime time, LogLevel level)
{
Console.SetCursorPosition(0, Console.CursorTop);
Console.WriteLine(string.Format("Playground [{0}] [{1}]: {2}", level, time.ToString("H:mm:ss"), message));
Console.WriteLine(string.Format("Engine [{0}] [{1}]: {2}", level, time.ToString("H:mm:ss"), message));
if (interaction != null && interaction.Listening) {
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(interaction.Prefix + "> ");