159 lines
5.3 KiB
C++
159 lines
5.3 KiB
C++
|
|
#include "PythonScene.h"
|
||
|
|
#include "ActionCode.h"
|
||
|
|
#include "McRFPy_API.h"
|
||
|
|
|
||
|
|
PythonScene::PythonScene(GameEngine* g, std::string pymodule)
|
||
|
|
: Scene(g) {
|
||
|
|
// mouse events
|
||
|
|
registerAction(ActionCode::MOUSEBUTTON + sf::Mouse::Left, "click");
|
||
|
|
registerAction(ActionCode::MOUSEBUTTON + sf::Mouse::Left, "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;
|
||
|
|
|
||
|
|
// import pymodule and call start()
|
||
|
|
McRFPy_API::executePyString("import " + pymodule);
|
||
|
|
McRFPy_API::executePyString(pymodule + ".start()");
|
||
|
|
}
|
||
|
|
|
||
|
|
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) {
|
||
|
|
auto mousepos = sf::Mouse::getPosition(game->getWindow());
|
||
|
|
auto dx = mousepos.x - mouseprev.x,
|
||
|
|
dy = mousepos.y - mouseprev.y;
|
||
|
|
drag_grid->center_x += (dx / drag_grid->zoom);
|
||
|
|
drag_grid->center_y += (dy / drag_grid->zoom);
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
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) {
|
||
|
|
if (b.contains(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());
|
||
|
|
if (ACTIONONCE("click")) {
|
||
|
|
// left click start
|
||
|
|
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
|
||
|
|
// if click ended without starting a drag event, try lclick?
|
||
|
|
if (dragstart == mousepos) {
|
||
|
|
// mouse did not move, do click
|
||
|
|
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();
|
||
|
|
}
|