diff --git a/src/GameEngine.cpp b/src/GameEngine.cpp index 844e232..b91b1b0 100644 --- a/src/GameEngine.cpp +++ b/src/GameEngine.cpp @@ -3,7 +3,8 @@ //#include "UITestScene.h" #include "ActionCode.h" #include "McRFPy_API.h" -#include "PythonScene.h" +//#include "PythonScene.h" +#include "PyScene.h" #include "UITestScene.h" #include "Resources.h" @@ -11,7 +12,7 @@ GameEngine::GameEngine() { Resources::font.loadFromFile("./assets/JetbrainsMono.ttf"); 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); visible = window.getDefaultView(); window.setFramerateLimit(30); @@ -27,6 +28,7 @@ GameEngine::GameEngine() McRFPy_API::game = this; McRFPy_API::api_init(); McRFPy_API::executePyString("import mcrfpy"); + McRFPy_API::executeScript("scripts/game.py"); //McRFPy_API::executePyString("from UIMenu import *"); //McRFPy_API::executePyString("from Grid import *"); @@ -38,12 +40,14 @@ GameEngine::GameEngine() } 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::setPause(bool p) { paused = p; } sf::Font & GameEngine::getFont() { /*return font; */ return Resources::font; } sf::RenderWindow & GameEngine::getWindow() { return window; } +void GameEngine::createScene(std::string s) { scenes[s] = new PyScene(this); } + void GameEngine::run() { float fps = 0.0; @@ -72,6 +76,7 @@ void GameEngine::sUserInput() int actionCode = 0; 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) { sf::FloatRect area(0.f, 0.f, event.size.width, event.size.height); visible = sf::View(area); diff --git a/src/GameEngine.h b/src/GameEngine.h index e8fe728..2448b6b 100644 --- a/src/GameEngine.h +++ b/src/GameEngine.h @@ -11,7 +11,6 @@ class GameEngine { sf::RenderWindow window; sf::Font font; - std::string scene; std::map scenes; bool running = true; bool paused = false; @@ -22,9 +21,11 @@ class GameEngine std::string window_title; public: + std::string scene; GameEngine(); Scene* currentScene(); void changeScene(std::string); + void createScene(std::string); void quit(); void setPause(bool); sf::Font & getFont(); diff --git a/src/McRFPy_API.cpp b/src/McRFPy_API.cpp index 7e2a30f..0f1d32d 100644 --- a/src/McRFPy_API.cpp +++ b/src/McRFPy_API.cpp @@ -21,7 +21,7 @@ bool McRFPy_API::do_camfollow; EntityManager McRFPy_API::entities; static PyMethodDef mcrfpyMethods[] = { - +/* {"createMenu", McRFPy_API::_createMenu, METH_VARARGS, "Create a new uimenu (name_str, x, y, w, h)"}, @@ -42,13 +42,13 @@ static PyMethodDef mcrfpyMethods[] = { {"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"}, - +*/ {"registerPyAction", McRFPy_API::_registerPyAction, METH_VARARGS, "Register a callable Python object to correspond to an action string. (actionstr, callable)"}, {"registerInputAction", McRFPy_API::_registerInputAction, METH_VARARGS, "Register a SFML input code to correspond to an action string. (input_code, actionstr)"}, - +/* {"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" }, @@ -69,7 +69,7 @@ static PyMethodDef mcrfpyMethods[] = { "callback: called when the animation completes\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"}, - +*/ /* static PyObject* _createSoundBuffer(PyObject*, PyObject*); static PyObject* _loadMusic(PyObject*, PyObject*); @@ -86,12 +86,14 @@ static PyMethodDef mcrfpyMethods[] = { {"playSound", McRFPy_API::_playSound, METH_VARARGS, "(int)"}, {"getMusicVolume", McRFPy_API::_getMusicVolume, METH_VARARGS, ""}, {"getSoundVolume", McRFPy_API::_getSoundVolume, METH_VARARGS, ""}, - +/* {"unlockPlayerInput", McRFPy_API::_unlockPlayerInput, METH_VARARGS, ""}, {"lockPlayerInput", McRFPy_API::_lockPlayerInput, METH_VARARGS, ""}, {"requestGridTarget", McRFPy_API::_requestGridTarget, METH_VARARGS, ""}, +*/ {"activeGrid", McRFPy_API::_activeGrid, METH_VARARGS, ""}, {"setActiveGrid", McRFPy_API::_setActiveGrid, METH_VARARGS, ""}, +/* {"inputMode", McRFPy_API::_inputMode, METH_VARARGS, ""}, {"turnNumber", McRFPy_API::_turnNumber, METH_VARARGS, ""}, {"createEntity", McRFPy_API::_createEntity, METH_VARARGS, ""}, @@ -99,9 +101,13 @@ static PyMethodDef mcrfpyMethods[] = { {"refreshFov", McRFPy_API::_refreshFov, METH_VARARGS, ""}, {"camFollow", McRFPy_API::_camFollow, METH_VARARGS, ""}, - +*/ {"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} }; @@ -1157,3 +1163,23 @@ PyObject* McRFPy_API::_sceneUI(PyObject* self, PyObject* args) { o->data = ui; 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; +} diff --git a/src/McRFPy_API.h b/src/McRFPy_API.h index 538b9b0..f753213 100644 --- a/src/McRFPy_API.h +++ b/src/McRFPy_API.h @@ -114,6 +114,11 @@ public: static PyObject* _camFollow(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 static sf::Vector2i cursor_position; @@ -130,6 +135,7 @@ public: //static void playSound(const char * filename); //static void playMusic(const char * filename); + static void doAction(std::string); // McRFPy_API(GameEngine*); diff --git a/src/PyScene.cpp b/src/PyScene.cpp new file mode 100644 index 0000000..40c4b43 --- /dev/null +++ b/src/PyScene.cpp @@ -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(); +} diff --git a/src/PyScene.h b/src/PyScene.h new file mode 100644 index 0000000..8b2b8f9 --- /dev/null +++ b/src/PyScene.h @@ -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; +}; diff --git a/src/scripts/game.py b/src/scripts/game.py new file mode 100644 index 0000000..81222dc --- /dev/null +++ b/src/scripts/game.py @@ -0,0 +1,2 @@ +print("Hello mcrogueface") +