events coming together

This commit is contained in:
Ben
2021-08-19 00:12:06 +01:00
parent fde9c91c9d
commit 83cf85c4c2
9 changed files with 130 additions and 69 deletions

View File

@@ -4,18 +4,23 @@ using Aeon::Core::App;
using Aeon::Core::Display;
using Aeon::Core::DisplayProperties;
using Aeon::Input::Input;
App::App( const DisplayProperties& props )
: mDisplay()
, mInput()
{
RegisterAsSink( "ENGINE_SYSTEM_CORE", 0 );
mDisplay.Create( props );
}
void App::Run()
{
// while ( !mSIGTERM )
while ( !mSIGTERM )
{
mInput.PollInput();
}
}
@@ -23,3 +28,8 @@ const Display& App::GetDisplay()
{
return mDisplay;
}
bool App::EventRecieved( GenericEvent& e )
{
return false;
}

View File

@@ -4,10 +4,13 @@
#include <string>
#include "Aeon/Core/Display.hpp"
#include "Aeon/Core/Events.hpp"
#include "Aeon/Input/Input.hpp"
namespace Aeon::Core {
class App {
class App : public EventListener
{
public:
App( const DisplayProperties& props );
@@ -17,10 +20,17 @@ public:
void PopLayer();
const Display& GetDisplay();
bool EventRecieved( GenericEvent& e ) override;
private:
Display mDisplay;
Aeon::Input::Input mInput;
private:
bool mSIGTERM = false;
};

View File

@@ -10,7 +10,7 @@ Display::Display()
: mWindow( nullptr )
, mContext( NULL )
{
RegisterAsSink( "ENGINE_DISPLAY_CORE", 0 );
}
Display::~Display()
@@ -77,3 +77,8 @@ void Display::Destroy()
mWidth = 0;
mHeight = 0;
}
bool Display::EventRecieved( GenericEvent& e )
{
return false;
}

View File

@@ -8,6 +8,8 @@ extern "C" {
#include <ThirdParty/glad.h>
}
#include "Aeon/Core/Events.hpp"
namespace Aeon::Core {
struct DisplayProperties
@@ -23,7 +25,7 @@ struct DisplayProperties
VSync( vSync ) { }
};
class Display
class Display : public EventListener
{
public:
Display();
@@ -36,6 +38,8 @@ public:
void Destroy();
bool EventRecieved( GenericEvent& e ) override;
private:
SDL_Window* mWindow;
SDL_GLContext mContext;

View File

@@ -41,7 +41,7 @@ EventDispatcher::EventDispatcher()
EventDispatcher::EventDispatcher( std::string system )
{
RegisterAsSource( system );
}
EventDispatcher::~EventDispatcher()

View File

@@ -22,28 +22,37 @@
namespace Aeon::Core {
/*
* Engine event systems / type
* ENGINE_SYSTEM_CORE - start, stop, pause, etc
* ENGINE_DISPLAY_CORE - window open, window close, etc
* DISPLAY_RESIZE (x, y) - rezise to x, y being new w, h
* DISPLAY_MOVE (x, y) - move to x, y
* DISPLAY_SHOW - no data
* DISPLAY_HIDE - no data
* DISPLAY_MINIMISED - no data
* DISPLAY_MAXIMISED - no data
* DISPLAY_CLOSED - no data
* DISPLAY_MOUSE_ENTER - no data
* DISPLAY_MOUSE_LEAVE - no data
* DISPLAY_FOCUS - no data
* DISPLAY_OUT_OF_FOCUS - no data
*
*/
struct GenericEvent
{
std::string Source;
std::string Sink;
std::string System;
std::string Type;
// can be empty
std::string Data;
bool Handled = false;
GenericEvent() { }
};
struct KeyboardEvent : public GenericEvent
{
int KeyCode;
int KeyStatus;
KeyboardEvent( int keyCode, int keyStatus )
: GenericEvent()
, KeyCode(keyCode)
, KeyStatus(keyStatus) { }
};
class EventListener
{
public:

View File

@@ -1,9 +1,13 @@
#include "Aeon/Input/Input.hpp"
#include <iostream>
#include "Aeon/Core/Events.hpp"
using Aeon::Input::Input;
Input::Input()
: mEvent()
{
}
@@ -15,6 +19,67 @@ Input::~Input()
void Input::PollInput()
{
while ( SDL_PollEvent( &mEvent ) )
{
switch ( mEvent.type )
{
case SDL_WINDOWEVENT:
switch ( mEvent.window.event )
{
case SDL_WINDOWEVENT_SHOWN:
SDL_Log( "Window %d shown", mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_HIDDEN:
SDL_Log( "Window %d hidden", mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_MOVED:
SDL_Log( "Window %d moved to %d,%d",
mEvent.window.windowID, mEvent.window.data1,
mEvent.window.data2 );
break;
case SDL_WINDOWEVENT_RESIZED:
SDL_Log( "Window %d resized to %dx%d",
mEvent.window.windowID, mEvent.window.data1,
mEvent.window.data2 );
break;
case SDL_WINDOWEVENT_SIZE_CHANGED:
SDL_Log( "Window %d size changed to %dx%d",
mEvent.window.windowID, mEvent.window.data1,
mEvent.window.data2 );
break;
case SDL_WINDOWEVENT_MINIMIZED:
SDL_Log( "Window %d minimized", mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_MAXIMIZED:
SDL_Log( "Window %d maximized", mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_RESTORED:
SDL_Log( "Window %d restored", mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_ENTER:
SDL_Log( "Mouse entered window %d",
mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_LEAVE:
SDL_Log( "Mouse left window %d", mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_FOCUS_GAINED:
SDL_Log( "Window %d gained keyboard focus",
mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_FOCUS_LOST:
SDL_Log( "Window %d lost keyboard focus",
mEvent.window.windowID );
break;
case SDL_WINDOWEVENT_CLOSE:
SDL_Log( "Window %d closed", mEvent.window.windowID );
break;
}
}
}
//Uint8* state = (Uint8*)SDL_GetKeyboardState( NULL );
//std::cout << state << std::endl;
//std::cout << std::endl;
}

View File

@@ -1,17 +1,23 @@
#ifndef AEON_INPUT_INPUT_H_
#define AEON_INPUT_INPUT_H_
#include <SDL.h>
#include "Aeon/Singleton.hpp"
namespace Aeon::Input {
class Input : public Aeon::Helpers::Singleton<Input>
class Input
{
public:
Input();
~Input();
void PollInput();
private:
SDL_Event mEvent;
};
}

View File

@@ -6,7 +6,7 @@
#include <Aeon/Aeon.hpp>
#include <Aeon/Core/Events.hpp>
class ExampleGame : public Aeon::Core::App
class ExampleGame : public Aeon::Core::App
{
public:
@@ -24,58 +24,10 @@ public:
};
class SomeSystem : public Aeon::Core::EventListener
{
public:
SomeSystem()
{
RegisterAsSink( "System1", 0 );
}
~SomeSystem() override
{
DeRegisterAsSink( "System1" );
}
bool EventRecieved( Aeon::Core::GenericEvent& e ) override
{
std::cout << e.Source << ":" << e.Type << ":" << e.Sink << ":" << e.Data << std::endl;
return false;
}
};
class SomeOtherSystem : public Aeon::Core::EventListener
{
public:
SomeOtherSystem()
{
RegisterAsSink( "System1", 0 );
}
~SomeOtherSystem() override
{
DeRegisterAsSink( "System1" );
}
bool EventRecieved( Aeon::Core::GenericEvent& e ) override
{
std::cout << e.Source << ":" << e.Type << ":" << e.Sink << ":" << e.Data << std::endl;
return false;
}
};
int main( int argc, char** argv )
{
ExampleGame game;
SomeSystem system1;
SomeOtherSystem system2;
Aeon::Core::EventDispatcher eventDispatcher;
eventDispatcher.RegisterAsSource( "System1" );
eventDispatcher.Dispatch( "bro" );
return 0;
}