GamepadSample.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "GamepadSample.h"
  2. #if defined(ADD_SAMPLE)
  3. ADD_SAMPLE("Input", "Gamepads", GamepadSample, 3);
  4. #endif
  5. GamepadSample::GamepadSample() : _font(NULL), _gamepad(NULL)
  6. {
  7. }
  8. void GamepadSample::initialize()
  9. {
  10. setMultiTouch(true);
  11. _gamepad = getGamepad(0);
  12. // This is needed because the virtual gamepad is shared between all samples.
  13. // SamplesGame always ensures the virtual gamepad is disabled when a sample is exited.
  14. if (_gamepad && _gamepad->isVirtual())
  15. _gamepad->getForm()->setEnabled(true);
  16. _font = Font::create("res/common/arial.gpb");
  17. _status = "Looking for gamepads...";
  18. }
  19. void GamepadSample::finalize()
  20. {
  21. SAFE_RELEASE(_font);
  22. }
  23. void GamepadSample::updateGamepad(float elapsedTime, Gamepad* gamepad, unsigned int player)
  24. {
  25. char s[128];
  26. sprintf(s, "Player: %d - VendorID: %d, %s, Product ID: %d, %s\nButtons: ",
  27. player,
  28. gamepad->getVendorId(), gamepad->getVendorString(),
  29. gamepad->getProductId(), gamepad->getProductString());
  30. _status += s;
  31. for (int j = 0; j < 20; ++j)
  32. {
  33. if (gamepad->isButtonDown((Gamepad::ButtonMapping)j))
  34. {
  35. sprintf(s, "%s ", getStringFromButtonMapping((Gamepad::ButtonMapping)j));
  36. _status += s;
  37. }
  38. }
  39. _status += "\n";
  40. for (unsigned int j = 0; j < gamepad->getJoystickCount(); ++j)
  41. {
  42. Vector2 joystick;
  43. gamepad->getJoystickValues(j, &joystick);
  44. sprintf(s, "Joystick %d: (%f, %f)\n", j, joystick.x, joystick.y);
  45. _status += s;
  46. }
  47. for (unsigned int j = 0; j < gamepad->getTriggerCount(); ++j)
  48. {
  49. sprintf(s, "Trigger %d: %f\n", j, gamepad->getTriggerValue(j));
  50. _status += s;
  51. }
  52. _status += "\n";
  53. }
  54. void GamepadSample::update(float elapsedTime)
  55. {
  56. _status = "";
  57. if (_gamepad)
  58. updateGamepad(elapsedTime, _gamepad, 1);
  59. }
  60. void GamepadSample::render(float elapsedTime)
  61. {
  62. clear(CLEAR_COLOR_DEPTH, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0);
  63. drawFrameRate(_font, Vector4(0, 0.5f, 1, 1), 5, 1, getFrameRate());
  64. _font->start();
  65. _font->drawText(_status.c_str(), 5, 25, Vector4::one());
  66. _font->finish();
  67. _gamepad->draw();
  68. }
  69. void GamepadSample::gamepadEvent(Gamepad::GamepadEvent evt, Gamepad* gamepad)
  70. {
  71. switch(evt)
  72. {
  73. case Gamepad::CONNECTED_EVENT:
  74. case Gamepad::DISCONNECTED_EVENT:
  75. _gamepad = getGamepad(0);
  76. // This is needed because the virtual gamepad is shared between all samples.
  77. // SamplesGame always ensures the virtual gamepad is disabled when a sample is exited.
  78. if (_gamepad && _gamepad->isVirtual())
  79. _gamepad->getForm()->setEnabled(true);
  80. break;
  81. }
  82. }
  83. const char* GamepadSample::getStringFromButtonMapping(Gamepad::ButtonMapping mapping)
  84. {
  85. switch (mapping)
  86. {
  87. case Gamepad::BUTTON_A:
  88. return "A";
  89. case Gamepad::BUTTON_B:
  90. return "B";
  91. case Gamepad::BUTTON_C:
  92. return "C";
  93. case Gamepad::BUTTON_X:
  94. return "X";
  95. case Gamepad::BUTTON_Y:
  96. return "Y";
  97. case Gamepad::BUTTON_Z:
  98. return "Z";
  99. case Gamepad::BUTTON_MENU1:
  100. return "MENU1";
  101. case Gamepad::BUTTON_MENU2:
  102. return "MENU2";
  103. case Gamepad::BUTTON_MENU3:
  104. return "MENU3";
  105. case Gamepad::BUTTON_MENU4:
  106. return "MENU4";
  107. case Gamepad::BUTTON_L1:
  108. return "L1";
  109. case Gamepad::BUTTON_L2:
  110. return "L2";
  111. case Gamepad::BUTTON_L3:
  112. return "L3";
  113. case Gamepad::BUTTON_R1:
  114. return "R1";
  115. case Gamepad::BUTTON_R2:
  116. return "R2";
  117. case Gamepad::BUTTON_R3:
  118. return "R3";
  119. case Gamepad::BUTTON_UP:
  120. return "UP";
  121. case Gamepad::BUTTON_DOWN:
  122. return "DOWN";
  123. case Gamepad::BUTTON_LEFT:
  124. return "LEFT";
  125. case Gamepad::BUTTON_RIGHT:
  126. return "RIGHT";
  127. default:
  128. return "";
  129. }
  130. }