#include "PythonScene.h" #include "ActionCode.h" #include "McRFPy_API.h" //#include "Animation.h" PythonScene::PythonScene(GameEngine* g, std::string pymodule) : Scene(g) { // mouse events registerAction(ActionCode::MOUSEBUTTON + sf::Mouse::Left, "click"); registerAction(ActionCode::MOUSEBUTTON + sf::Mouse::Right, "rclick"); registerAction(ActionCode::MOUSEWHEEL + ActionCode::WHEEL_DEL, "wheel_up"); registerAction(ActionCode::MOUSEWHEEL + ActionCode::WHEEL_NEG + ActionCode::WHEEL_DEL, "wheel_down"); // keyboard events registerAction(ActionCode::KEY + sf::Keyboard::Q, "upleft"); registerAction(ActionCode::KEY + sf::Keyboard::W, "up"); registerAction(ActionCode::KEY + sf::Keyboard::E, "upright"); registerAction(ActionCode::KEY + sf::Keyboard::A, "left"); registerAction(ActionCode::KEY + sf::Keyboard::S, "down"); registerAction(ActionCode::KEY + sf::Keyboard::D, "right"); registerAction(ActionCode::KEY + sf::Keyboard::Z, "downleft"); registerAction(ActionCode::KEY + sf::Keyboard::X, "wait"); registerAction(ActionCode::KEY + sf::Keyboard::C, "downright"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad7, "upleft"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad8, "up"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad9, "upright"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad4, "left"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad5, "wait"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad6, "right"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad1, "downleft"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad2, "down"); registerAction(ActionCode::KEY + sf::Keyboard::Numpad3, "downright"); // window resize registerAction(0, "event"); dragging = false; drag_grid = NULL; // import pymodule and call start() McRFPy_API::executePyString("import " + pymodule); McRFPy_API::executePyString(pymodule + ".start()"); } void PythonScene::animate() { //std::cout << "Number of animations: " << McRFPy_API::animations.size() << std::endl; auto frametime = game->getFrameTime(); auto it = McRFPy_API::animations.begin(); while (it != McRFPy_API::animations.end()) { //std::cout << "Iterating" << std::endl; (*it)->step(frametime); //std::cout << "Step complete" << std::endl; if ((*it)->isDone()) { std::cout << "Cleaning up Animation" << std::endl; auto prev = it; it++; McRFPy_API::animations.erase(prev); } else it++; } /* // workin on it for (auto p : animations) { if (p.first == "int") { ((Animation)p.second).step(frametime); } else if (p.first == "string") { ((Animation)p.second).step(frametime); } else if (p.first == "float") { ((Animation)p.second).step(frametime); } else if (p.first == "vector2f") { ((Animation)p.second).step(frametime); } else if (p.first == "vector2i") { ((Animation)p.second).step(frametime); } else if (p.first == "color") { ((Animation)p.second).step(frametime); // TODO } else { std::cout << "Animation has label " << p.first << "; no type found" << std::endl; } } auto it = animations.begin(); while (it != animations.end()) { bool done = false; if (p.first == "int") { ((Animation)p.second).step(frametime); } else if (p.first == "string") { if ((Animation)p.second).isDone() delete (Animation)p.second } else if (p.first == "float") { ((Animation)p.second).step(frametime); } else if (p.first == "vector2f") { ((Animation)p.second).step(frametime); } else if (p.first == "vector2i") { ((Animation)p.second).step(frametime); } else if (p.first == "color") { ((Animation)p.second).step(frametime); // TODO if ((*it).second.isDone()) { animations.erase(it++); } else { it++; } } */ } void PythonScene::update() { McRFPy_API::entities.update(); // check if left click is still down & mouse has moved // continue the drag motion if (dragging && drag_grid) { //std::cout << "Compute dragging" << std::endl; auto mousepos = sf::Mouse::getPosition(game->getWindow()); auto dx = mouseprev.x - mousepos.x, dy = mouseprev.y - mousepos.y; drag_grid->center_x += (dx / drag_grid->zoom); drag_grid->center_y += (dy / drag_grid->zoom); mouseprev = mousepos; } animate(); } void PythonScene::doLClick(sf::Vector2i mousepos) { // UI buttons get first chance for (auto pair : McRFPy_API::menus) { if (!pair.second->visible) continue; for (auto b : pair.second->buttons) { //std::cout << "Box: " << pair.second->box.getPosition().x << ", " //<< pair.second->box.getPosition().y << "; Button:" << b.rect.getPosition().x << //", " << b.rect.getPosition().y << "; Mouse: " << mousepos.x << ", " << //mousepos.y << std::endl; // JANK: provide the button a relative coordinate. if (b.contains(pair.second->box.getPosition(), mousepos)) { McRFPy_API::doAction(b.getAction()); return; } } } // left clicking a grid to select a square for (auto pair : McRFPy_API::grids) { if (!pair.second->visible) continue; if (pair.second->contains(mousepos)) { // grid was clicked return; } } } void PythonScene::doRClick(sf::Vector2i mousepos) { // just grids for right click for (auto pair : McRFPy_API::grids) { if (!pair.second->visible) continue; if (pair.second->contains(mousepos)) { // grid was clicked return; } } } void PythonScene::doZoom(sf::Vector2i mousepos, int value) { // just grids for right click for (auto pair : McRFPy_API::grids) { if (!pair.second->visible) continue; if (pair.second->contains(mousepos)) { // grid was zoomed float new_zoom = pair.second->zoom + (value * 0.25); if (new_zoom >= 0.5 && new_zoom <= 5.0) { pair.second->zoom = new_zoom; } } } } void PythonScene::doAction(std::string name, std::string type) { auto mousepos = sf::Mouse::getPosition(game->getWindow()); //std::cout << "name: " << name << ", type: " << type << std::endl; if (ACTIONONCE("click")) { // left click start //std::cout << "LClick started at (" << mousepos.x << ", " << mousepos.y << ")" << std::endl; dragstart = mousepos; mouseprev = mousepos; dragging = true; // determine the grid that contains the cursor for (auto pair : McRFPy_API::grids) { if (!pair.second->visible) continue; if (pair.second->contains(mousepos)) { // grid was clicked drag_grid = pair.second; } } } else if (ACTIONAFTER("click")) { // left click end //std::cout << "LClick ended at (" << mousepos.x << ", " << mousepos.y << ")" << std::endl; // if click ended without starting a drag event, try lclick? if (dragstart == mousepos) { // mouse did not move, do click //std::cout << "(did not move)" << std::endl; doLClick(mousepos); } dragging = false; drag_grid = NULL; } else if (ACTIONONCE("rclick")) { // not going to test for right click drag - just rclick doRClick(mousepos); } else if (ACTIONONCE("wheel_up")) { // try zoom in doZoom(mousepos, 1); } else if (ACTIONONCE("wheel_down")) { // try zoom out doZoom(mousepos, -1); } } void PythonScene::sRender() { game->getWindow().clear(); for (auto pair: McRFPy_API::grids) { if (!pair.second->visible) continue; pair.second->render(game->getWindow()); } for (auto pair: McRFPy_API::menus) { if (!pair.second->visible) continue; pair.second->render(game->getWindow()); } game->getWindow().display(); }