add some basic SDL initialization and cleanup

This commit is contained in:
Gered 2013-08-16 22:17:19 -04:00
parent 469e460a31
commit 1b4abf1bfe
3 changed files with 121 additions and 1 deletions

View file

@ -48,6 +48,7 @@
<Compile Include="Input\SDLMouse.cs" />
<Compile Include="IO\SDLFileSystem.cs" />
<Compile Include="SDLLogger.cs" />
<Compile Include="SDLLooper.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>

View file

@ -0,0 +1,119 @@
using System;
using SDL2;
using Blarg.GameFramework.Input;
using Blarg.GameFramework.IO;
namespace Blarg.GameFramework
{
public class SDLLooper : ILooper
{
bool _isSDLinited;
IntPtr _window;
IntPtr _glContext;
SDLKeyboard _keyboard;
SDLMouse _mouse;
SDLFileSystem _filesystem;
public SDLLooper()
{
}
public void Run(IGameApp gameApp)
{
if (gameApp == null)
throw new ArgumentNullException("gameApp");
Platform.Services.Logger.Info("Looper", "Running...");
if (!InitSDL())
{
Platform.Services.Logger.Error("Looper", "SDL initialization failed. Aborting.");
return;
}
}
private bool InitSDL()
{
Platform.Services.Logger.Info("Looper", "SDL initialization starting.");
SDL.SDL_version sdlVersion;
SDL.SDL_VERSION(out sdlVersion);
Platform.Services.Logger.Info("Looper", "SDL Runtime Version: {0}.{1}.{2}", sdlVersion.major, sdlVersion.minor, sdlVersion.patch);
Platform.Services.Logger.Info("Looper", "SDL Linked Version: {0}.{1}.{2}", SDL.SDL_MAJOR_VERSION, SDL.SDL_MINOR_VERSION, SDL.SDL_PATCHLEVEL);
if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO | SDL.SDL_INIT_AUDIO | SDL.SDL_INIT_GAMECONTROLLER | SDL.SDL_INIT_JOYSTICK | SDL.SDL_INIT_TIMER) == -1)
{
Platform.Services.Logger.Error("Looper", "SDL_Init() failed: {0}", SDL.SDL_GetError());
return false;
}
_keyboard = new SDLKeyboard();
Platform.Services.Logger.Info("Looper", "Keyboard input device ready.");
_mouse = new SDLMouse();
Platform.Services.Logger.Info("Looper", "Mouse input device ready.");
int numJoysticks = SDL.SDL_NumJoysticks();
Platform.Services.Logger.Info("Looper", "{0} joystick input devices found.", numJoysticks);
for (int i = 0; i < numJoysticks; ++i)
{
Platform.Services.Logger.Info("Looper", "Joystick #{0}. {1}:", (i + 1), SDL.SDL_JoystickNameForIndex(i));
IntPtr joystick = SDL.SDL_JoystickOpen(i);
if (joystick != IntPtr.Zero)
{
Platform.Services.Logger.Info("Looper", "\tAxes: {0}", SDL.SDL_JoystickNumAxes(joystick));
Platform.Services.Logger.Info("Looper", "\tBalls: {0}", SDL.SDL_JoystickNumBalls(joystick));
Platform.Services.Logger.Info("Looper", "\tHats: {0}", SDL.SDL_JoystickNumHats(joystick));
Platform.Services.Logger.Info("Looper", "\tButtons: {0}", SDL.SDL_JoystickNumButtons(joystick));
SDL.SDL_JoystickClose(joystick);
}
else
Platform.Services.Logger.Warn("Looper", "\tMore information could not be obtained.");
}
_filesystem = new SDLFileSystem();
Platform.Services.Logger.Info("Looper", "Filesystem access initialized.");
Platform.Services.Logger.Info("Looper", "SDL initialization finished.");
return true;
}
#region IDisposable
private void ReleaseSDL()
{
if (!_isSDLinited)
return;
if (_glContext != IntPtr.Zero)
{
SDL.SDL_GL_DeleteContext(_glContext);
_glContext = IntPtr.Zero;
}
if (_window != IntPtr.Zero)
{
SDL.SDL_DestroyWindow(_window);
_window = IntPtr.Zero;
}
SDL.SDL_Quit();
Platform.Services.Logger.Info("Looper", "SDL shutdown.");
}
~SDLLooper()
{
ReleaseSDL();
}
public void Dispose()
{
ReleaseSDL();
GC.SuppressFinalize(this);
}
#endregion
}
}

View file

@ -2,7 +2,7 @@ using System;
namespace Blarg.GameFramework
{
public interface ILooper
public interface ILooper : IDisposable
{
void Run(IGameApp gameApp);
}