testjoystick.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Simple program to test the SDL joystick routines */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "SDL.h"
  6. #define SCREEN_WIDTH 640
  7. #define SCREEN_HEIGHT 480
  8. void WatchJoystick(SDL_Joystick *joystick)
  9. {
  10. SDL_Surface *screen;
  11. const char *name;
  12. int i, done;
  13. SDL_Event event;
  14. int x, y, draw;
  15. SDL_Rect axis_area[2];
  16. /* Set a video mode to display joystick axis position */
  17. screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0);
  18. if ( screen == NULL ) {
  19. fprintf(stderr, "Couldn't set video mode: %sn",SDL_GetError());
  20. return;
  21. }
  22. /* Print info about the joystick we are watching */
  23. name = SDL_JoystickName(SDL_JoystickIndex(joystick));
  24. printf("Watching joystick %d: (%s)n", SDL_JoystickIndex(joystick),
  25.        name ? name : "Unknown Joystick");
  26. printf("Joystick has %d axes, %d hats, %d balls, and %d buttonsn",
  27.        SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick),
  28.        SDL_JoystickNumBalls(joystick),SDL_JoystickNumButtons(joystick));
  29. /* Initialize drawing rectangles */
  30. memset(axis_area, 0, (sizeof axis_area));
  31. draw = 0;
  32. /* Loop, getting joystick events! */
  33. done = 0;
  34. while ( ! done ) {
  35. while ( SDL_PollEvent(&event) ) {
  36. switch (event.type) {
  37.     case SDL_JOYAXISMOTION:
  38. printf("Joystick %d axis %d value: %dn",
  39.        event.jaxis.which,
  40.        event.jaxis.axis,
  41.        event.jaxis.value);
  42. break;
  43.     case SDL_JOYHATMOTION:
  44. printf("Joystick %d hat %d value:",
  45.        event.jhat.which,
  46.        event.jhat.hat);
  47. if ( event.jhat.value == SDL_HAT_CENTERED )
  48. printf(" centered");
  49. if ( event.jhat.value & SDL_HAT_UP )
  50. printf(" up");
  51. if ( event.jhat.value & SDL_HAT_RIGHT )
  52. printf(" right");
  53. if ( event.jhat.value & SDL_HAT_DOWN )
  54. printf(" down");
  55. if ( event.jhat.value & SDL_HAT_LEFT )
  56. printf(" left");
  57. printf("n");
  58. break;
  59.     case SDL_JOYBALLMOTION:
  60. printf("Joystick %d ball %d delta: (%d,%d)n",
  61.        event.jball.which,
  62.        event.jball.ball,
  63.        event.jball.xrel,
  64.        event.jball.yrel);
  65. break;
  66.     case SDL_JOYBUTTONDOWN:
  67. printf("Joystick %d button %d downn",
  68.        event.jbutton.which,
  69.        event.jbutton.button);
  70. break;
  71.     case SDL_JOYBUTTONUP:
  72. printf("Joystick %d button %d upn",
  73.        event.jbutton.which,
  74.        event.jbutton.button);
  75. break;
  76.     case SDL_KEYDOWN:
  77. if ( event.key.keysym.sym != SDLK_ESCAPE ) {
  78. break;
  79. }
  80. /* Fall through to signal quit */
  81.     case SDL_QUIT:
  82. done = 1;
  83. break;
  84.     default:
  85. break;
  86. }
  87. }
  88. /* Update visual joystick state */
  89. for ( i=0; i<SDL_JoystickNumButtons(joystick); ++i ) {
  90. SDL_Rect area;
  91. area.x = i*34;
  92. area.y = SCREEN_HEIGHT-34;
  93. area.w = 32;
  94. area.h = 32;
  95. if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) {
  96. SDL_FillRect(screen, &area, 0xFFFF);
  97. } else {
  98. SDL_FillRect(screen, &area, 0x0000);
  99. }
  100. SDL_UpdateRects(screen, 1, &area);
  101. }
  102. /* Erase previous axes */
  103. SDL_FillRect(screen, &axis_area[draw], 0x0000);
  104. /* Draw the X/Y axis */
  105. draw = !draw;
  106. x = (((int)SDL_JoystickGetAxis(joystick, 0))+32768);
  107. x *= SCREEN_WIDTH;
  108. x /= 65535;
  109. if ( x < 0 ) {
  110. x = 0;
  111. } else
  112. if ( x > (SCREEN_WIDTH-16) ) {
  113. x = SCREEN_WIDTH-16;
  114. }
  115. y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768);
  116. y *= SCREEN_HEIGHT;
  117. y /= 65535;
  118. if ( y < 0 ) {
  119. y = 0;
  120. } else
  121. if ( y > (SCREEN_HEIGHT-16) ) {
  122. y = SCREEN_HEIGHT-16;
  123. }
  124. axis_area[draw].x = (Sint16)x;
  125. axis_area[draw].y = (Sint16)y;
  126. axis_area[draw].w = 16;
  127. axis_area[draw].h = 16;
  128. SDL_FillRect(screen, &axis_area[draw], 0xFFFF);
  129. SDL_UpdateRects(screen, 2, axis_area);
  130. }
  131. }
  132. int main(int argc, char *argv[])
  133. {
  134. const char *name;
  135. int i;
  136. SDL_Joystick *joystick;
  137. /* Initialize SDL (Note: video is required to start event loop) */
  138. if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 ) {
  139. fprintf(stderr, "Couldn't initialize SDL: %sn",SDL_GetError());
  140. exit(1);
  141. }
  142. /* Print information about the joysticks */
  143. printf("There are %d joysticks attachedn", SDL_NumJoysticks());
  144. for ( i=0; i<SDL_NumJoysticks(); ++i ) {
  145. name = SDL_JoystickName(i);
  146. printf("Joystick %d: %sn",i,name ? name : "Unknown Joystick");
  147. }
  148. if ( argv[1] ) {
  149. joystick = SDL_JoystickOpen(atoi(argv[1]));
  150. if ( joystick == NULL ) {
  151. printf("Couldn't open joystick %d: %sn", atoi(argv[1]),
  152.        SDL_GetError());
  153. } else {
  154. WatchJoystick(joystick);
  155. SDL_JoystickClose(joystick);
  156. }
  157. }
  158. SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
  159. return(0);
  160. }