Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 4.1

index << >>



4.2 Utilizando o Joystick

1.1 Visão geral


No desenho acima você vê as diversas funções que fazem a leitura específica
dos botões do joystick. De maneira geral essas funções retornam o valor 1
quando o botão focado está pressionado ou zero na situação contrária.

O grupo de funções abaixo verifica o direcional do controle:
nsts = dbJoystickUp()		- verifica o pressionamento para cima
nsts = dbJoystickDown()		- verifica o pressionamento para baixo
nsts = dbJoystickLeft()		- verifica o pressionamento para a esquerda 
nsts = dbJoystickRight()	- verifica o pressionamento para a direita

O grupo de funções abaixo verifica os quatro botões principais:
nsts = dbJoystickFireA()	- verifica o pressionamento do botão A
nsts = dbJoystickFireB()	- verifica o pressionamento do botão B
nsts = dbJoystickFireC()	- verifica o pressionamento do botão C
nsts = dbJoystickFireD()	- verifica o pressionamento do botão D

Para verificar outros botões a partir do quinto use a função abaixo:
nsts = dbJoystickFireX(nBtn)	- verifica o pressionamento do botão nBtn

Exemplo geral: 

if ( dbJoystickFireX(10) == 1) doSomething(); 


1.2 Utilizando o controle analógico As seguintes funções fazem a leitura do direcional analógico: nnval = dbJoystickX() - Verifica a pressão no eixo x nnval = dbJoystickY() - Verifica a pressão no eixo y nnval = dbJoystickZ() - verifica a pressão no eixo z. A leitura analógica retorna valores entre -1000 e 1000 correspondentes a pressão feita no direcional. Em dbJoystickX() e dbJoystickZ() -1000 representa a extrema esquerda, 1000 representa a extrema direita. Em dbJoystickY() -1000 representa o extremo para cima, 1000 representa o extremo para baixo. Estes valores foram obtidos naturalmente como o modo analógico do joystick ligado. Quando o modo analógico está desligado essas funções apresentam os seguintes valores sem a variação da pressão: -1000 ===============================> dbJoystickY() || - 1000 -0008 +1000 =========================> dbJoystickY() || +1000
No modo analógico desligado, o direcional do eixo Z replica o funcionamento dos botões A, B, C, D.

1.3 Programa exemplo Veja nosso programa exemplo:
// Joystick01.cpp // Esse programa ilustra o tratamento do Joystick #include "DarkGDK.h" void initsys(); // Inicializa o sistema void getJoyStatus(void); // Pega status do JoyStick void showJoyStatus(void); // Mostra status do JoyStick void tst_joystick(void); // Testa Joystick // Cores #define nPreto 0 #define nAzul 0x0000FF #define nBranco 0xFFFFFF // Lista para guardar dados do Joystick int joySts[20]; // Nomes para clarificar as posições da lista #define joy_up 0 #define joy_down 1 #define joy_left 2 #define joy_right 3 #define joy_btn_a 4 #define joy_btn_b 5 #define joy_btn_c 6 #define joy_btn_d 7 #define joy_analog_x 8 #define joy_analog_y 9 #define joy_analog_z 10 #define joy_btn_04 11 #define joy_btn_05 12 #define joy_btn_06 13 #define joy_btn_07 14 #define joy_btn_08 15 #define joy_btn_09 16 #define joy_btn_10 17 #define joy_btn_11 18 void DarkGDK ( void ) { // Começo da aplicação DarkGdk initsys(); while ( LoopGDK ( ) ) { tst_joystick(); dbSync ( ); } // fim do while return; } // fim da função: DarkGDK // Esta função inicializa o sistema void initsys() { dbSyncOn( ); dbSyncRate (60); // Estabelecendo a configuração de vídeo dbSetWindowOn();dbSetDisplayMode(640,480,32); dbCLS(nBranco); dbInk(nPreto, nBranco); dbSetTextOpaque(); // Configurando a janela dbSetWindowTitle("joystick01.cpp"); dbSetWindowSize (640,480); dbSetWindowPosition (320,20); } // fim da função: initsys() //---------- Esta função obtém o status dos recursos do Joystick void getJoyStatus(void) { // Direcional joySts[joy_up] = dbJoystickUp(); joySts[joy_down] = dbJoystickDown(); joySts[joy_left] = dbJoystickLeft(); joySts[joy_right] = dbJoystickRight(); // Botões principais joySts[joy_btn_a] = dbJoystickFireA(); joySts[joy_btn_b] = dbJoystickFireB(); joySts[joy_btn_c] = dbJoystickFireC(); joySts[joy_btn_d] = dbJoystickFireD(); // Direcional analógico joySts[joy_analog_x] = dbJoystickX(); joySts[joy_analog_y] = dbJoystickY(); joySts[joy_analog_z] = dbJoystickZ(); // Outros botões joySts[joy_btn_04] = dbJoystickFireX(4); joySts[joy_btn_05] = dbJoystickFireX(5); joySts[joy_btn_06] = dbJoystickFireX(6); joySts[joy_btn_07] = dbJoystickFireX(7); joySts[joy_btn_08] = dbJoystickFireX(8); joySts[joy_btn_09] = dbJoystickFireX(9); joySts[joy_btn_10] = dbJoystickFireX(10); joySts[joy_btn_11] = dbJoystickFireX(11); }// endfunction //---------- Esta função exibe o status dos recursos do Joystick void showJoyStatus(void) { char *joyMsg[] = {"dbJoystickUp", "dbJoystickDown", "dbJoystickLeft", "dbJoystickRight", "dbJoystickFireA","dbJoystickFireB","dbJoystickFireC", "dbJoystickFireD", "dbJoystickX", "dbJoystickY", "dbJoystickZ", "joy_btn_04","joy_btn_05","joy_btn_06","joy_btn_07","joy_btn_08", "joy_btn_09","joy_btn_10","joy_btn_11"}; int npalavras = 18; char texto[255]; int nlinha = 20; int ncoluna = 10; int entrelinha = 20; int ncx = 0; // Mostra na tela os status obtidos for (ncx=0; ncx < npalavras; ncx++) { if (ncx == 0) dbInk(nPreto, nBranco); sprintf(texto, "%s: %d", joyMsg[ncx], joySts[ncx]); dbText (ncoluna, nlinha, dbSpaces(20)); // Imprime o texto e avança a linha dbText (ncoluna, nlinha, texto); nlinha = ((ncx+1) * entrelinha) + entrelinha; // Colore o texto pra facilitar a leitura if (ncx == 3) dbInk(nAzul, nBranco); if (ncx == 7) dbInk(nPreto, nBranco); if (ncx == 10) dbInk(nAzul, nBranco); } // endfor } // endfunction // Esta função testa o Joystick void tst_joystick(void) { getJoyStatus(); showJoyStatus(); } // endfunction

index << >>


Produzido por Gameprog: Jair Pereira - Setembro/2013 © gameprog.br@gmail.com http://www.gameprog.com.br http://www.nucleoararat.com.br