add some basic SDL initialization and cleanup
This commit is contained in:
parent
469e460a31
commit
1b4abf1bfe
|
@ -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>
|
||||
|
|
119
Blarg.GameFramework.SDL2/SDLLooper.cs
Normal file
119
Blarg.GameFramework.SDL2/SDLLooper.cs
Normal 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
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@ using System;
|
|||
|
||||
namespace Blarg.GameFramework
|
||||
{
|
||||
public interface ILooper
|
||||
public interface ILooper : IDisposable
|
||||
{
|
||||
void Run(IGameApp gameApp);
|
||||
}
|
||||
|
|
Reference in a new issue