Refactor, added state manager, abstract state, game state, implemented pipeline based on architecture drawing
work on relieving circular dependencies in the future
This commit is contained in:
parent
16733fdb0e
commit
631f9e3612
@ -29,7 +29,12 @@ add_executable(Pycron src/main.cpp
|
|||||||
src/Utilities.cpp
|
src/Utilities.cpp
|
||||||
src/Utilities.h
|
src/Utilities.h
|
||||||
src/Graphics/Graphics.cpp
|
src/Graphics/Graphics.cpp
|
||||||
src/Graphics/Graphics.h)
|
src/Graphics/Graphics.h
|
||||||
|
src/StateManager.cpp
|
||||||
|
src/StateManager.h
|
||||||
|
src/State.h
|
||||||
|
src/GameState.cpp
|
||||||
|
src/GameState.h)
|
||||||
|
|
||||||
add_subdirectory(dependencies/pocketpy)
|
add_subdirectory(dependencies/pocketpy)
|
||||||
# Declaring our executable
|
# Declaring our executable
|
||||||
|
|||||||
13453
architecture.excalidraw
Normal file
13453
architecture.excalidraw
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 2.8 MiB After Width: | Height: | Size: 9.7 MiB |
27
src/GameState.cpp
Normal file
27
src/GameState.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
//
|
||||||
|
// Created by Bobby Lucero on 4/25/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "GameState.h"
|
||||||
|
|
||||||
|
GameState::GameState(StateManager *stateManager) : State(stateManager) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GameState::Draw(Graphics *graphics) {
|
||||||
|
graphics->Text("Test", 10, 10, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameState::OnEnter() {
|
||||||
|
//TODO: Python preprocess scripts
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameState::OnExit() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameState::onKeyPressed(int key) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
13
src/GameState.h
Normal file
13
src/GameState.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "State.h"
|
||||||
|
class GameState : public State {
|
||||||
|
|
||||||
|
public:
|
||||||
|
GameState(StateManager* stateManager);
|
||||||
|
|
||||||
|
void Draw(Graphics* graphics) override;
|
||||||
|
void OnEnter() override;
|
||||||
|
void OnExit() override;
|
||||||
|
void onKeyPressed(int key) override;
|
||||||
|
};
|
||||||
|
|
||||||
@ -26,10 +26,10 @@ Graphics::Graphics(int screenWidth, int screenHeight, int startupScale) : screen
|
|||||||
calculateScreenPositionInWindow();
|
calculateScreenPositionInWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Graphics::draw(pkpy::VM* vm) {
|
void Graphics::draw(StateManager* stateManager) {
|
||||||
|
|
||||||
vm->builtins->attr().set("mouseX", pkpy::py_var(vm, mouseX()));
|
// vm->builtins->attr().set("mouseX", pkpy::py_var(vm, mouseX()));
|
||||||
vm->builtins->attr().set("mouseY", pkpy::py_var(vm, mouseY()));
|
// vm->builtins->attr().set("mouseY", pkpy::py_var(vm, mouseY()));
|
||||||
|
|
||||||
windowShouldClose = WindowShouldClose();
|
windowShouldClose = WindowShouldClose();
|
||||||
|
|
||||||
@ -40,17 +40,20 @@ void Graphics::draw(pkpy::VM* vm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BeginTextureMode(virtualScreen);
|
BeginTextureMode(virtualScreen);
|
||||||
//////////
|
// //////////
|
||||||
try{
|
// try{
|
||||||
if(updateFunction != nullptr)
|
// if(updateFunction != nullptr)
|
||||||
vm->call(updateFunction);
|
// vm->call(updateFunction);
|
||||||
} catch(pkpy::Exception e){
|
// } catch(pkpy::Exception e){
|
||||||
std::cout << e.summary() << std::endl;
|
// std::cout << e.summary() << std::endl;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
// Circle(150,100,50,1);
|
||||||
|
// Text("Hello from C++", 120, 95, 9);
|
||||||
|
// //////////
|
||||||
|
|
||||||
|
stateManager->Draw(this);
|
||||||
|
|
||||||
Circle(150,100,50,1);
|
|
||||||
Text("Hello from C++", 120, 95, 9);
|
|
||||||
//////////
|
|
||||||
EndTextureMode();
|
EndTextureMode();
|
||||||
|
|
||||||
renderVirtualScreen();
|
renderVirtualScreen();
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
#include "pocketpy/vm.h"
|
#include "pocketpy/vm.h"
|
||||||
|
#include "../StateManager.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
class StateManager;
|
||||||
|
|
||||||
class Graphics {
|
class Graphics {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -39,7 +42,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
Graphics(int screenWidth, int screenHeight, int startupScale);
|
Graphics(int screenWidth, int screenHeight, int startupScale);
|
||||||
|
|
||||||
void draw(pkpy::VM* vm);
|
void draw(StateManager* stateManager);
|
||||||
|
|
||||||
void beginDraw();
|
void beginDraw();
|
||||||
void endDraw();
|
void endDraw();
|
||||||
|
|||||||
@ -28,6 +28,8 @@ Pycron::Pycron() {
|
|||||||
graphics = new Graphics{virtualScreenWidth, virtualScreenHeight, initialScale};
|
graphics = new Graphics{virtualScreenWidth, virtualScreenHeight, initialScale};
|
||||||
graphics->loadPalette("../resources/palette2.hex");
|
graphics->loadPalette("../resources/palette2.hex");
|
||||||
|
|
||||||
|
stateManager = new StateManager(this);
|
||||||
|
|
||||||
vm = new pkpy::VM();
|
vm = new pkpy::VM();
|
||||||
bindMethods(vm);
|
bindMethods(vm);
|
||||||
|
|
||||||
@ -61,7 +63,7 @@ void Pycron::StartGameLoop() {
|
|||||||
if (IsKeyPressed(KEY_F)) {
|
if (IsKeyPressed(KEY_F)) {
|
||||||
graphics->toggleFullScreen();
|
graphics->toggleFullScreen();
|
||||||
}
|
}
|
||||||
graphics->draw(vm);
|
graphics->draw(this->stateManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "pocketpy.h"
|
#include "pocketpy.h"
|
||||||
|
#include "StateManager.h"
|
||||||
#include "Graphics/Graphics.h"
|
#include "Graphics/Graphics.h"
|
||||||
|
|
||||||
|
class Graphics;
|
||||||
|
class StateManager;
|
||||||
|
|
||||||
class Pycron {
|
class Pycron {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -10,6 +14,7 @@ private:
|
|||||||
const int virtualScreenHeight = 203;
|
const int virtualScreenHeight = 203;
|
||||||
const int initialScale = 3;
|
const int initialScale = 3;
|
||||||
Graphics* graphics;
|
Graphics* graphics;
|
||||||
|
StateManager* stateManager;
|
||||||
pkpy::VM* vm;
|
pkpy::VM* vm;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
20
src/State.h
Normal file
20
src/State.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Graphics/Graphics.h"
|
||||||
|
#include "StateManager.h"
|
||||||
|
|
||||||
|
class Graphics;
|
||||||
|
class StateManager;
|
||||||
|
|
||||||
|
class State {
|
||||||
|
private:
|
||||||
|
StateManager* stateManager;
|
||||||
|
protected:
|
||||||
|
explicit State(StateManager* stateManager) : stateManager(stateManager){}
|
||||||
|
public:
|
||||||
|
virtual ~State() = default;
|
||||||
|
virtual void Draw(Graphics* graphics) = 0;
|
||||||
|
virtual void OnEnter() = 0;
|
||||||
|
virtual void OnExit() = 0;
|
||||||
|
virtual void onKeyPressed(int key) = 0;
|
||||||
|
};
|
||||||
32
src/StateManager.cpp
Normal file
32
src/StateManager.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
//
|
||||||
|
// Created by Bobby Lucero on 4/25/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "StateManager.h"
|
||||||
|
|
||||||
|
StateManager::StateManager(Pycron *pycron) : m_pycron(pycron){
|
||||||
|
gameState = new GameState(this);
|
||||||
|
m_currentState = gameState;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateManager::RequestStateChange(StateManager::StateType state) {
|
||||||
|
if(m_currentState){
|
||||||
|
m_currentState->OnExit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(state == StateType::GAME){
|
||||||
|
m_currentState = gameState;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_currentState){
|
||||||
|
m_currentState->OnEnter();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateManager::Draw(Graphics *graphics) {
|
||||||
|
if(m_currentState){
|
||||||
|
m_currentState->Draw(graphics);
|
||||||
|
}
|
||||||
|
}
|
||||||
40
src/StateManager.h
Normal file
40
src/StateManager.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "State.h"
|
||||||
|
#include "Pycron.h"
|
||||||
|
#include "Graphics/Graphics.h"
|
||||||
|
#include "GameState.h"
|
||||||
|
|
||||||
|
class Pycron;
|
||||||
|
class State;
|
||||||
|
class Graphics;
|
||||||
|
class GameState;
|
||||||
|
|
||||||
|
class StateManager {
|
||||||
|
private:
|
||||||
|
enum StateType {
|
||||||
|
EDITOR,
|
||||||
|
MENU,
|
||||||
|
GAME
|
||||||
|
};
|
||||||
|
|
||||||
|
State* m_currentState;
|
||||||
|
Pycron* m_pycron;
|
||||||
|
|
||||||
|
GameState* gameState;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit StateManager(Pycron* pycron);
|
||||||
|
|
||||||
|
void RequestStateChange(StateType state);
|
||||||
|
|
||||||
|
void RequestLoadGame();
|
||||||
|
void RequestRunGame();
|
||||||
|
void RequestStopGame();
|
||||||
|
|
||||||
|
void Draw(Graphics* graphics);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1,4 +1,3 @@
|
|||||||
using namespace std;
|
|
||||||
#include "Pycron.h"
|
#include "Pycron.h"
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user