[#1] Obsługa klawiatury w grze - C
Czy ktoś mógłby zapodać przykładowy kod w C (lub link do takowego) w jaki sposób na Amidze obsługiwać klawiaturę w grze? Chodzi mi o takie zachowanie, że gra działa w pętli:
1. sprawdza jakie klawisze są wciśnięte
2. wykonuje logikę gry
3. odrysowuje ekran
4. powrót do 1
I w punkcie 1 nie czeka na wciśnięcie przycisku. Jeśli żaden klawisz nie został wciśnięty idzie do punktu 2. I dodatkowo jeśli jest wciśniętych jednocześnie kilka klawiszy to też muszę to obsłużyć.

Z góry dziękuję.
[#2] Re: Obsługa klawiatury w grze - C

@sando, post #1

Rozwiazanie tego problemu jest bardzo proste. Przeanalizuj moj kod gry "2048"

http://blabla.ppa.pl/ftp/usr/Phibrizzo/2048/2048_08.c

To co potrzebujesz znajduje sie miedzy komentarzem "petla glowna".

Aby nie czekal wystarczy usunac funkcje WaitPort()

Ostatnia aktualizacja: 23.01.2015 19:36:51 przez Phibrizzo
[#3] Re: Obsługa klawiatury w grze - C

@sando, post #1

Rozwiązaliśmy to z Proxym za pomocą intuition i odrobiny naszej własnej warstwy abstrakcji.

Pobieranie stanów klawiszy do tablicy:

void inputProcess() {
	ULONG ulWindowSignal;
	ULONG ulSignals;
	struct IntuiMessage *pMsg;

	ulWindowSignal = 1L << g_sWindowManager.pWindow->UserPort->mp_SigBit;
	ulSignals = SetSignal(0L, 0L);

	if (ulSignals & ulWindowSignal) {
		while (pMsg = (struct IntuiMessage *) GetMsg(g_sWindowManager.pWindow->UserPort)) {
			ReplyMsg((struct Message *) pMsg);

			switch (pMsg->Class) {
				case IDCMP_RAWKEY:
					if (pMsg->Code & IECODE_UP_PREFIX) {
						pMsg->Code -= IECODE_UP_PREFIX;
						
						keySetState(pMsg->Code, KEY_NACTIVE);
					}
					else if (!keyCheck(pMsg->Code)) {
						keySetState(pMsg->Code, KEY_ACTIVE);
					}
					break;
			}
		}
	}
}


gdzie keySetState zmienia stan wciśniętego klawisza w tablicy stanów klawiszy:

void keySetState(UBYTE ubKeyCode, UBYTE ubKeyState) {
	g_sKeyManager.pStates[ubKeyCode] = ubKeyState;
}


Menedżer klawiatury póki co zawiera tylko tablicę stanów klawiszy (pStates):

typedef struct {
	UBYTE pStates[103];
} tKeyManager;

extern tKeyManager g_sKeyManager;


Za obsługę klawiszy w grze odpowiadają dwie funkcje:

UBYTE keyCheck(UBYTE ubKeyCode) {
	return g_sKeyManager.pStates[ubKeyCode] != KEY_NACTIVE;
}

UBYTE keyUse(UBYTE ubKeyCode) {
	if (g_sKeyManager.pStates[ubKeyCode] == KEY_ACTIVE) {
		g_sKeyManager.pStates[ubKeyCode] = KEY_USED;
		return 1;
	}
	return 0;
}


Gdzie keyCheck po prostu zwraca stan klawisza, a keyUse zwraca stan i jeśli klawisz był wciśnięty, to oznacza go jako użyty. Dzięki temu można zrobić poruszanie się po menu wymagające kolejnych wciśnięć klawisza, a nie przytrzymania.

Stany klawiszy zapisywane w tablicy:
#define KEY_NACTIVE 0
#define KEY_USED 1
#define KEY_ACTIVE 2


Makra z przyjaznymi nazwami klawiszy:

#define KEY_ESCAPE 0x45
#define KEY_F1 0x50
#define KEY_F2 0x51
#define KEY_F3 0x52
#define KEY_F4 0x53
#define KEY_F5 0x54
#define KEY_F6 0x55
#define KEY_F7 0x56
#define KEY_F8 0x57
#define KEY_F9 0x58
#define KEY_F10 0x59
#define KEY_TILDE 0x00
#define KEY_1 0x01
#define KEY_2 0x02
#define KEY_3 0x03
#define KEY_4 0x04
#define KEY_5 0x05
#define KEY_6 0x06
#define KEY_7 0x07
#define KEY_8 0x08
#define KEY_9 0x09
#define KEY_0 0x0A
#define KEY_MINUS 0x0B
#define KEY_EQUALS 0x0C
#define KEY_BACKSLASH 0x0D
#define KEY_TAB 0x42
#define KEY_Q 0x10
#define KEY_W 0x11
#define KEY_E 0x12
#define KEY_R 0x13
#define KEY_T 0x14
#define KEY_Y 0x15
#define KEY_U 0x16
#define KEY_I 0x17
#define KEY_O 0x18
#define KEY_P 0x19
#define KEY_LBRACKET 0x1A
#define KEY_RBRACKET 0x1B
#define KEY_RETURN 0x44
#define KEY_CONTROL 0x63
#define KEY_CAPSLOCK 0x62
#define KEY_A 0x20
#define KEY_S 0x21
#define KEY_D 0x22
#define KEY_F 0x23
#define KEY_G 0x24
#define KEY_H 0x25
#define KEY_J 0x26
#define KEY_K 0x27
#define KEY_L 0x28
#define KEY_SEMICOLON 0x29
#define KEY_APOSTROPHE 0x2A
#define KEY_REGIONAL1 0x2B
#define KEY_LSHIFT 0x60
#define KEY_REGIONAL2 0x30
#define KEY_Z 0x31
#define KEY_X 0x32
#define KEY_C 0x33
#define KEY_V 0x34
#define KEY_B 0x35
#define KEY_N 0x36
#define KEY_M 0x37
#define KEY_COMMA 0x38
#define KEY_PERIOD 0x39
#define KEY_SLASH 0x3A
#define KEY_RSHIFT 0x61
#define KEY_LALT 0x64
#define KEY_LAMIGA 0x66
#define KEY_SPACE 0x40
#define KEY_RAMIGA 0x67
#define KEY_RALT 0x64
#define KEY_DEL 0x46
#define KEY_HELP 0x5F
#define KEY_UP 0x4C
#define KEY_LEFT 0x4F
#define KEY_DOWN 0x4D
#define KEY_RIGHT 0x4E
#define KEY_NUMLPARENTHESES 0x5A
#define KEY_NUMRPARENTHESES 0x5B
#define KEY_NUMSLASH 0x5C
#define KEY_NUMMULTIPLY 0x5D
#define KEY_NUM7 0x3D
#define KEY_NUM8 0x3E
#define KEY_NUM9 0x3F
#define KEY_NUMMINUS 0x4A
#define KEY_NUM4 0x2D
#define KEY_NUM5 0x2E
#define KEY_NUM6 0x2F
#define KEY_NUMPLUS 0x5E
#define KEY_NUM1 0x1D
#define KEY_NUM2 0x1E
#define KEY_NUM3 0x1F
#define KEY_NUMENTER 0x43
#define KEY_NUM0 0x0F
#define KEY_NUMPERIOD 0x3C


Za nieczytelny kod nie ponoszę odpowiedzialności, skrypt forum ma w nosie wcięcia w kodzie.
[#4] Re: Obsługa klawiatury w grze - C

@teh_KaiN, post #3

Phibrizzo, teh_KaiN - dziękuję i pozdrawiam
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem