Joystick support

Erik Auerswald auerswal at unix-ag.uni-kl.de
Mon May 2 14:11:50 EDT 2005


Hi,

I've implemented basic joystick support for airstrike. It's only been tested
with linux. The configuration is hardcoded in the source (similarly to the
keyboard configuration). The patch is attached to this mail.

Erik
-------------- next part --------------
diff -bNru airstrike/src/core/core.h airstrike-joystick/src/core/core.h
--- airstrike/src/core/core.h	2005-01-19 23:07:08.000000000 +0100
+++ airstrike-joystick/src/core/core.h	2005-05-02 17:59:29.068868639 +0200
@@ -13,5 +13,6 @@
 #include "sound.h"
 #include "text.h"
 #include "input.h"
+#include "joystick.h"
 
 #endif
diff -bNru airstrike/src/core/joystick.c airstrike-joystick/src/core/joystick.c
--- airstrike/src/core/joystick.c	1970-01-01 01:00:00.000000000 +0100
+++ airstrike-joystick/src/core/joystick.c	2005-05-02 19:28:03.110834121 +0200
@@ -0,0 +1,98 @@
+#include <SDL.h>
+#include <stdio.h>
+#include "joystick.h"
+#include "xalloc.h"
+
+static SDL_Joystick **joystick;
+static int number_of_joysticks = 0;
+
+/* initialize joystick subsystem */
+void joystick_setup(void) {
+  if(!SDL_WasInit(SDL_INIT_JOYSTICK)) {
+    SDL_InitSubSystem(SDL_INIT_JOYSTICK);
+  }
+  SDL_JoystickEventState(SDL_IGNORE);
+  joystick = xcalloc(SDL_NumJoysticks(), sizeof(SDL_Joystick *));
+  number_of_joysticks = SDL_NumJoysticks();
+}
+
+/* open joystick */
+int open_joystick(int joy_no) {
+  if((joy_no < number_of_joysticks) && (!SDL_JoystickOpened(joy_no))) {
+    joystick[joy_no] = SDL_JoystickOpen(joy_no);
+    return joy_no;
+  } else {
+    fprintf(stderr, "could not open joystick %d\n",joy_no);
+    return -1;
+  }
+}
+
+/* close joysticks */
+void close_joysticks(void) {
+  int i;
+
+  for(i=0; i<number_of_joysticks; i++) {
+    if(joystick[i]) {
+      SDL_JoystickClose(joystick[i]);
+    }
+  }
+}
+
+/* query status of joystick */
+int joy_active(int joy_no, int actuator) {
+  if((joy_no >= number_of_joysticks) || (!joystick[joy_no])) {
+    return 0;
+  }
+  SDL_JoystickUpdate();
+  switch(actuator) {
+    case JOY_AXIS0_POS:
+      return ((SDL_JoystickGetAxis(joystick[joy_no], 0) / JOY_THRESHOLD) > 0);
+    case JOY_AXIS0_NEG:
+      return (-(SDL_JoystickGetAxis(joystick[joy_no], 0) / JOY_THRESHOLD) > 0);
+    case JOY_AXIS1_POS:
+      return ((SDL_JoystickGetAxis(joystick[joy_no], 1) / JOY_THRESHOLD) > 0);
+    case JOY_AXIS1_NEG:
+      return (-(SDL_JoystickGetAxis(joystick[joy_no], 1) / JOY_THRESHOLD) > 0);
+    case JOY_AXIS2_POS:
+      return ((SDL_JoystickGetAxis(joystick[joy_no], 2) / JOY_THRESHOLD) > 0);
+    case JOY_AXIS2_NEG:
+      return (-(SDL_JoystickGetAxis(joystick[joy_no], 2) / JOY_THRESHOLD) > 0);
+    case JOY_AXIS3_POS:
+      return ((SDL_JoystickGetAxis(joystick[joy_no], 3) / JOY_THRESHOLD) > 0);
+    case JOY_AXIS3_NEG:
+      return (-(SDL_JoystickGetAxis(joystick[joy_no], 3) / JOY_THRESHOLD) > 0);
+    case JOY_BUTTON0:
+      return SDL_JoystickGetButton(joystick[joy_no], 0);
+    case JOY_BUTTON1:
+      return SDL_JoystickGetButton(joystick[joy_no], 1);
+    case JOY_BUTTON2:
+      return SDL_JoystickGetButton(joystick[joy_no], 2);
+    case JOY_BUTTON3:
+      return SDL_JoystickGetButton(joystick[joy_no], 3);
+    case JOY_BUTTON4:
+      return SDL_JoystickGetButton(joystick[joy_no], 4);
+    case JOY_BUTTON5:
+      return SDL_JoystickGetButton(joystick[joy_no], 5);
+    case JOY_BUTTON6:
+      return SDL_JoystickGetButton(joystick[joy_no], 6);
+    case JOY_BUTTON7:
+      return SDL_JoystickGetButton(joystick[joy_no], 7);
+    case JOY_BUTTON8:
+      return SDL_JoystickGetButton(joystick[joy_no], 8);
+    case JOY_BUTTON9:
+      return SDL_JoystickGetButton(joystick[joy_no], 9);
+    case JOY_BUTTON10:
+      return SDL_JoystickGetButton(joystick[joy_no], 10);
+    case JOY_BUTTON11:
+      return SDL_JoystickGetButton(joystick[joy_no], 11);
+    case JOY_BUTTON12:
+      return SDL_JoystickGetButton(joystick[joy_no], 12);
+    case JOY_BUTTON13:
+      return SDL_JoystickGetButton(joystick[joy_no], 13);
+    case JOY_BUTTON14:
+      return SDL_JoystickGetButton(joystick[joy_no], 14);
+    case JOY_BUTTON15:
+      return SDL_JoystickGetButton(joystick[joy_no], 15);
+  }
+  return 0;
+}
diff -bNru airstrike/src/core/joystick.h airstrike-joystick/src/core/joystick.h
--- airstrike/src/core/joystick.h	1970-01-01 01:00:00.000000000 +0100
+++ airstrike-joystick/src/core/joystick.h	2005-05-02 18:55:23.149936701 +0200
@@ -0,0 +1,42 @@
+/* threshold to distinguish between real joystick movement and noise */
+#define JOY_THRESHOLD 100
+
+/* prepare for up to 4 axes and 16 buttons per joystick */
+enum joystick_actuator {
+	JOY_AXIS0_POS,
+	JOY_AXIS0_NEG,
+	JOY_AXIS1_POS,
+	JOY_AXIS1_NEG,
+	JOY_AXIS2_POS,
+	JOY_AXIS2_NEG,
+	JOY_AXIS3_POS,
+	JOY_AXIS3_NEG,
+	JOY_BUTTON0,
+	JOY_BUTTON1,
+	JOY_BUTTON2,
+	JOY_BUTTON3,
+	JOY_BUTTON4,
+	JOY_BUTTON5,
+	JOY_BUTTON6,
+	JOY_BUTTON7,
+	JOY_BUTTON8,
+	JOY_BUTTON9,
+	JOY_BUTTON10,
+	JOY_BUTTON11,
+	JOY_BUTTON12,
+	JOY_BUTTON13,
+	JOY_BUTTON14,
+	JOY_BUTTON15
+};
+
+/* initialize joystick subsystem */
+void joystick_setup(void);
+
+/* assign a joystick to a player */
+int open_joystick(int joy_no);
+
+/* close joystick subsystem */
+void close_joysticks(void);
+
+/* query status of joystick */
+int joy_active(int joy_no, int actuator);
diff -bNru airstrike/src/engine/ai.c airstrike-joystick/src/engine/ai.c
--- airstrike/src/engine/ai.c	2005-04-17 17:11:37.000000000 +0200
+++ airstrike-joystick/src/engine/ai.c	2005-05-02 19:39:34.358446861 +0200
@@ -52,6 +52,14 @@
   int key_right;
   int key_fire;
   int key_drop;
+  /* Joystick */
+  int joy_no;		/* negative for no joystick */
+  int joy_accelerate;
+  int joy_break;
+  int joy_left;
+  int joy_right;
+  int joy_fire;
+  int joy_drop;
 };
 
 static enum msgret player_message(ai_t *ai, sprite_t *target, msg_t message)
@@ -60,19 +68,25 @@
   switch (message.type)
     {
     case MSG_UPDATE:
-      if (key_pressed(pai->key_accelerate))
+      if (key_pressed(pai->key_accelerate) ||
+		      joy_active(pai->joy_no, pai->joy_accelerate))
 	obj_message(target,msg_ctrl(MSG_ACCELERATE));
-      else if (key_pressed(pai->key_break))
+      else if (key_pressed(pai->key_break) ||
+		      joy_active(pai->joy_no, pai->joy_break))
 	obj_message(target,msg_ctrl(MSG_BREAK));
       
-      if (key_pressed(pai->key_right))
+      if (key_pressed(pai->key_right) ||
+		      joy_active(pai->joy_no, pai->joy_right))
 	obj_message(target,msg_ctrl(MSG_DOWN));
-      else if (key_pressed(pai->key_left))
+      else if (key_pressed(pai->key_left) ||
+		      joy_active(pai->joy_no, pai->joy_left))
 	obj_message(target,msg_ctrl(MSG_UP));
       
-      if (key_pressed(pai->key_fire))
+      if (key_pressed(pai->key_fire) ||
+		      joy_active(pai->joy_no, pai->joy_fire))
 	obj_message(target,msg_ctrl(MSG_FIRE));
-      else if (key_pressed(pai->key_drop))
+      else if (key_pressed(pai->key_drop) ||
+		      joy_active(pai->joy_no, pai->joy_drop))
 	obj_message(target,msg_ctrl(MSG_DROP));
 
       return MSG_RET_CONT;
@@ -95,6 +109,13 @@
       ai->key_right = SDLK_RIGHT;
       ai->key_fire = SDLK_RSHIFT;
       ai->key_drop = SDLK_RCTRL;
+      ai->joy_no = 0;
+      ai->joy_accelerate = JOY_AXIS1_NEG;
+      ai->joy_break = JOY_AXIS1_POS;
+      ai->joy_left = JOY_AXIS0_NEG;
+      ai->joy_right = JOY_AXIS0_POS;
+      ai->joy_fire = JOY_BUTTON0;
+      ai->joy_drop = JOY_BUTTON1;
     }
   else if (player_nr == 2)
     {
@@ -104,11 +125,19 @@
       ai->key_right = SDLK_c;
       ai->key_fire = SDLK_LALT;
       ai->key_drop = SDLK_TAB;      
+      ai->joy_no = 1;
+      ai->joy_accelerate = JOY_AXIS1_NEG;
+      ai->joy_break = JOY_AXIS1_POS;
+      ai->joy_left = JOY_AXIS0_NEG;
+      ai->joy_right = JOY_AXIS0_POS;
+      ai->joy_fire = JOY_BUTTON0;
+      ai->joy_drop = JOY_BUTTON1;
     }
   else
     {
       BUG("Invalid player nr");
     }
+  open_joystick(ai->joy_no);
   return (ai_t *)ai;
 }
 
diff -bNru airstrike/src/engine/engine.c airstrike-joystick/src/engine/engine.c
--- airstrike/src/engine/engine.c	2005-04-26 22:42:10.000000000 +0200
+++ airstrike-joystick/src/engine/engine.c	2005-05-02 19:12:28.666696581 +0200
@@ -70,6 +70,8 @@
 
   player_setup();
    
+  joystick_setup();
+   
   bonuses_setup();
    
   generators_setup();
@@ -127,6 +129,8 @@
 
   objdict_delete(generator_tags);
   objdict_delete(sprite_tags);
+
+  close_joysticks();
 }
 
 void draw_frame(void) /* Draw background, sprites and ui */


More information about the airstrike mailing list