Rewrote Gamestate to be a class instead of an interface; Added layers
This commit is contained in:
		
							parent
							
								
									2f4e0ebfac
								
							
						
					
					
						commit
						e35688373e
					
				@ -9,7 +9,7 @@ int main(int argc, char* argv[]) {
 | 
			
		||||
	//app.setWindowIcon(...);
 | 
			
		||||
	// app.setWindowCursor(...);
 | 
			
		||||
 | 
			
		||||
	MainState* test = new MainState;
 | 
			
		||||
	MainState* test = new MainState(&app);
 | 
			
		||||
	app.addState(test, "Main State");
 | 
			
		||||
	app.addDefaultState("Main State");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,18 +1,22 @@
 | 
			
		||||
#include "MainState.h"
 | 
			
		||||
 | 
			
		||||
void MainState::onEnter(Application* app) {
 | 
			
		||||
MainState::MainState(Application* app) :
 | 
			
		||||
	Gamestate(app)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainState::onEnter() {
 | 
			
		||||
	Log("MainState onEnter!");
 | 
			
		||||
	m_app = app;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainState::update(double deltaTime) {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainState::render() {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainState::onExit() {
 | 
			
		||||
	Log("MainState onExit!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainState::update() {
 | 
			
		||||
	Log("MainState update!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainState::render() {
 | 
			
		||||
	Log("MainState render!");
 | 
			
		||||
}
 | 
			
		||||
@ -1,13 +1,16 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "NothinFancy.h"
 | 
			
		||||
 | 
			
		||||
class MainState : public nf::IGamestate {
 | 
			
		||||
class MainState : public nf::Gamestate {
 | 
			
		||||
public:
 | 
			
		||||
	void onEnter(Application* app) override;
 | 
			
		||||
	void onExit() override;
 | 
			
		||||
	MainState(Application* app);
 | 
			
		||||
 | 
			
		||||
	void update() override;
 | 
			
		||||
	void onEnter() override;
 | 
			
		||||
 | 
			
		||||
	void update(double deltaTime) override;
 | 
			
		||||
	void render() override;
 | 
			
		||||
 | 
			
		||||
	void onExit() override;
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
@ -192,6 +192,7 @@
 | 
			
		||||
  </ItemDefinitionGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClCompile Include="src\Application.cpp" />
 | 
			
		||||
    <ClCompile Include="src\Gamestate.cpp" />
 | 
			
		||||
    <ClCompile Include="src\IntroGamestate.cpp" />
 | 
			
		||||
    <ClCompile Include="src\Renderer\Drawable.cpp" />
 | 
			
		||||
    <ClCompile Include="src\Renderer\IndexBuffer.cpp" />
 | 
			
		||||
@ -205,7 +206,7 @@
 | 
			
		||||
    <ClInclude Include="src\include\Application.h" />
 | 
			
		||||
    <ClInclude Include="src\include\Config.h" />
 | 
			
		||||
    <ClInclude Include="src\include\Drawable.h" />
 | 
			
		||||
    <ClInclude Include="src\include\IGamestate.h" />
 | 
			
		||||
    <ClInclude Include="src\include\Gamestate.h" />
 | 
			
		||||
    <ClInclude Include="src\include\IndexBuffer.h" />
 | 
			
		||||
    <ClInclude Include="src\include\IntroGamestate.h" />
 | 
			
		||||
    <ClInclude Include="src\include\Input.h" />
 | 
			
		||||
 | 
			
		||||
@ -42,6 +42,9 @@
 | 
			
		||||
    <ClCompile Include="src\Renderer\Drawable.cpp">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
    <ClCompile Include="src\Gamestate.cpp">
 | 
			
		||||
      <Filter>Source Files</Filter>
 | 
			
		||||
    </ClCompile>
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ClInclude Include="src\include\Config.h">
 | 
			
		||||
@ -56,7 +59,7 @@
 | 
			
		||||
    <ClInclude Include="src\include\Application.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="src\include\IGamestate.h">
 | 
			
		||||
    <ClInclude Include="src\include\Gamestate.h">
 | 
			
		||||
      <Filter>Header Files</Filter>
 | 
			
		||||
    </ClInclude>
 | 
			
		||||
    <ClInclude Include="src\include\IntroGamestate.h">
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,11 @@ namespace nf {
 | 
			
		||||
		SetClassLongPtr(m_window, GCLP_HCURSOR, (LONG_PTR)hCursor);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Application::addState(IGamestate* state,const std::string& stateName) {
 | 
			
		||||
	Renderer* Application::getRenderer() const {
 | 
			
		||||
		return m_renderer;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Application::addState(Gamestate* state,const std::string& stateName) {
 | 
			
		||||
		if (m_states.find(stateName) == m_states.end()) {
 | 
			
		||||
			m_states[stateName] = state;
 | 
			
		||||
		}
 | 
			
		||||
@ -188,9 +192,10 @@ namespace nf {
 | 
			
		||||
		std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now();
 | 
			
		||||
		const std::chrono::duration<double> wait_time = std::chrono::nanoseconds(1000000000 / 60);
 | 
			
		||||
		auto next_time = start_time + wait_time;
 | 
			
		||||
		m_deltaTime = 0.0167;
 | 
			
		||||
		while (m_running) {
 | 
			
		||||
			start_time = std::chrono::steady_clock::now();
 | 
			
		||||
			m_currentState->update();
 | 
			
		||||
			m_currentState->update(m_deltaTime);
 | 
			
		||||
			m_currentState->render();
 | 
			
		||||
			m_renderer->doFrame();
 | 
			
		||||
			m_frames++;
 | 
			
		||||
@ -214,8 +219,8 @@ namespace nf {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Application::startIntroState() {
 | 
			
		||||
		m_sIntro = new IntroGamestate;
 | 
			
		||||
		m_sIntro->onEnter(this);
 | 
			
		||||
		m_sIntro = new IntroGamestate(this);
 | 
			
		||||
		m_sIntro->onEnter();
 | 
			
		||||
		m_currentState = m_sIntro;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -223,7 +228,7 @@ namespace nf {
 | 
			
		||||
		m_stateChange = false;
 | 
			
		||||
		m_currentState->onExit();
 | 
			
		||||
		m_currentState = m_states[m_nextState];
 | 
			
		||||
		m_currentState->onEnter(this);
 | 
			
		||||
		m_currentState->onEnter();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	LRESULT CALLBACK Application::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
 | 
			
		||||
@ -297,8 +302,8 @@ namespace nf {
 | 
			
		||||
	Application::~Application() {
 | 
			
		||||
		Log("Exiting NF application");
 | 
			
		||||
 | 
			
		||||
		for (std::pair<std::string, IGamestate*> state : m_states) {
 | 
			
		||||
			IGamestate* curr = state.second;
 | 
			
		||||
		for (std::pair<std::string, Gamestate*> state : m_states) {
 | 
			
		||||
			Gamestate* curr = state.second;
 | 
			
		||||
			delete curr;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										27
									
								
								NothinFancy/src/Gamestate.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								NothinFancy/src/Gamestate.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
#include "Gamestate.h"
 | 
			
		||||
 | 
			
		||||
#include "Application.h"
 | 
			
		||||
#include "Utility.h"
 | 
			
		||||
 | 
			
		||||
namespace nf {
 | 
			
		||||
	Gamestate::Gamestate(Application* app) {
 | 
			
		||||
		m_app = app;
 | 
			
		||||
		m_renderer = m_app->getRenderer();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Gamestate::onEnter() {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Gamestate::update(double deltaTime) {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Gamestate::render() {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Gamestate::onExit() {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -4,25 +4,29 @@
 | 
			
		||||
#include "Utility.h"
 | 
			
		||||
 | 
			
		||||
namespace nf {
 | 
			
		||||
	void IntroGamestate::onEnter(Application* app) {
 | 
			
		||||
	IntroGamestate::IntroGamestate(Application* app) :
 | 
			
		||||
		Gamestate(app),
 | 
			
		||||
		m_counter(0)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void IntroGamestate::onEnter() {
 | 
			
		||||
		Log("Intro onEnter!");
 | 
			
		||||
		m_app = app;
 | 
			
		||||
		counter = 0;
 | 
			
		||||
		m_counter = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	void IntroGamestate::update(double deltaTime) {
 | 
			
		||||
		if (m_counter >= 120) {
 | 
			
		||||
			m_app->changeState("Main State");
 | 
			
		||||
		}
 | 
			
		||||
		m_counter++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void IntroGamestate::render() {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void IntroGamestate::onExit() {
 | 
			
		||||
		Log("Intro onExit!");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void IntroGamestate::update() {
 | 
			
		||||
		Log("Intro update!");
 | 
			
		||||
		if (counter >= 120) {
 | 
			
		||||
			m_app->changeState("Main State");
 | 
			
		||||
		}
 | 
			
		||||
		counter++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void IntroGamestate::render() {
 | 
			
		||||
		Log("Intro render!");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -46,13 +46,31 @@ namespace nf {
 | 
			
		||||
		wglMakeCurrent(m_hdc, m_hglrc);
 | 
			
		||||
		wglSwapIntervalEXT(0);
 | 
			
		||||
		Log("OpenGL version: " + std::string((char*)glGetString(GL_VERSION)));
 | 
			
		||||
		glEnable(GL_DEPTH_TEST);
 | 
			
		||||
		glDepthFunc(GL_LESS);
 | 
			
		||||
		glEnable(GL_BLEND);
 | 
			
		||||
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 | 
			
		||||
		glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Renderer::render(const Drawable& in) {
 | 
			
		||||
		//TODO: Check identity
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void Renderer::doFrame() {
 | 
			
		||||
		glViewport(0, 0, m_app->getConfig().width, m_app->getConfig().height);
 | 
			
		||||
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 | 
			
		||||
 | 
			
		||||
		for (Drawable* draw : m_lGame) {
 | 
			
		||||
			Drawable& curr = *draw;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (Drawable* draw : m_lUI) {
 | 
			
		||||
			Drawable& curr = *draw;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		SwapBuffers(m_hdc);
 | 
			
		||||
 | 
			
		||||
		GLenum err = glGetError();
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,8 @@ namespace nf {
 | 
			
		||||
 | 
			
		||||
		void setWindowIcon(HANDLE hIcon);
 | 
			
		||||
		void setWindowCursor(HCURSOR hCursor);
 | 
			
		||||
		void addState(IGamestate* state, const std::string& stateName);
 | 
			
		||||
		Renderer* getRenderer() const;
 | 
			
		||||
		void addState(Gamestate* state, const std::string& stateName);
 | 
			
		||||
		void addDefaultState(const std::string& stateName);
 | 
			
		||||
		void run();
 | 
			
		||||
		void changeState(const std::string& stateName);
 | 
			
		||||
@ -59,11 +60,11 @@ namespace nf {
 | 
			
		||||
 | 
			
		||||
		//Inactive states to potentially be active during the Application's lifetime
 | 
			
		||||
		//Mapped to const char* to be referenced later in the frontend
 | 
			
		||||
		std::unordered_map<std::string, IGamestate*> m_states;
 | 
			
		||||
		IntroGamestate* m_sIntro;
 | 
			
		||||
		IGamestate* m_DefaultState;
 | 
			
		||||
		std::unordered_map<std::string, Gamestate*> m_states;
 | 
			
		||||
		Gamestate* m_sIntro;
 | 
			
		||||
		Gamestate* m_DefaultState;
 | 
			
		||||
		bool m_defaultStateAdded;
 | 
			
		||||
		IGamestate* m_currentState;
 | 
			
		||||
		Gamestate* m_currentState;
 | 
			
		||||
		bool m_stateChange;
 | 
			
		||||
		std::string m_nextState;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,20 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "VertexArray.h"
 | 
			
		||||
#include "Shader.h"
 | 
			
		||||
#include "IndexBuffer.h"
 | 
			
		||||
 | 
			
		||||
namespace nf {
 | 
			
		||||
	class Drawable {
 | 
			
		||||
		enum class DrawableType {
 | 
			
		||||
			NF_GAME, NF_UI
 | 
			
		||||
		};
 | 
			
		||||
	public:
 | 
			
		||||
		Drawable();
 | 
			
		||||
 | 
			
		||||
		~Drawable();
 | 
			
		||||
	private:
 | 
			
		||||
		virtual DrawableType identity();
 | 
			
		||||
 | 
			
		||||
		~Drawable();
 | 
			
		||||
	protected:
 | 
			
		||||
		//TODO: Add VAO, Shader, index buffer, etc.
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								NothinFancy/src/include/Gamestate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								NothinFancy/src/include/Gamestate.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace nf {
 | 
			
		||||
	class Application;
 | 
			
		||||
	class Renderer;
 | 
			
		||||
 | 
			
		||||
	class Gamestate {
 | 
			
		||||
	public:
 | 
			
		||||
		Gamestate(Application* app);
 | 
			
		||||
		Gamestate() = delete;
 | 
			
		||||
		Gamestate(const Gamestate& other) = delete;
 | 
			
		||||
 | 
			
		||||
		virtual void onEnter();
 | 
			
		||||
 | 
			
		||||
		virtual void update(double deltaTime);
 | 
			
		||||
		virtual void render();
 | 
			
		||||
 | 
			
		||||
		virtual void onExit();
 | 
			
		||||
	protected:
 | 
			
		||||
		Application* m_app;
 | 
			
		||||
		Renderer* m_renderer;
 | 
			
		||||
		//Resource identifier?
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
@ -1,18 +0,0 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace nf {
 | 
			
		||||
	class Application;
 | 
			
		||||
 | 
			
		||||
	class IGamestate {
 | 
			
		||||
	public:
 | 
			
		||||
		virtual void onEnter(Application* app) = 0;
 | 
			
		||||
		virtual void onExit() = 0;
 | 
			
		||||
 | 
			
		||||
		virtual void update() = 0;
 | 
			
		||||
		virtual void render() = 0;
 | 
			
		||||
 | 
			
		||||
		Application* m_app;
 | 
			
		||||
	private:
 | 
			
		||||
		//Resource identifier?
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
@ -1,16 +1,19 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "IGamestate.h"
 | 
			
		||||
#include "Gamestate.h"
 | 
			
		||||
 | 
			
		||||
namespace nf {
 | 
			
		||||
	class IntroGamestate : public IGamestate {
 | 
			
		||||
	class IntroGamestate : public Gamestate {
 | 
			
		||||
	public:
 | 
			
		||||
		void onEnter(Application* app) override;
 | 
			
		||||
		void onExit() override;
 | 
			
		||||
		IntroGamestate(Application* app);
 | 
			
		||||
 | 
			
		||||
		void update() override;
 | 
			
		||||
		void onEnter() override;
 | 
			
		||||
 | 
			
		||||
		void update(double deltaTime) override;
 | 
			
		||||
		void render() override;
 | 
			
		||||
 | 
			
		||||
		void onExit() override;
 | 
			
		||||
	private:
 | 
			
		||||
		int counter;
 | 
			
		||||
		int m_counter;
 | 
			
		||||
		//TODO: Flesh out intro gamestate
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
@ -11,6 +11,8 @@ namespace nf {
 | 
			
		||||
	public:
 | 
			
		||||
		Renderer(Application* app);
 | 
			
		||||
 | 
			
		||||
		void render(const Drawable& in);
 | 
			
		||||
 | 
			
		||||
		void doFrame();
 | 
			
		||||
 | 
			
		||||
		~Renderer();
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user