View Full Version : c++ joystick che và ma non esco dal ciclo switch
Non riesco ad uscire dal ciclo col tasto ESC se attivo l'istruzione break (vedi sotto //break), mentre se la tologo con il commento //, il joystick non cammina più, però in compenso esco dal ciclo.
invece dovrei riuscire a muovere il joystick fluidamente e uscire dal ciclo premendo il tasto ESC.
scusate ma ho il cervello bruciato!!!!!!!!!!!...... vista l'ora vado a cuccia!!!!!!
-------------------------------
while ( !done )
{
if ( check_input(&event) )
{
switch ( event.type )
{
case JOY:
switch ( event.sub_type )
{
case J_MOVE:
printf("JOY MOVE x %d y %d\n",
event.x, event.y);
break;
case J_BUTTON0:
printf("Button 0 is %s\n",
event.data1 ? "UP" : "DOWN");
break;
case J_BUTTON1:
printf("Button 1 is %s\n",
event.data1 ? "UP" : "DOWN");
break;
}
//break; // se tolgo questo break il joystick si ferma
e il programma rimane in attesa del tasto ESC per uscire
dal ciclo
Se lascio il break il joystick ogni volta che lo tocco
mi segnala la nuova posizione, ma se spingo il tasto ESC
porca la miseria, non esce dal ciclo...........
case KEY:
if ( event.data1 == 1 ) // scancode for ESC is 1
done=1;
}
}
}
----------------------------
prova con :
#define ESC 0x1b
E a fare controlli su questo:D
Se in data1 c'è lo scacode allora va bene 1...
Originariamente inviato da cionci
Se in data1 c'è lo scacode allora va bene 1...
la mia soluzione nn è corretta?
Ciao cionci:D
Cionci aiutami per carità..................
si è proprio come dici tu..........
Dunque:
Tutto funziona ma non riesco ad uscire dal loop premendo il tasto ESC perchè nel listato viene inizializzata un nuovo handler per la tastiera usando un nuovo vettore di interrupt................. io invece dovrei intercettare il tasto nella routine degli eventi per la tastiera senza usare un nuovo andler, ma usando quello di default.
dunque questi sono i due listati e vediamo se riesci a venirne a capo..........................
i due listati sono:
il main principale si trova in ProgramLAST.cpp (questo è loscorcio del listato e dovrebbe bastarti....)
------------------ProgramLAST.cpp ----------------------------
void joy()
{
cout<<"\n\nadesso puoi muovere il Joystick....\n"<<endl;
int done=0;
event_t event;
read_joy_buttons();
last_b0=b0;
last_b1=b1;
read_joy();
last_joy_x=joy_x;
last_joy_y=joy_y;
while ( !done )
{
if ( check_input(&event) )
{
switch ( event.type )
{
case JOY:
switch ( event.sub_type )
{
case J_MOVE:
printf("JOY MOVE x %d y %d\n",
event.x, event.y);
break;
case J_BUTTON0:
printf("Button 0 is %s\n",
event.data1 ? "UP" : "DOWN");
break;
case J_BUTTON1:
printf("Button 1 is %s\n",
event.data1 ? "UP" : "DOWN");
break;
}
break;
case KEY:
// printf("KEY %s = 0x%0x %d\n",
// event.sub_type == KEY_UP ? "UP" : "DOWN",
// event.data1, event.data1);
if ( event.data1 == 1 ) // scancod for ESC is 1
//if ( event.data1 == 0x1b) ...... ma niente............
done=1;
break;
}
}
}
}
---------------- JoyLAST.h --------------------------------------
//Inizializzazioni variabili
#define KEY 27 //KBD
enum input_types
{
KEY,
JOY
};
enum sub_input_types
{
J_MOVE,
J_BUTTON0,
J_BUTTON1,
KEY_UP,
KEY_DOWN
};
typedef struct
{
int type, sub_type, x, y;
int data1, data2;
}
event_t;
typedef unsigned char BYTE;
short joy_x, joy_y, last_joy_x, last_joy_y;
BYTE b0, b1, last_b0, last_b1;
// keyboard
#define BYTE unsigned char
#define NUM_SCAN_QUE 256 // this MUST be 256, using BYTE roll-over for
// q code
#define KEY_UP_MASK 128
#define KEY_ALL_MASK 127
static void interrupt (far *oldkb)(void); /* BIOS keyboard handler */
// Q code
BYTE gb_scan;
BYTE gb_scan_q[NUM_SCAN_QUE];
BYTE gb_scan_head;
BYTE gb_scan_tail;
// PC bios data area pointer to incrementing unsigned long int
#define TICKS (*(volatile unsigned long far *)(0x0040006CL))
#define MAX_INPUT 30
event_t in[MAX_INPUT];
int i_head=0;
int i_tail=0;
int check_input(event_t *event)
{
// place any pending keyboard events in queue
// in a real game you might want to do some processing to
// the raw scan codes to convert them them to ASCI or other
// more convient format
while ( gb_scan_head != gb_scan_tail )
{
new_event.type=KEY;
new_event.data1=gb_scan_q[gb_scan_head];
// 0xe0 indicates a key from the SECOND keypad, real code will
// follow
if ( new_event.data1 == 0xe0 )
{
gb_scan_head++;
continue;
}
gb_scan_head++;
if ( new_event.data1 & KEY_UP_MASK )
new_event.sub_type=KEY_UP;
else
new_event.sub_type=KEY_DOWN;
new_event.data1&=KEY_ALL_MASK; // clear high bit
// this is where you would convert the raw scan code to ascii
// and do other high level processing if required
// eg new_event.data2=get_ascii(new_event.data1);
add_input(&new_event);
}
if ( i_head != i_tail )
{
is_event=1;
event->type=in[i_head].type;
event->sub_type=in[i_head].sub_type;
event->x=in[i_head].x;
event->y=in[i_head].y;
event->data1=in[i_head].data1;
event->data2=in[i_head].data2;
i_head++;
if ( i_head == MAX_INPUT )
i_head=0;
}
return is_event;
}
-------------- fine-----------------
ho omesso atre routine perchè sono le classiche inizilizazzione della keyboard, la letture far dell'int per il nuovo handler di tasyiera e la routine del ripristino del vecchio vector della tastiera.
In definitiva, da quello che vedi dovrei intercettare l'evento del tasto ESC senza inizializzare un nuovo vector table interrupt
come fare????
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.