void CameraTool::handleScroll(InputState& inputState) { if (inputState.modifierKeys() != ModifierKeys::MKNone && inputState.modifierKeys() != ModifierKeys::MKAlt) return; if (m_orbit) { const Renderer::Camera& camera = inputState.camera(); Planef orbitPlane(camera.direction(), m_orbitCenter); float maxForward = orbitPlane.intersectWithRay(Rayf(camera.position(), camera.direction())) - 32.0f; float forward = inputState.scrollY() * moveSpeed(false); if (maxForward < 0.0f) maxForward = 0.0f; if (forward > maxForward) forward = maxForward; CameraMoveEvent cameraEvent; cameraEvent.setForward(forward); postEvent(cameraEvent); } else { Preferences::PreferenceManager& prefs = Preferences::PreferenceManager::preferences(); const Renderer::Camera& camera = inputState.camera(); const Vec3f moveDirection = prefs.getBool(Preferences::CameraMoveInCursorDir) ? inputState.pickRay().direction : camera.direction(); const float distance = inputState.scrollY() * moveSpeed(false); const Vec3f moveVector = distance * moveDirection; CameraMoveEvent cameraEvent; cameraEvent.setForward(moveVector.dot(camera.direction())); cameraEvent.setRight(moveVector.dot(camera.right())); cameraEvent.setUp(moveVector.dot(camera.up())); postEvent(cameraEvent); } }
void enemy::manhackAI(float elapsed) { flying = false; manhackTargetAcquire(); if (!weaponMelee() && attacking() && bowDrawn()) endAttack(); if (target != NULL) { startAttack(); flying = true; float myX = getX() + getMaskWidth() / 2; float theirX = target->getX() + target->getMaskWidth() / 2; if (theirX > myX) facingX = 1; else facingX = -1; //find the desired position float desiredX = target->getX() + target->getMaskWidth() / 2; float desiredY = target->getY() + target->getMaskHeight() / 2; desiredX += orbitRange * cos(angle); desiredY += orbitRange * sin(angle); if (timer >= 0) //orbit the desired position angle += elapsed * orbitSpeed; if (weaponMelee()) { //handle the timer float oldT = timer; timer += elapsed * ORBITTIMERSPEED; if (oldT < 0 && timer >= 0) manhackAIOrbitDetails(); //move back out again else if (timer >= 1 && getY() <= target->getY()) { //move in for the strike! timer = orbitRange * -ORBITTIMERSPEED / moveSpeed(); orbitRange = 0; } } //move in that direction float xDif = desiredX - x; float yDif = desiredY - y; float dis = sqrt(xDif * xDif + yDif * yDif); if (dis <= moveSpeed() * elapsed) { x = desiredX; y = desiredY; } else flyMove(xDif / dis, yDif / dis, elapsed); } }
void CameraTool::handleScroll(InputState& inputState) { if (inputState.modifierKeys() != ModifierKeys::MKNone && inputState.modifierKeys() != ModifierKeys::MKAlt) return; if (m_orbit) { const Renderer::Camera& camera = inputState.camera(); Plane orbitPlane(camera.direction(), m_orbitCenter); float maxForward = orbitPlane.intersectWithRay(Ray(camera.position(), camera.direction())) - 32.0f; float forward = inputState.scrollY() * moveSpeed(); if (maxForward < 0.0f) maxForward = 0.0f; if (forward > maxForward) forward = maxForward; CameraMoveEvent cameraEvent; cameraEvent.setForward(forward); postEvent(cameraEvent); } else { CameraMoveEvent cameraEvent; cameraEvent.setForward(inputState.scrollY() * moveSpeed()); cameraEvent.setRight(inputState.scrollX() * moveSpeed()); postEvent(cameraEvent); } }
bool Player::simulate(const Ogre::Real elapsedTime) { if(inMotion) { Ogre::Vector3 nowPos = rootNode->getPosition(); if(direction == 0) { Ogre::Vector3 nextPos = Ogre::Vector3(nowPos.x, nowPos.y, nowPos.z - moveSpeed() * elapsedTime); if(nextPos.z < endPos.z) { rootNode->setPosition(endPos); playerX -= 1; inMotion = false; return true; } else rootNode->setPosition(nextPos); } else if(direction == 1) { Ogre::Vector3 nextPos = Ogre::Vector3(nowPos.x + moveSpeed() * elapsedTime, nowPos.y, nowPos.z); if(nextPos.x > endPos.x) { rootNode->setPosition(endPos); playerY += 1; inMotion = false; return true; } else rootNode->setPosition(nextPos); } else if(direction == 2) { Ogre::Vector3 nextPos = Ogre::Vector3(nowPos.x, nowPos.y, nowPos.z + moveSpeed() * elapsedTime); if(nextPos.z > endPos.z) { rootNode->setPosition(endPos); playerX += 1; inMotion = false; return true; } else rootNode->setPosition(nextPos); } else if(direction == 3) { Ogre::Vector3 nextPos = Ogre::Vector3(nowPos.x - moveSpeed() * elapsedTime, nowPos.y, nowPos.z); if(nextPos.x < endPos.x) { rootNode->setPosition(endPos); playerY -= 1; inMotion = false; return true; } else rootNode->setPosition(nextPos); } } return false; }
void AbstractCubester::simulate(const Ogre::Real elapsedTime, Ogre::Vector3 playerPos) { if(!inMotion) { direction = getAction(playerPos); if(direction != -1) inMotion = true; } Ogre::Vector3 nowPos = rootNode->getPosition(); if(direction == 0) { rootNode->setPosition(Ogre::Vector3(nowPos.x, nowPos.y, nowPos.z - moveSpeed() * elapsedTime)); if(rootNode->getPosition().z < endPos.z) { rootNode->setPosition(endPos); // playerX -= 1; inMotion = false; return; } } else if(direction == 1) { rootNode->setPosition(Ogre::Vector3(nowPos.x + moveSpeed() * elapsedTime, nowPos.y, nowPos.z)); if(rootNode->getPosition().x > endPos.x) { rootNode->setPosition(endPos); // playerY += 1; inMotion = false; return; } } else if(direction == 2) { rootNode->setPosition(Ogre::Vector3(nowPos.x, nowPos.y, nowPos.z + moveSpeed() * elapsedTime)); if(rootNode->getPosition().z > endPos.z) { rootNode->setPosition(endPos); // playerX += 1; inMotion = false; return; } } else if(direction == 3) { rootNode->setPosition(Ogre::Vector3(nowPos.x - moveSpeed() * elapsedTime, nowPos.y, nowPos.z)); if(rootNode->getPosition().x < endPos.x) { rootNode->setPosition(endPos); // playerY -= 1; inMotion = false; return; } } }
bool CameraTool::handleDrag(InputState& inputState) { if (inputState.mouseButtons() == MouseButtons::MBRight) { if (m_orbit) { CameraOrbitEvent cameraEvent; cameraEvent.setHAngle(inputState.deltaX() * lookSpeed(false)); cameraEvent.setVAngle(inputState.deltaY() * lookSpeed(true)); cameraEvent.setCenter(m_orbitCenter); postEvent(cameraEvent); } else { CameraLookEvent cameraEvent; cameraEvent.setHAngle(inputState.deltaX() * lookSpeed(false)); cameraEvent.setVAngle(inputState.deltaY() * lookSpeed(true)); postEvent(cameraEvent); } } else if (inputState.mouseButtons() == MouseButtons::MBMiddle) { Preferences::PreferenceManager& prefs = Preferences::PreferenceManager::preferences(); bool enableAltMove = prefs.getBool(Preferences::CameraEnableAltMove); CameraMoveEvent cameraEvent; if (enableAltMove && inputState.modifierKeys() == ModifierKeys::MKAlt) { cameraEvent.setRight(inputState.deltaX() * panSpeed(false)); cameraEvent.setForward(inputState.deltaY() * -moveSpeed(true)); } else { cameraEvent.setRight(inputState.deltaX() * panSpeed(false)); cameraEvent.setUp(inputState.deltaY() * panSpeed(true)); } postEvent(cameraEvent); } return true; }
void enemy::copterAI(float elapsed) { manhackTargetAcquire(); flying = false; if (attacking() && bowDrawn()) endAttack(); if (target != NULL) { flying = true; float myX = getX() + getMaskWidth() / 2; float theirX = target->getX() + target->getMaskWidth() / 2; float myY = getY() + getMaskHeight() / 2; float theirY = target->getY() + target->getMaskHeight() / 2; float xDif = abs(myX - theirX); float yDif = abs(myY - theirY); if (myX > theirX) facingX = -1; else facingX = 1; float xMove = 0; float yMove = 0; if (xDif > maxRange) { if (myX > theirX) xMove = -1; else xMove = 1; } else if (xDif < maxRange / 2) { if (myX > theirX) xMove = COPTERBACKOFF; else xMove = -COPTERBACKOFF; } if (yDif > moveSpeed() * elapsed) { if (myY > theirY) yMove = -1; else yMove = 1; } if (yDif < CLOSERANGE) startAttack(); if (xMove != 0 || yMove != 0) { float dif = sqrt(xMove * xMove + yMove * yMove); flyMove(xMove / dif, yMove / dif, elapsed); } } }
void WheelController::setEnabled(bool value) { std::unique_lock<std::mutex> guard(cmdLock); if (isEnabled && !value) { moveSpeed(0, 0); } isEnabled = value; }
WheelController::~WheelController() { try { moveSpeed(0, 0); } catch (...) { } }
int main() { enum Direction { Right, Left, Down, Up }; sf::Vector2i blockDimensions(10, 10); sf::Vector2i source(1, Down); float frameCounter = 0, switchFrame = 100, frameSpeed = 500; srand(time(0)); sf::RenderWindow window; //2D Array Vector sf::Vector2u windowSize(800, 600); //Create the window window.create(sf::VideoMode(windowSize.x, windowSize.y), "RPG", sf::Style::Default); //Actual time sf::Clock clock; sf::Time time = sf::seconds(2); bool updateFrame = true; std::string message = "Hello my name is Max"; std::string display = ""; int index = 0; //Stops key repeat when holding down //window.setKeyRepeatEnabled(false); //Load in a font type sf::Font font; if (!font.loadFromFile("modern.fon")) std::cout << "Can't find font file" << std::endl; //Make a string, load into text, and do things with text sf::String sentence; sf::Text text(sentence, font, 40); text.setColor(sf::Color(44, 127, 255)); text.setStyle(sf::Text::Bold | sf::Text::Underlined); //Images and Sprites sf::Texture playerTexture; //Loads in spritemap if (!playerTexture.loadFromFile("Monsters4.png")) std::cout << "Error: Could not load Player Image" << std::endl; sf::Sprite playerSprite; playerSprite.setTexture(playerTexture); playerSprite.setPosition(0, 0); //Checks controller connection before the game loop starts if (sf::Joystick::isConnected(0)) std::cout << "Joystick 1 is connected" << std::endl; else std::cout << "Joystick 1 is disconnected" << std::endl; //Gets number of buttons on controller int buttonCount = sf::Joystick::getButtonCount(0); std::cout << "Number of controller buttons: " << buttonCount << std::endl; //Check if controller has axis bool hasAxis = sf::Joystick::hasAxis(0, sf::Joystick::Z); //Update loop while (window.isOpen()) { //Make an event sf::Event evt; //Loop checking for any event while (window.pollEvent(evt)) { //Event Finders switch (evt.type) { case sf::Event::Closed: window.close(); break; //Various Mouse Events case sf::Event::MouseEntered: //std::cout << "Mouse in screen bounds" << std::endl; break; case sf::Event::MouseLeft: //std::cout << "Mouse not in screen bound" << std::endl; break; case sf::Event::MouseMoved: //std::cout << "X: " << evt.mouseMove.x << "Y: " << evt.mouseMove.y << std::endl; break; case sf::Event::MouseButtonPressed: if (evt.mouseButton.button == sf::Mouse::Left) // std::cout << "Left Button Pressed at: X:" << evt.mouseButton.x << "Y: " << evt.mouseButton.y << std::endl; break; case sf::Event::MouseWheelMoved: //std::cout << "Delta: "/*Positive: Down, Negative: Up. Higher number = harder scrolling*/ << evt.mouseWheel.delta << std::endl; break; //Keyboard Events case sf::Event::KeyPressed: /*if (evt.key.code == sf::Keyboard::Return) window.close(); else if (evt.key.code == sf::Keyboard::Up) source.y = Up; else if (evt.key.code == sf::Keyboard::Down) { source.y = Down; source.x++; if (source.x * 32 >= playerTexture.getSize().x) source.x = 0; } else if (evt.key.code == sf::Keyboard::Right) source.y = Right; else if (evt.key.code == sf::Keyboard::Left) source.y = Left; break;*/ //Text Events (Letters Keyboard) case sf::Event::TextEntered: //Only regular characters if (evt.text.unicode != 8) { if (evt.text.unicode >= 33 && evt.text.unicode <= 126) display += (char)evt.text.unicode; } else if (evt.text.unicode == 8) display = display.substr(0, display.length() - 1); //CMD Code for clear -- clear for Linux/Mac system("cls"); //std::cout << display; break; //Controller Events -- May change based on drivers case sf::Event::JoystickConnected: //Shows which joystick is connected //std::cout << "Joystick" << evt.joystickConnect.joystickId + 1 << "is connected" << std::endl; break; case sf::Event::JoystickDisconnected: //Shows which joystick is disconnected //std::cout << "Joystick" << evt.joystickConnect.joystickId + 1 << "is disconnected" << std::endl; break; //Use this one to change controller button mapping case sf::Event::JoystickButtonPressed: //std::cout << "Button: " << evt.joystickButton.button << std::endl; break; //Check position if controller case sf::Event::JoystickMoved: if (evt.joystickMove.axis == sf::Joystick::X) // std::cout << "Position : " << evt.joystickMove.position << std::endl; break; //Window Events case sf::Event::GainedFocus: //std::cout << "Window now active" << std::endl; break; case sf::Event::LostFocus: //std::cout << "Window not active" << std::endl; break; case sf::Event::Resized: //std::cout << "Width: " << evt.size.width << "Height: " << evt.size.height << std::endl; break; } } //Live keyboard input -- Can hold down keys if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { source.y = Up; playerSprite.move(0, -0.1); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { source.y = Down; playerSprite.move(0, 0.1); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { source.y = Right; playerSprite.move(0.1, 0); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { source.y = Left; playerSprite.move(-0.1, 0); } sf::Vector2f moveSpeed(sf::Joystick::getAxisPosition(0, sf::Joystick::X), sf::Joystick::getAxisPosition(0, sf::Joystick::Y)); if (moveSpeed.x > 0) source.y = Right; else if (moveSpeed.x < 0) source.y = Left; else if (moveSpeed.y < 0) source.y = Up; else if (moveSpeed.y > 0) source.y = Down; playerSprite.move(moveSpeed.x * clock.getElapsedTime().asSeconds(), moveSpeed.y * clock.getElapsedTime().asSeconds()); //Gets actual position in window. Without parameter, mouse position for the monitor sf::Vector2i mousePosition = sf::Mouse::getPosition(window); //Sets a fixed position for mouse in window //sf::Mouse::setPosition(sf::Vector2i(100, 100), window); std::cout << "X: " << mousePosition.x << "Y: " << mousePosition.y << std::endl; //Live mouse input if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) updateFrame = true; else if (sf::Mouse::isButtonPressed(sf::Mouse::Right)) updateFrame = false; //Same as above for controller if (sf::Joystick::isButtonPressed(0, 1)) updateFrame = true; else if (sf::Joystick::isButtonPressed(0, 2)) updateFrame = false; //Starts sprite animation if (updateFrame) frameCounter += frameSpeed * clock.restart().asSeconds(); else frameCounter = 0; //Change speed of animation if (frameCounter >= switchFrame) { frameCounter = 0; source.x++; if (source.x * 32 >= playerTexture.getSize().x) source.x = 0; } //Vertex Arrays are geometry objects /*for (int i = 0; i < windowSize.x / blockDimensions.x; i++) { for (int j = 0; j < windowSize.y / blockDimensions.y; j++) { sf::VertexArray vArray(sf::PrimitiveType::LinesStrip, 4); vArray[0].position = sf::Vector2f(i * blockDimensions.x, j * blockDimensions.y); vArray[1].position = sf::Vector2f(i * blockDimensions.x + blockDimensions.x, j * blockDimensions.y + blockDimensions.y); vArray[2].position = sf::Vector2f(i * blockDimensions.x + blockDimensions.x, j * blockDimensions.y + blockDimensions.y); vArray[3].position = sf::Vector2f(i * blockDimensions.x, j * blockDimensions.y + blockDimensions.y); for (int k = 0; k < 4; k++) { int red = rand() % 255; int green = rand() % 255; int blue = rand() % 255; vArray[k].color = sf::Color(red, green, blue); } window.draw(vArray); } }*/ sf::RectangleShape rect(sf::Vector2f(100, 100)); rect.setFillColor(sf::Color(255, 0, 0, 255)); rect.setOutlineColor(sf::Color::Blue); rect.setOutlineThickness(2.0f); rect.setPosition(sf::Vector2f(20, 20)); rect.setTexture(&playerTexture); //Wait for an event to happen /*if (window.waitEvent(evt)) { std::cout << "Event" << std::endl; }*/ //Actual time time = clock.getElapsedTime(); //Can be one line clock.restart(); //Send up ^^^^^^ playerSprite.setTextureRect(sf::IntRect(source.x * 32, source.y * 32, 32, 32)); window.clear(); //Draw to screen window.draw(playerSprite); window.draw(rect); //Update window window.display(); } }