WasdController.qml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. // Copyright (C) 2019 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
  3. import QtQuick
  4. import QtQuick3D
  5. Item {
  6. id: root
  7. property Node controlledObject: undefined
  8. property real speed: 1
  9. property real shiftSpeed: 3
  10. property real forwardSpeed: 5
  11. property real backSpeed: 5
  12. property real rightSpeed: 5
  13. property real leftSpeed: 5
  14. property real upSpeed: 5
  15. property real downSpeed: 5
  16. property real xSpeed: 0.1
  17. property real ySpeed: 0.1
  18. property bool xInvert: false
  19. property bool yInvert: true
  20. property bool mouseEnabled: true
  21. property bool keysEnabled: true
  22. readonly property bool inputsNeedProcessing: status.moveForward | status.moveBack
  23. | status.moveLeft | status.moveRight
  24. | status.moveUp | status.moveDown
  25. | status.useMouse
  26. property alias acceptedButtons: dragHandler.acceptedButtons
  27. implicitWidth: parent.width
  28. implicitHeight: parent.height
  29. focus: keysEnabled
  30. DragHandler {
  31. id: dragHandler
  32. target: null
  33. enabled: root.mouseEnabled
  34. onCentroidChanged: {
  35. root.mouseMoved(Qt.vector2d(centroid.position.x, centroid.position.y));
  36. }
  37. onActiveChanged: {
  38. if (active)
  39. root.mousePressed(Qt.vector2d(centroid.position.x, centroid.position.y));
  40. else
  41. root.mouseReleased(Qt.vector2d(centroid.position.x, centroid.position.y));
  42. }
  43. }
  44. TapHandler {
  45. acceptedButtons: dragHandler.acceptedButtons
  46. onTapped: root.forceActiveFocus() // qmllint disable signal-handler-parameters
  47. }
  48. Keys.onPressed: (event)=> { if (keysEnabled && !event.isAutoRepeat) handleKeyPress(event) }
  49. Keys.onReleased: (event)=> { if (keysEnabled && !event.isAutoRepeat) handleKeyRelease(event) }
  50. function mousePressed(newPos) {
  51. root.forceActiveFocus()
  52. status.currentPos = newPos
  53. status.lastPos = newPos
  54. status.useMouse = true;
  55. }
  56. function mouseReleased(newPos) {
  57. status.useMouse = false;
  58. }
  59. function mouseMoved(newPos) {
  60. status.currentPos = newPos;
  61. }
  62. function forwardPressed() {
  63. status.moveForward = true
  64. status.moveBack = false
  65. }
  66. function forwardReleased() {
  67. status.moveForward = false
  68. }
  69. function backPressed() {
  70. status.moveBack = true
  71. status.moveForward = false
  72. }
  73. function backReleased() {
  74. status.moveBack = false
  75. }
  76. function rightPressed() {
  77. status.moveRight = true
  78. status.moveLeft = false
  79. }
  80. function rightReleased() {
  81. status.moveRight = false
  82. }
  83. function leftPressed() {
  84. status.moveLeft = true
  85. status.moveRight = false
  86. }
  87. function leftReleased() {
  88. status.moveLeft = false
  89. }
  90. function upPressed() {
  91. status.moveUp = true
  92. status.moveDown = false
  93. }
  94. function upReleased() {
  95. status.moveUp = false
  96. }
  97. function downPressed() {
  98. status.moveDown = true
  99. status.moveUp = false
  100. }
  101. function downReleased() {
  102. status.moveDown = false
  103. }
  104. function shiftPressed() {
  105. status.shiftDown = true
  106. }
  107. function shiftReleased() {
  108. status.shiftDown = false
  109. }
  110. function handleKeyPress(event)
  111. {
  112. switch (event.key) {
  113. case Qt.Key_W:
  114. case Qt.Key_Up:
  115. forwardPressed();
  116. break;
  117. case Qt.Key_S:
  118. case Qt.Key_Down:
  119. backPressed();
  120. break;
  121. case Qt.Key_A:
  122. case Qt.Key_Left:
  123. leftPressed();
  124. break;
  125. case Qt.Key_D:
  126. case Qt.Key_Right:
  127. rightPressed();
  128. break;
  129. case Qt.Key_R:
  130. case Qt.Key_PageUp:
  131. upPressed();
  132. break;
  133. case Qt.Key_F:
  134. case Qt.Key_PageDown:
  135. downPressed();
  136. break;
  137. case Qt.Key_Shift:
  138. shiftPressed();
  139. break;
  140. }
  141. }
  142. function handleKeyRelease(event)
  143. {
  144. switch (event.key) {
  145. case Qt.Key_W:
  146. case Qt.Key_Up:
  147. forwardReleased();
  148. break;
  149. case Qt.Key_S:
  150. case Qt.Key_Down:
  151. backReleased();
  152. break;
  153. case Qt.Key_A:
  154. case Qt.Key_Left:
  155. leftReleased();
  156. break;
  157. case Qt.Key_D:
  158. case Qt.Key_Right:
  159. rightReleased();
  160. break;
  161. case Qt.Key_R:
  162. case Qt.Key_PageUp:
  163. upReleased();
  164. break;
  165. case Qt.Key_F:
  166. case Qt.Key_PageDown:
  167. downReleased();
  168. break;
  169. case Qt.Key_Shift:
  170. shiftReleased();
  171. break;
  172. }
  173. }
  174. FrameAnimation {
  175. id: updateTimer
  176. running: root.inputsNeedProcessing
  177. onTriggered: status.processInput(frameTime * 100)
  178. }
  179. QtObject {
  180. id: status
  181. property bool moveForward: false
  182. property bool moveBack: false
  183. property bool moveLeft: false
  184. property bool moveRight: false
  185. property bool moveUp: false
  186. property bool moveDown: false
  187. property bool shiftDown: false
  188. property bool useMouse: false
  189. property vector2d lastPos: Qt.vector2d(0, 0)
  190. property vector2d currentPos: Qt.vector2d(0, 0)
  191. function updatePosition(vector, speed, position)
  192. {
  193. if (shiftDown)
  194. speed *= root.shiftSpeed;
  195. else
  196. speed *= root.speed
  197. var direction = vector;
  198. var velocity = Qt.vector3d(direction.x * speed,
  199. direction.y * speed,
  200. direction.z * speed);
  201. controlledObject.position = Qt.vector3d(position.x + velocity.x,
  202. position.y + velocity.y,
  203. position.z + velocity.z);
  204. }
  205. function negate(vector) {
  206. return Qt.vector3d(-vector.x, -vector.y, -vector.z)
  207. }
  208. function processInput(frameDelta) {
  209. if (root.controlledObject == undefined)
  210. return;
  211. if (moveForward)
  212. updatePosition(root.controlledObject.forward, root.forwardSpeed * frameDelta, root.controlledObject.position);
  213. else if (moveBack)
  214. updatePosition(negate(root.controlledObject.forward), root.backSpeed * frameDelta, root.controlledObject.position);
  215. if (moveRight)
  216. updatePosition(root.controlledObject.right, root.rightSpeed * frameDelta, root.controlledObject.position);
  217. else if (moveLeft)
  218. updatePosition(negate(root.controlledObject.right), root.leftSpeed * frameDelta, root.controlledObject.position);
  219. if (moveDown)
  220. updatePosition(negate(root.controlledObject.up), root.downSpeed * frameDelta, root.controlledObject.position);
  221. else if (moveUp)
  222. updatePosition(root.controlledObject.up, root.upSpeed * frameDelta, root.controlledObject.position);
  223. if (useMouse) {
  224. // Get the delta
  225. var rotationVector = root.controlledObject.eulerRotation;
  226. var delta = Qt.vector2d(lastPos.x - currentPos.x,
  227. lastPos.y - currentPos.y);
  228. // rotate x
  229. var rotateX = delta.x * xSpeed * frameDelta
  230. if (xInvert)
  231. rotateX = -rotateX;
  232. rotationVector.y += rotateX;
  233. // rotate y
  234. var rotateY = delta.y * -ySpeed * frameDelta
  235. if (yInvert)
  236. rotateY = -rotateY;
  237. rotationVector.x += rotateY;
  238. controlledObject.setEulerRotation(rotationVector);
  239. lastPos = currentPos;
  240. }
  241. }
  242. }
  243. }