Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 4.1
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