Arbeiten mit dem Kontroller (libronin)

Aus SEGA-DC.DE
Version vom 2. Januar 2011, 20:48 Uhr von Zilti (Diskussion | Beiträge) (Die Seite wurde neu angelegt: libronin hat einen Nachteil, den KOS nicht hat: Makros für die Richtungen, Knöpfe u.s.w. auf dem Controller. Abgesehen davon ist die libronin-Implementation sehr stab...)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

libronin hat einen Nachteil, den KOS nicht hat: Makros für die Richtungen, Knöpfe u.s.w. auf dem Controller. Abgesehen davon ist die libronin-Implementation sehr stabil und funktioniert problemlos. Hier sind die Definitionen der Knöpfe:

/* Buttons bitfield defines */
#define CONT_C 			(1 << 0)
#define CONT_B 			(1 << 1)
#define CONT_A 			(1 << 2)
#define CONT_START     		(1 << 3)
#define CONT_DPAD_UP   		(1 << 4)
#define CONT_DPAD_DOWN 		(1 << 5)
#define CONT_DPAD_LEFT 		(1 << 6)
#define CONT_DPAD_RIGHT		(1 << 7)
#define CONT_Z	        		(1 << 8)
#define CONT_Y	        		(1 << 9)
#define CONT_X	        		(1 << 10)
#define CONT_D   			(1 << 11)
#define CONT_DPAD2_UP	        	(1 << 12)
#define CONT_DPAD2_DOWN		(1 << 13)
#define CONT_DPAD2_LEFT		(1 << 14)
#define CONT_DPAD2_RIGHT       	(1 << 15)


Ohne diese Definitionen muss man kryptischen Code wie "if(buttons & 4) do something" verwenden. Mit diesen Definitionen dagegen kann man es als "if(buttons & CONT_A) do something" schreiben.

Hier ist ein Beispiel, wie man mit obigen Definitionen Controllereingaben lesen kann:

/* This is the default entry point for your program */
int main(int argc, char **argv)
{
	int mask, i;
	struct mapledev *pads;

	serial_init(57600);
	usleep(200000);

	maple_init();

	for(;;)
	{
		mask = getimask();
		setimask(15);
		pads = get_locked_pads();
		for(i = 0; i < 4; i++)
		{
			if(pads[i]->func & MAPLE_FUNC_CONTROLLER)
			{
				int buttons = pads[i]->cond.controller.buttons;
				reportf(``Controller %u state:\r\n, i);
				reportf(``UP: %u DOWN: %u LEFT: %u RIGHT: %u\r\n,
					buttons & CONT_DPAD_UP,
					buttons & CONT_DPAD_DOWN,
					buttons & CONT_DPAD_LEFT,
					buttons & CONT_DPAD_RIGHT);
				reportf(``UP2: %u DOWN2: %u LEFT2: %u RIGHT2: %u\r\n,
					buttons & CONT_DPAD2_UP,
					buttons & CONT_DPAD2_DOWN,
					buttons & CONT_DPAD2_LEFT,
					buttons & CONT_DPAD2_RIGHT);
				reportf(``A: %u B: %u X: %u Y: %u\r\n,
					buttons & CONT_A,
					buttons & CONT_B,
					buttons & CONT_X,
					buttons & CONT_Y);
			}
		}
		setimask(mask);
	}
}

Das obige Beispiel ist ein sehr simples Beispiel, um zu zeigen, wie man den Zustand des Controllers ausliest. Die Verwendung von "setimask" und "getimask" wird benötigt, um sicherzustellen, dass die Codeausführung nicht unterbrochen wird, solange die Pad Struct geblockt ist.