/
wmigor
/
z-plane
Обзор
Документация
Войти
/
wmigor
/
z-plane
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/src/PlayerAircraftInput.cpp
183 строки
5 KB
wmigor
Плавное управление мышкой
04 июн 2026, 23:00
Верифицирован
04 июн 2026, 23:00
43aa585
Код
Авторство
О чём код?
#include "PlayerAircraftInput.h" #include <glm/glm.hpp> PlayerAircraftInput::PlayerAircraftInput(Aircraft *aircraft): _aircraft(aircraft) { } bool PlayerAircraftInput::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &) { switch (ea.getEventType()) { case osgGA::GUIEventAdapter::DRAG: return handleDrag(ea); case osgGA::GUIEventAdapter::PUSH: _mouseX = ea.getX(); _mouseY = ea.getY(); return true; case osgGA::GUIEventAdapter::KEYDOWN: switch (ea.getKey()) { case osgGA::GUIEventAdapter::KEY_W: _elevatorDown = true; return true; case osgGA::GUIEventAdapter::KEY_S: _elevatorUp = true; return true; case osgGA::GUIEventAdapter::KEY_A: _aileronLeft = true; return true; case osgGA::GUIEventAdapter::KEY_D: _aileronRight = true; return true; case osgGA::GUIEventAdapter::KEY_Q: _rudderLeft = true; return true; case osgGA::GUIEventAdapter::KEY_E: _rudderRight = true; return true; case osgGA::GUIEventAdapter::KEY_Equals: _throttleUp = true; return true; case osgGA::GUIEventAdapter::KEY_Minus: _throttleDown = true; return true; case osgGA::GUIEventAdapter::KEY_I: _flapUp = true; return true; case osgGA::GUIEventAdapter::KEY_K: _flapDown = true; return true; case osgGA::GUIEventAdapter::KEY_Space: _brake = true; return true; case osgGA::GUIEventAdapter::KEY_R: _mouseAilerons = 0.0; _mouseElevator = 0.0; return true; default: break; } break; case osgGA::GUIEventAdapter::KEYUP: switch (ea.getKey()) { case osgGA::GUIEventAdapter::KEY_W: _elevatorDown = false; return true; case osgGA::GUIEventAdapter::KEY_S: _elevatorUp = false; return true; case osgGA::GUIEventAdapter::KEY_A: _aileronLeft = false; return true; case osgGA::GUIEventAdapter::KEY_D: _aileronRight = false; return true; case osgGA::GUIEventAdapter::KEY_Q: _rudderLeft = false; return true; case osgGA::GUIEventAdapter::KEY_E: _rudderRight = false; return true; case osgGA::GUIEventAdapter::KEY_Equals: _throttleUp = false; return true; case osgGA::GUIEventAdapter::KEY_Minus: _throttleDown = false; return true; case osgGA::GUIEventAdapter::KEY_I: _flapUp = false; return true; case osgGA::GUIEventAdapter::KEY_K: _flapDown = false; return true; case osgGA::GUIEventAdapter::KEY_Space: _brake = false; return true; default: break; } break; case osgGA::GUIEventAdapter::FRAME: handleFrame(); break; default: break; } return false; } void PlayerAircraftInput::handleFrame() { auto input = &_aircraft->input; auto ailerons = 0.0; auto elevator = 0.0; auto rudder = 0.0; auto throttle = input->throttle; auto flap = input->flap; auto brake = _brake ? 1.0 : 0.0; if (_aileronLeft) ailerons += 1.0; if (_aileronRight) ailerons -= 1.0; if (_elevatorDown) elevator += 1.0; if (_elevatorUp) elevator -= 1.0; if (_rudderLeft) rudder -= 1.0; if (_rudderRight) rudder += 1.0; if (_throttleDown) throttle -= 1.0; if (_throttleUp) throttle += 1.0; if (_flapDown) flap += 1.0; if (_flapUp) flap -= 1.0; auto delta = 1.0 / 60.0; auto speed = 1.0; throttle = glm::clamp(throttle, 0.0, 1.0); flap = glm::clamp(flap, 0.0, 1.0); _keyAilerons = moveToward(_keyAilerons, ailerons, delta * speed); _keyElevator = moveToward(_keyElevator, elevator, delta * speed); input->ailerons = glm::clamp(_keyAilerons+ _mouseAilerons, -1.0, 1.0); input->elevator = glm::clamp(_keyElevator + _mouseElevator, -1.0, 1.0); input->rudder = moveToward(input->rudder, rudder, delta * speed); input->throttle = moveToward(input->throttle, throttle, delta * speed); input->flap = moveToward(input->flap, flap, delta * speed); input->brake = moveToward(input->brake, brake, delta * speed); } bool PlayerAircraftInput::handleDrag(const osgGA::GUIEventAdapter &ea) { if (!(ea.getButtonMask() & osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)) return false; auto hScale = ea.getWindowWidth() / 2; _mouseAilerons = glm::clamp(_mouseAilerons + (_mouseX - ea.getX()) / hScale, -1.0, 1.0); _mouseX = ea.getX(); auto vScale = ea.getWindowHeight() / 2; _mouseElevator = glm::clamp(_mouseElevator + (ea.getY() - _mouseY) / vScale, -1.0, 1.0); _mouseY = ea.getY(); return true; } double PlayerAircraftInput::moveToward(double value, double target, double speed) { auto min = glm::min(value, target); auto max = glm::max(value, target); auto direction = target - value > 0.0 ? 1.0 : -1.0; return glm::clamp(value + direction * speed, min, max); }