Scene switching API
This commit is contained in:
parent
6de3f0e8cf
commit
30cfa5ca71
|
@ -3,7 +3,8 @@
|
||||||
//#include "UITestScene.h"
|
//#include "UITestScene.h"
|
||||||
#include "ActionCode.h"
|
#include "ActionCode.h"
|
||||||
#include "McRFPy_API.h"
|
#include "McRFPy_API.h"
|
||||||
#include "PythonScene.h"
|
//#include "PythonScene.h"
|
||||||
|
#include "PyScene.h"
|
||||||
#include "UITestScene.h"
|
#include "UITestScene.h"
|
||||||
#include "Resources.h"
|
#include "Resources.h"
|
||||||
|
|
||||||
|
@ -11,7 +12,7 @@ GameEngine::GameEngine()
|
||||||
{
|
{
|
||||||
Resources::font.loadFromFile("./assets/JetbrainsMono.ttf");
|
Resources::font.loadFromFile("./assets/JetbrainsMono.ttf");
|
||||||
Resources::game = this;
|
Resources::game = this;
|
||||||
window_title = "McRogueFace - r/RoguelikeDev Tutorial Run";
|
window_title = "McRogueFace - 7DRL 2024 Engine Demo";
|
||||||
window.create(sf::VideoMode(1024, 768), window_title);
|
window.create(sf::VideoMode(1024, 768), window_title);
|
||||||
visible = window.getDefaultView();
|
visible = window.getDefaultView();
|
||||||
window.setFramerateLimit(30);
|
window.setFramerateLimit(30);
|
||||||
|
@ -27,6 +28,7 @@ GameEngine::GameEngine()
|
||||||
McRFPy_API::game = this;
|
McRFPy_API::game = this;
|
||||||
McRFPy_API::api_init();
|
McRFPy_API::api_init();
|
||||||
McRFPy_API::executePyString("import mcrfpy");
|
McRFPy_API::executePyString("import mcrfpy");
|
||||||
|
McRFPy_API::executeScript("scripts/game.py");
|
||||||
//McRFPy_API::executePyString("from UIMenu import *");
|
//McRFPy_API::executePyString("from UIMenu import *");
|
||||||
//McRFPy_API::executePyString("from Grid import *");
|
//McRFPy_API::executePyString("from Grid import *");
|
||||||
|
|
||||||
|
@ -38,12 +40,14 @@ GameEngine::GameEngine()
|
||||||
}
|
}
|
||||||
|
|
||||||
Scene* GameEngine::currentScene() { return scenes[scene]; }
|
Scene* GameEngine::currentScene() { return scenes[scene]; }
|
||||||
void GameEngine::changeScene(std::string s) { std::cout << "Current scene is now '" << s << "'\n"; scene = s; }
|
void GameEngine::changeScene(std::string s) { /*std::cout << "Current scene is now '" << s << "'\n";*/ scene = s; }
|
||||||
void GameEngine::quit() { running = false; }
|
void GameEngine::quit() { running = false; }
|
||||||
void GameEngine::setPause(bool p) { paused = p; }
|
void GameEngine::setPause(bool p) { paused = p; }
|
||||||
sf::Font & GameEngine::getFont() { /*return font; */ return Resources::font; }
|
sf::Font & GameEngine::getFont() { /*return font; */ return Resources::font; }
|
||||||
sf::RenderWindow & GameEngine::getWindow() { return window; }
|
sf::RenderWindow & GameEngine::getWindow() { return window; }
|
||||||
|
|
||||||
|
void GameEngine::createScene(std::string s) { scenes[s] = new PyScene(this); }
|
||||||
|
|
||||||
void GameEngine::run()
|
void GameEngine::run()
|
||||||
{
|
{
|
||||||
float fps = 0.0;
|
float fps = 0.0;
|
||||||
|
@ -72,6 +76,7 @@ void GameEngine::sUserInput()
|
||||||
int actionCode = 0;
|
int actionCode = 0;
|
||||||
|
|
||||||
if (event.type == sf::Event::Closed) { running = false; continue; }
|
if (event.type == sf::Event::Closed) { running = false; continue; }
|
||||||
|
// TODO: add resize event to Scene to react; call it after constructor too, maybe
|
||||||
else if (event.type == sf::Event::Resized) {
|
else if (event.type == sf::Event::Resized) {
|
||||||
sf::FloatRect area(0.f, 0.f, event.size.width, event.size.height);
|
sf::FloatRect area(0.f, 0.f, event.size.width, event.size.height);
|
||||||
visible = sf::View(area);
|
visible = sf::View(area);
|
||||||
|
|
|
@ -11,7 +11,6 @@ class GameEngine
|
||||||
{
|
{
|
||||||
sf::RenderWindow window;
|
sf::RenderWindow window;
|
||||||
sf::Font font;
|
sf::Font font;
|
||||||
std::string scene;
|
|
||||||
std::map<std::string, Scene*> scenes;
|
std::map<std::string, Scene*> scenes;
|
||||||
bool running = true;
|
bool running = true;
|
||||||
bool paused = false;
|
bool paused = false;
|
||||||
|
@ -22,9 +21,11 @@ class GameEngine
|
||||||
std::string window_title;
|
std::string window_title;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
std::string scene;
|
||||||
GameEngine();
|
GameEngine();
|
||||||
Scene* currentScene();
|
Scene* currentScene();
|
||||||
void changeScene(std::string);
|
void changeScene(std::string);
|
||||||
|
void createScene(std::string);
|
||||||
void quit();
|
void quit();
|
||||||
void setPause(bool);
|
void setPause(bool);
|
||||||
sf::Font & getFont();
|
sf::Font & getFont();
|
||||||
|
|
|
@ -21,7 +21,7 @@ bool McRFPy_API::do_camfollow;
|
||||||
EntityManager McRFPy_API::entities;
|
EntityManager McRFPy_API::entities;
|
||||||
|
|
||||||
static PyMethodDef mcrfpyMethods[] = {
|
static PyMethodDef mcrfpyMethods[] = {
|
||||||
|
/*
|
||||||
{"createMenu", McRFPy_API::_createMenu, METH_VARARGS,
|
{"createMenu", McRFPy_API::_createMenu, METH_VARARGS,
|
||||||
"Create a new uimenu (name_str, x, y, w, h)"},
|
"Create a new uimenu (name_str, x, y, w, h)"},
|
||||||
|
|
||||||
|
@ -42,13 +42,13 @@ static PyMethodDef mcrfpyMethods[] = {
|
||||||
|
|
||||||
{"createTexture", McRFPy_API::_createTexture, METH_VARARGS,
|
{"createTexture", McRFPy_API::_createTexture, METH_VARARGS,
|
||||||
"Create a new texture (filename_str, grid_size, width, height) - grid_size is in pixels (only square sprites for now), width and height are in tiles"},
|
"Create a new texture (filename_str, grid_size, width, height) - grid_size is in pixels (only square sprites for now), width and height are in tiles"},
|
||||||
|
*/
|
||||||
{"registerPyAction", McRFPy_API::_registerPyAction, METH_VARARGS,
|
{"registerPyAction", McRFPy_API::_registerPyAction, METH_VARARGS,
|
||||||
"Register a callable Python object to correspond to an action string. (actionstr, callable)"},
|
"Register a callable Python object to correspond to an action string. (actionstr, callable)"},
|
||||||
|
|
||||||
{"registerInputAction", McRFPy_API::_registerInputAction, METH_VARARGS,
|
{"registerInputAction", McRFPy_API::_registerInputAction, METH_VARARGS,
|
||||||
"Register a SFML input code to correspond to an action string. (input_code, actionstr)"},
|
"Register a SFML input code to correspond to an action string. (input_code, actionstr)"},
|
||||||
|
/*
|
||||||
{"createGrid", McRFPy_API::_createGrid, METH_VARARGS,
|
{"createGrid", McRFPy_API::_createGrid, METH_VARARGS,
|
||||||
"create a new grid (title, grid_x, grid_y, grid_size, x, y, w, h). grid_x and grid_y are the width and height in squares. grid_size is the pixel w/h of sprites on the grid. x,y are the grid's screen position. w,h are the grid's screen size" },
|
"create a new grid (title, grid_x, grid_y, grid_size, x, y, w, h). grid_x and grid_y are the width and height in squares. grid_size is the pixel w/h of sprites on the grid. x,y are the grid's screen position. w,h are the grid's screen size" },
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ static PyMethodDef mcrfpyMethods[] = {
|
||||||
"callback: called when the animation completes\n"
|
"callback: called when the animation completes\n"
|
||||||
"loop: if True, animation repeats; if False, animation is deleted\n"
|
"loop: if True, animation repeats; if False, animation is deleted\n"
|
||||||
"frames: if animating a sprite, list the frames. For other data types, the value will change in discrete steps at a rate of duration/len(frames).\n"},
|
"frames: if animating a sprite, list the frames. For other data types, the value will change in discrete steps at a rate of duration/len(frames).\n"},
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
static PyObject* _createSoundBuffer(PyObject*, PyObject*);
|
static PyObject* _createSoundBuffer(PyObject*, PyObject*);
|
||||||
static PyObject* _loadMusic(PyObject*, PyObject*);
|
static PyObject* _loadMusic(PyObject*, PyObject*);
|
||||||
|
@ -86,12 +86,14 @@ static PyMethodDef mcrfpyMethods[] = {
|
||||||
{"playSound", McRFPy_API::_playSound, METH_VARARGS, "(int)"},
|
{"playSound", McRFPy_API::_playSound, METH_VARARGS, "(int)"},
|
||||||
{"getMusicVolume", McRFPy_API::_getMusicVolume, METH_VARARGS, ""},
|
{"getMusicVolume", McRFPy_API::_getMusicVolume, METH_VARARGS, ""},
|
||||||
{"getSoundVolume", McRFPy_API::_getSoundVolume, METH_VARARGS, ""},
|
{"getSoundVolume", McRFPy_API::_getSoundVolume, METH_VARARGS, ""},
|
||||||
|
/*
|
||||||
{"unlockPlayerInput", McRFPy_API::_unlockPlayerInput, METH_VARARGS, ""},
|
{"unlockPlayerInput", McRFPy_API::_unlockPlayerInput, METH_VARARGS, ""},
|
||||||
{"lockPlayerInput", McRFPy_API::_lockPlayerInput, METH_VARARGS, ""},
|
{"lockPlayerInput", McRFPy_API::_lockPlayerInput, METH_VARARGS, ""},
|
||||||
{"requestGridTarget", McRFPy_API::_requestGridTarget, METH_VARARGS, ""},
|
{"requestGridTarget", McRFPy_API::_requestGridTarget, METH_VARARGS, ""},
|
||||||
|
*/
|
||||||
{"activeGrid", McRFPy_API::_activeGrid, METH_VARARGS, ""},
|
{"activeGrid", McRFPy_API::_activeGrid, METH_VARARGS, ""},
|
||||||
{"setActiveGrid", McRFPy_API::_setActiveGrid, METH_VARARGS, ""},
|
{"setActiveGrid", McRFPy_API::_setActiveGrid, METH_VARARGS, ""},
|
||||||
|
/*
|
||||||
{"inputMode", McRFPy_API::_inputMode, METH_VARARGS, ""},
|
{"inputMode", McRFPy_API::_inputMode, METH_VARARGS, ""},
|
||||||
{"turnNumber", McRFPy_API::_turnNumber, METH_VARARGS, ""},
|
{"turnNumber", McRFPy_API::_turnNumber, METH_VARARGS, ""},
|
||||||
{"createEntity", McRFPy_API::_createEntity, METH_VARARGS, ""},
|
{"createEntity", McRFPy_API::_createEntity, METH_VARARGS, ""},
|
||||||
|
@ -99,9 +101,13 @@ static PyMethodDef mcrfpyMethods[] = {
|
||||||
{"refreshFov", McRFPy_API::_refreshFov, METH_VARARGS, ""},
|
{"refreshFov", McRFPy_API::_refreshFov, METH_VARARGS, ""},
|
||||||
|
|
||||||
{"camFollow", McRFPy_API::_camFollow, METH_VARARGS, ""},
|
{"camFollow", McRFPy_API::_camFollow, METH_VARARGS, ""},
|
||||||
|
*/
|
||||||
{"sceneUI", McRFPy_API::_sceneUI, METH_VARARGS, "sceneUI(scene) - Returns a list of UI elements"},
|
{"sceneUI", McRFPy_API::_sceneUI, METH_VARARGS, "sceneUI(scene) - Returns a list of UI elements"},
|
||||||
|
|
||||||
|
{"currentScene", McRFPy_API::_currentScene, METH_VARARGS, "currentScene() - Current scene's name. Returns a string"},
|
||||||
|
{"setScene", McRFPy_API::_setScene, METH_VARARGS, "setScene(scene) - transition to a different scene"},
|
||||||
|
{"createScene", McRFPy_API::_createScene, METH_VARARGS, "createScene(scene) - create a new blank scene with given name"},
|
||||||
|
|
||||||
{NULL, NULL, 0, NULL}
|
{NULL, NULL, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1157,3 +1163,23 @@ PyObject* McRFPy_API::_sceneUI(PyObject* self, PyObject* args) {
|
||||||
o->data = ui;
|
o->data = ui;
|
||||||
return (PyObject*)o;
|
return (PyObject*)o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* McRFPy_API::_currentScene(PyObject* self, PyObject* args) {
|
||||||
|
return Py_BuildValue("s", game->scene.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject* McRFPy_API::_setScene(PyObject* self, PyObject* args) {
|
||||||
|
const char* newscene;
|
||||||
|
if (!PyArg_ParseTuple(args, "s", &newscene)) return NULL;
|
||||||
|
game->changeScene(newscene);
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject* McRFPy_API::_createScene(PyObject* self, PyObject* args) {
|
||||||
|
const char* newscene;
|
||||||
|
if (!PyArg_ParseTuple(args, "s", &newscene)) return NULL;
|
||||||
|
game->createScene(newscene);
|
||||||
|
Py_INCREF(Py_None);
|
||||||
|
return Py_None;
|
||||||
|
}
|
||||||
|
|
|
@ -115,6 +115,11 @@ public:
|
||||||
|
|
||||||
static PyObject* _sceneUI(PyObject*, PyObject*);
|
static PyObject* _sceneUI(PyObject*, PyObject*);
|
||||||
|
|
||||||
|
// scene control
|
||||||
|
static PyObject* _setScene(PyObject*, PyObject*);
|
||||||
|
static PyObject* _currentScene(PyObject*, PyObject*);
|
||||||
|
static PyObject* _createScene(PyObject*, PyObject*);
|
||||||
|
|
||||||
// accept keyboard input from scene
|
// accept keyboard input from scene
|
||||||
static sf::Vector2i cursor_position;
|
static sf::Vector2i cursor_position;
|
||||||
static void player_input(int, int);
|
static void player_input(int, int);
|
||||||
|
@ -130,6 +135,7 @@ public:
|
||||||
//static void playSound(const char * filename);
|
//static void playSound(const char * filename);
|
||||||
//static void playMusic(const char * filename);
|
//static void playMusic(const char * filename);
|
||||||
|
|
||||||
|
|
||||||
static void doAction(std::string);
|
static void doAction(std::string);
|
||||||
|
|
||||||
// McRFPy_API(GameEngine*);
|
// McRFPy_API(GameEngine*);
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include "PyScene.h"
|
||||||
|
#include "ActionCode.h"
|
||||||
|
#include "Resources.h"
|
||||||
|
|
||||||
|
PyScene::PyScene(GameEngine* g) : Scene(g)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void PyScene::update()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void PyScene::doAction(std::string name, std::string type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void PyScene::sRender()
|
||||||
|
{
|
||||||
|
game->getWindow().clear();
|
||||||
|
|
||||||
|
auto vec = *ui_elements;
|
||||||
|
for (auto e: vec)
|
||||||
|
{
|
||||||
|
if (e)
|
||||||
|
e->render();
|
||||||
|
}
|
||||||
|
|
||||||
|
game->getWindow().display();
|
||||||
|
|
||||||
|
McRFPy_API::REPL();
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Common.h"
|
||||||
|
#include "Scene.h"
|
||||||
|
#include "GameEngine.h"
|
||||||
|
|
||||||
|
class PyScene: public Scene
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
PyScene(GameEngine*);
|
||||||
|
void update() override final;
|
||||||
|
void doAction(std::string, std::string) override final;
|
||||||
|
void sRender() override final;
|
||||||
|
};
|
|
@ -0,0 +1,2 @@
|
||||||
|
print("Hello mcrogueface")
|
||||||
|
|
Loading…
Reference in New Issue