wow, good test of Key and Click Callable classes. Cleanup, squash, and merge after I give it a lookover in daylight, though.
This commit is contained in:
		
							parent
							
								
									972768eb26
								
							
						
					
					
						commit
						05d9f6a882
					
				|  | @ -157,8 +157,10 @@ void GameEngine::sUserInput() | ||||||
|             std::string name = currentScene()->action(actionCode); |             std::string name = currentScene()->action(actionCode); | ||||||
|             currentScene()->doAction(name, actionType); |             currentScene()->doAction(name, actionType); | ||||||
|         } |         } | ||||||
|         else if (currentScene()->key_callable != NULL && currentScene()->key_callable != Py_None) |         else if (currentScene()->key_callable) | ||||||
|         { |         { | ||||||
|  |             currentScene()->key_callable->call(ActionCode::key_str(event.key.code), actionType); | ||||||
|  |             /*
 | ||||||
|             PyObject* args = Py_BuildValue("(ss)", ActionCode::key_str(event.key.code).c_str(), actionType.c_str()); |             PyObject* args = Py_BuildValue("(ss)", ActionCode::key_str(event.key.code).c_str(), actionType.c_str()); | ||||||
|             PyObject* retval = PyObject_Call(currentScene()->key_callable, args, NULL); |             PyObject* retval = PyObject_Call(currentScene()->key_callable, args, NULL); | ||||||
|             if (!retval) |             if (!retval) | ||||||
|  | @ -170,6 +172,7 @@ void GameEngine::sUserInput() | ||||||
|             {    |             {    | ||||||
|                 std::cout << "key_callable returned a non-None value. It's not an error, it's just not being saved or used." << std::endl; |                 std::cout << "key_callable returned a non-None value. It's not an error, it's just not being saved or used." << std::endl; | ||||||
|             } |             } | ||||||
|  |             */ | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -453,6 +453,7 @@ PyObject* McRFPy_API::_createScene(PyObject* self, PyObject* args) { | ||||||
| PyObject* McRFPy_API::_keypressScene(PyObject* self, PyObject* args) { | PyObject* McRFPy_API::_keypressScene(PyObject* self, PyObject* args) { | ||||||
|     PyObject* callable; |     PyObject* callable; | ||||||
| 	if (!PyArg_ParseTuple(args, "O", &callable)) return NULL; | 	if (!PyArg_ParseTuple(args, "O", &callable)) return NULL; | ||||||
|  |     /*
 | ||||||
|     if (game->currentScene()->key_callable != NULL and game->currentScene()->key_callable != Py_None) |     if (game->currentScene()->key_callable != NULL and game->currentScene()->key_callable != Py_None) | ||||||
|     { |     { | ||||||
|         Py_DECREF(game->currentScene()->key_callable); |         Py_DECREF(game->currentScene()->key_callable); | ||||||
|  | @ -460,6 +461,8 @@ PyObject* McRFPy_API::_keypressScene(PyObject* self, PyObject* args) { | ||||||
|     Py_INCREF(callable); |     Py_INCREF(callable); | ||||||
|     game->currentScene()->key_callable = callable; |     game->currentScene()->key_callable = callable; | ||||||
|     Py_INCREF(Py_None); |     Py_INCREF(Py_None); | ||||||
|  |     */ | ||||||
|  |     game->currentScene()->key_callable = std::make_unique<PyKeyCallable>(callable); | ||||||
|     return Py_None;		 |     return Py_None;		 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,3 +55,55 @@ bool PyTimerCallable::test(int now) | ||||||
|     } |     } | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | PyClickCallable::PyClickCallable(PyObject* _target) | ||||||
|  | : PyCallable(_target) | ||||||
|  | {} | ||||||
|  | 
 | ||||||
|  | PyClickCallable::PyClickCallable() | ||||||
|  | : PyCallable(Py_None) | ||||||
|  | {} | ||||||
|  | 
 | ||||||
|  | void PyClickCallable::call(sf::Vector2f mousepos, std::string button, std::string action) | ||||||
|  | { | ||||||
|  |     PyObject* args = Py_BuildValue("(iiss)", (int)mousepos.x, (int)mousepos.y, button.c_str(), action.c_str()); | ||||||
|  |     PyObject* retval = PyCallable::call(args, NULL); | ||||||
|  |     if (!retval) | ||||||
|  |     { | ||||||
|  |         std::cout << "ClickCallable has raised an exception. It's going to STDERR and being dropped:" << std::endl; | ||||||
|  |         PyErr_Print(); | ||||||
|  |         PyErr_Clear(); | ||||||
|  |     } else if (retval != Py_None) | ||||||
|  |     { | ||||||
|  |         std::cout << "ClickCallable returned a non-None value. It's not an error, it's just not being saved or used." << std::endl; | ||||||
|  |         std::cout << PyUnicode_AsUTF8(PyObject_Repr(retval)) << std::endl; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | PyObject* PyClickCallable::borrow() | ||||||
|  | { | ||||||
|  |     return target; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | PyKeyCallable::PyKeyCallable(PyObject* _target) | ||||||
|  | : PyCallable(_target) | ||||||
|  | {} | ||||||
|  | 
 | ||||||
|  | PyKeyCallable::PyKeyCallable() | ||||||
|  | : PyCallable(Py_None) | ||||||
|  | {} | ||||||
|  | 
 | ||||||
|  | void PyKeyCallable::call(std::string key, std::string action) | ||||||
|  | { | ||||||
|  |     PyObject* args = Py_BuildValue("(ss)", key.c_str(), action.c_str()); | ||||||
|  |     PyObject* retval = PyCallable::call(args, NULL); | ||||||
|  |     if (!retval) | ||||||
|  |     { | ||||||
|  |         std::cout << "KeyCallable has raised an exception. It's going to STDERR and being dropped:" << std::endl; | ||||||
|  |         PyErr_Print(); | ||||||
|  |         PyErr_Clear(); | ||||||
|  |     } else if (retval != Py_None) | ||||||
|  |     { | ||||||
|  |         std::cout << "KeyCallable returned a non-None value. It's not an error, it's just not being saved or used." << std::endl; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -4,9 +4,8 @@ | ||||||
| 
 | 
 | ||||||
| class PyCallable | class PyCallable | ||||||
| { | { | ||||||
| private: |  | ||||||
|     PyObject* target; |  | ||||||
| protected: | protected: | ||||||
|  |     PyObject* target; | ||||||
|     PyCallable(PyObject*); |     PyCallable(PyObject*); | ||||||
|     ~PyCallable(); |     ~PyCallable(); | ||||||
|     PyObject* call(PyObject*, PyObject*); |     PyObject* call(PyObject*, PyObject*); | ||||||
|  | @ -24,3 +23,21 @@ public: | ||||||
|     PyTimerCallable(PyObject*, int, int); |     PyTimerCallable(PyObject*, int, int); | ||||||
|     PyTimerCallable(); |     PyTimerCallable(); | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | class PyClickCallable: public PyCallable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     void call(sf::Vector2f, std::string, std::string); | ||||||
|  |     PyObject* borrow(); | ||||||
|  |     PyClickCallable(PyObject*); | ||||||
|  |     PyClickCallable(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class PyKeyCallable: public PyCallable | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     void call(std::string, std::string); | ||||||
|  |     //PyObject* borrow(); // not yet implemented
 | ||||||
|  |     PyKeyCallable(PyObject*); | ||||||
|  |     PyKeyCallable(); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| #include "PyScene.h" | #include "PyScene.h" | ||||||
| #include "ActionCode.h" | #include "ActionCode.h" | ||||||
| #include "Resources.h" | #include "Resources.h" | ||||||
|  | #include "PyCallable.h" | ||||||
| 
 | 
 | ||||||
| PyScene::PyScene(GameEngine* g) : Scene(g) | PyScene::PyScene(GameEngine* g) : Scene(g) | ||||||
| { | { | ||||||
|  | @ -27,6 +28,7 @@ void PyScene::do_mouse_input(std::string button, std::string type) | ||||||
|         target = d->click_at(sf::Vector2f(mousepos)); |         target = d->click_at(sf::Vector2f(mousepos)); | ||||||
|         if (target) |         if (target) | ||||||
|         { |         { | ||||||
|  |             /*
 | ||||||
|             PyObject* args = Py_BuildValue("(iiss)", (int)mousepos.x, (int)mousepos.y, button.c_str(), type.c_str()); |             PyObject* args = Py_BuildValue("(iiss)", (int)mousepos.x, (int)mousepos.y, button.c_str(), type.c_str()); | ||||||
|             PyObject* retval = PyObject_Call(target->click_callable, args, NULL); |             PyObject* retval = PyObject_Call(target->click_callable, args, NULL); | ||||||
|             if (!retval) |             if (!retval) | ||||||
|  | @ -38,6 +40,8 @@ void PyScene::do_mouse_input(std::string button, std::string type) | ||||||
|             {    |             {    | ||||||
|                 std::cout << "click_callable returned a non-None value. It's not an error, it's just not being saved or used." << std::endl; |                 std::cout << "click_callable returned a non-None value. It's not an error, it's just not being saved or used." << std::endl; | ||||||
|             } |             } | ||||||
|  |             */ | ||||||
|  |             target->click_callable->call(mousepos, button, type); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
| //Scene::Scene() { game = 0; std::cout << "WARN: default Scene constructor called. (game = " << game << ")" << std::endl;};
 | //Scene::Scene() { game = 0; std::cout << "WARN: default Scene constructor called. (game = " << game << ")" << std::endl;};
 | ||||||
| Scene::Scene(GameEngine* g) | Scene::Scene(GameEngine* g) | ||||||
| { | { | ||||||
|     key_callable = Py_None; |     key_callable = std::make_unique<PyKeyCallable>(); | ||||||
|     game = g;  |     game = g;  | ||||||
|     ui_elements = std::make_shared<std::vector<std::shared_ptr<UIDrawable>>>(); |     ui_elements = std::make_shared<std::vector<std::shared_ptr<UIDrawable>>>(); | ||||||
| } | } | ||||||
|  | @ -43,6 +43,7 @@ bool Scene::unregisterActionInjected(int code, std::string name) | ||||||
| 
 | 
 | ||||||
| void Scene::key_register(PyObject* callable) | void Scene::key_register(PyObject* callable) | ||||||
| { | { | ||||||
|  |     /*
 | ||||||
|     if (key_callable) |     if (key_callable) | ||||||
|     { |     { | ||||||
|         // decrement reference before overwriting
 |         // decrement reference before overwriting
 | ||||||
|  | @ -50,11 +51,16 @@ void Scene::key_register(PyObject* callable) | ||||||
|     } |     } | ||||||
|     key_callable = callable; |     key_callable = callable; | ||||||
|     Py_INCREF(key_callable); |     Py_INCREF(key_callable); | ||||||
|  |     */ | ||||||
|  |     key_callable = std::make_unique<PyKeyCallable>(callable); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Scene::key_unregister() | void Scene::key_unregister() | ||||||
| { | { | ||||||
|  |     /*
 | ||||||
|     if (key_callable == NULL) return; |     if (key_callable == NULL) return; | ||||||
|     Py_DECREF(key_callable); |     Py_DECREF(key_callable); | ||||||
|     key_callable = NULL; |     key_callable = NULL; | ||||||
|  |     */ | ||||||
|  |     key_callable.reset(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ | ||||||
| #include "Common.h" | #include "Common.h" | ||||||
| #include <list> | #include <list> | ||||||
| #include "UI.h" | #include "UI.h" | ||||||
|  | #include "PyCallable.h" | ||||||
| //#include "GameEngine.h"
 | //#include "GameEngine.h"
 | ||||||
| 
 | 
 | ||||||
| class GameEngine; // forward declare
 | class GameEngine; // forward declare
 | ||||||
|  | @ -41,7 +42,8 @@ public: | ||||||
|      |      | ||||||
|     std::shared_ptr<std::vector<std::shared_ptr<UIDrawable>>> ui_elements; |     std::shared_ptr<std::vector<std::shared_ptr<UIDrawable>>> ui_elements; | ||||||
| 
 | 
 | ||||||
|     PyObject* key_callable; |     //PyObject* key_callable;
 | ||||||
|  |     std::unique_ptr<PyKeyCallable> key_callable; | ||||||
|     void key_register(PyObject*); |     void key_register(PyObject*); | ||||||
|     void key_unregister(); |     void key_unregister(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -56,6 +56,7 @@ UIDrawable* UIGrid::click_at(sf::Vector2f point) | ||||||
| 
 | 
 | ||||||
| void UIDrawable::click_register(PyObject* callable) | void UIDrawable::click_register(PyObject* callable) | ||||||
| { | { | ||||||
|  |     /*
 | ||||||
|     if (click_callable) |     if (click_callable) | ||||||
|     { |     { | ||||||
|         // decrement reference before overwriting
 |         // decrement reference before overwriting
 | ||||||
|  | @ -63,13 +64,18 @@ void UIDrawable::click_register(PyObject* callable) | ||||||
|     } |     } | ||||||
|     click_callable = callable; |     click_callable = callable; | ||||||
|     Py_INCREF(click_callable); |     Py_INCREF(click_callable); | ||||||
|  |     */ | ||||||
|  |     click_callable = std::make_unique<PyClickCallable>(callable); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void UIDrawable::click_unregister() | void UIDrawable::click_unregister() | ||||||
| { | { | ||||||
|  |     /*
 | ||||||
|     if (click_callable == NULL) return; |     if (click_callable == NULL) return; | ||||||
|     Py_DECREF(click_callable); |     Py_DECREF(click_callable); | ||||||
|     click_callable = NULL; |     click_callable = NULL; | ||||||
|  |     */ | ||||||
|  |     click_callable.reset(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void UIDrawable::render() | void UIDrawable::render() | ||||||
|  | @ -378,7 +384,7 @@ void UIGrid::render(sf::Vector2f) | ||||||
|     for (auto e : *entities) { |     for (auto e : *entities) { | ||||||
|         // TODO skip out-of-bounds entities (grid square not visible at all, check for partially on visible grid squares / floating point grid position)
 |         // TODO skip out-of-bounds entities (grid square not visible at all, check for partially on visible grid squares / floating point grid position)
 | ||||||
|         //auto drawent = e->cGrid->indexsprite.drawable();
 |         //auto drawent = e->cGrid->indexsprite.drawable();
 | ||||||
|         auto drawent = e->sprite; |         auto& drawent = e->sprite; | ||||||
|         //drawent.setScale(zoom, zoom);
 |         //drawent.setScale(zoom, zoom);
 | ||||||
|         drawent.setScale(zoom); |         drawent.setScale(zoom); | ||||||
|         auto pixel_pos = sf::Vector2f( |         auto pixel_pos = sf::Vector2f( | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								src/UI.h
								
								
								
								
							
							
						
						
									
										12
									
								
								src/UI.h
								
								
								
								
							|  | @ -5,6 +5,7 @@ | ||||||
| #include "IndexTexture.h" | #include "IndexTexture.h" | ||||||
| #include "Resources.h" | #include "Resources.h" | ||||||
| #include <list> | #include <list> | ||||||
|  | #include "PyCallable.h" | ||||||
| 
 | 
 | ||||||
| enum PyObjectsEnum : int | enum PyObjectsEnum : int | ||||||
| { | { | ||||||
|  | @ -27,7 +28,8 @@ public: | ||||||
|     virtual PyObjectsEnum derived_type() = 0; |     virtual PyObjectsEnum derived_type() = 0; | ||||||
| 
 | 
 | ||||||
|     // Mouse input handling - callable object, methods to find event's destination
 |     // Mouse input handling - callable object, methods to find event's destination
 | ||||||
|     PyObject* click_callable; |     //PyObject* click_callable;
 | ||||||
|  |     std::unique_ptr<PyClickCallable> click_callable; | ||||||
|     virtual UIDrawable* click_at(sf::Vector2f point) = 0; |     virtual UIDrawable* click_at(sf::Vector2f point) = 0; | ||||||
|     void click_register(PyObject*); |     void click_register(PyObject*); | ||||||
|     void click_unregister(); |     void click_unregister(); | ||||||
|  | @ -322,16 +324,16 @@ static PyObject* PyUIDrawable_get_click(PyUIGridObject* self, void* closure) { | ||||||
|     switch (objtype) |     switch (objtype) | ||||||
|     { |     { | ||||||
|         case PyObjectsEnum::UIFRAME: |         case PyObjectsEnum::UIFRAME: | ||||||
|             ptr = ((PyUIFrameObject*)self)->data->click_callable; |             ptr = ((PyUIFrameObject*)self)->data->click_callable->borrow(); | ||||||
|             break; |             break; | ||||||
|         case PyObjectsEnum::UICAPTION: |         case PyObjectsEnum::UICAPTION: | ||||||
|             ptr = ((PyUICaptionObject*)self)->data->click_callable; |             ptr = ((PyUICaptionObject*)self)->data->click_callable->borrow(); | ||||||
|             break; |             break; | ||||||
|         case PyObjectsEnum::UISPRITE: |         case PyObjectsEnum::UISPRITE: | ||||||
|             ptr = ((PyUISpriteObject*)self)->data->click_callable; |             ptr = ((PyUISpriteObject*)self)->data->click_callable->borrow(); | ||||||
|             break; |             break; | ||||||
|         case PyObjectsEnum::UIGRID: |         case PyObjectsEnum::UIGRID: | ||||||
|             ptr = ((PyUIGridObject*)self)->data->click_callable; |             ptr = ((PyUIGridObject*)self)->data->click_callable->borrow(); | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
|             PyErr_SetString(PyExc_TypeError, "no idea how you did that; invalid UIDrawable derived instance for _get_click"); |             PyErr_SetString(PyExc_TypeError, "no idea how you did that; invalid UIDrawable derived instance for _get_click"); | ||||||
|  |  | ||||||
|  | @ -123,8 +123,9 @@ UITestScene::UITestScene(GameEngine* g) : Scene(g) | ||||||
|     // TODO - reimplement UISprite style rendering within UIEntity class. Entities don't have a screen pixel position, they have a grid position, and grid sets zoom when rendering them.
 |     // TODO - reimplement UISprite style rendering within UIEntity class. Entities don't have a screen pixel position, they have a grid position, and grid sets zoom when rendering them.
 | ||||||
|     auto e5a = std::make_shared<UIEntity>(*e5); // this basic constructor sucks: sprite position + zoom are irrelevant for UIEntity.
 |     auto e5a = std::make_shared<UIEntity>(*e5); // this basic constructor sucks: sprite position + zoom are irrelevant for UIEntity.
 | ||||||
|     e5a->grid = e5; |     e5a->grid = e5; | ||||||
|     auto e5as = UISprite(indextex, 85, sf::Vector2f(0, 0), 1.0); |     //auto e5as = UISprite(indextex, 85, sf::Vector2f(0, 0), 1.0);
 | ||||||
|     e5a->sprite = e5as; // will copy constructor even exist for UISprite...?
 |     //e5a->sprite = e5as; // will copy constructor even exist for UISprite...?
 | ||||||
|  |     e5a->sprite = UISprite(indextex, 85, sf::Vector2f(0, 0), 1.0); | ||||||
|     e5a->position = sf::Vector2f(1, 0); |     e5a->position = sf::Vector2f(1, 0); | ||||||
| 
 | 
 | ||||||
|     e5->entities->push_back(e5a); |     e5->entities->push_back(e5a); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue