J'essaie de créer ping pong en C en utilisant ncurses, et j'ai maintenant un énorme revers parce que je n'arrive pas à comprendre comment je peux autoriser deux joueurs pour déplacer les pads simultanément. Ce que j'ai essayé est de créer un thread séparé qui utiliserait ensuite select pour détecter toutes les presses tamponnées, puis mettre cela dans un tableau contenant mes contrôles. Cependant, il ne lit que la première clé et ne reconnaît pas l'autre.comment reconnaître les entrées de plusieurs clés simultanément dans c (linux)
#include <stdlib.h>
#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <ncurses.h>
#include <pthread.h>
#include <errno.h>
#define DELAY 30000
#define P1_UP 0
#define P1_DOWN 1
#define P2_UP 2
#define P2_DOWN 3
struct player {
int x;
int y;
int score;
};
void *_thread_func(void *);
int main(int argc, char **argv) {
struct player p[2];
int x, y, max_y, max_x;
int *keys;
pthread_t _thread;
keys = calloc(4, sizeof(int));
if(pthread_create(&_thread, NULL, _thread_func, &keys) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
initscr();
noecho();
curs_set(FALSE);
getmaxyx(stdscr, max_y, max_x);
p[0].score = p[1].score = 0;
p[0].y = p[1].y = max_y/2-3; // length of pad is 6
p[0].x = 0; // width of pad is 1
p[1].x = max_x-1;
while(1) {
getmaxyx(stdscr, max_y, max_x);
clear();
mvprintw(p[0].y , p[0].x , "|");
mvprintw(p[0].y+1, p[0].x , "|");
mvprintw(p[0].y+2, p[0].x , "|");
mvprintw(p[0].y+3, p[0].x , "|");
mvprintw(p[0].y+4, p[0].x , "|");
mvprintw(p[0].y+5, p[0].x , "|");
mvprintw(p[1].y , p[1].x , "|");
mvprintw(p[1].y+1, p[1].x , "|");
mvprintw(p[1].y+2, p[1].x , "|");
mvprintw(p[1].y+3, p[1].x , "|");
mvprintw(p[1].y+4, p[1].x , "|");
mvprintw(p[1].y+5, p[1].x , "|");
refresh();
usleep(DELAY);
if(keys[P2_UP]) {
keys[P2_UP] = 0;
if(--p[1].y < 0) p[1].y++;
}
if(keys[P2_DOWN]) {
keys[P2_DOWN] = 0;
if(++p[1].y >= max_y-5) p[1].y--;
}
if(keys[P1_UP]) {
keys[P1_UP] = 0;
if(--p[0].y < 0) p[0].y++;
}
if(keys[P1_DOWN]) {
keys[P1_DOWN] = 0;
if(++p[0].y >= max_y-5) p[0].y--;
}
}
free(keys);
endwin();
}
void *_thread_func(void *arg) {
fd_set readfds;
int num_readable;
int num_bytes;
struct timeval tv;
int **keys;
char buf[1];
int fd_stdin;
keys = (int**) arg;
fd_stdin = fileno(stdin);
while(1) {
FD_ZERO(&readfds);
FD_SET(fileno(stdin), &readfds);
tv.tv_sec = 0;
tv.tv_usec = 0;
fflush(stdout);
num_readable = select(fd_stdin + 1, &readfds, NULL, NULL, &tv);
if (num_readable == -1) {
fprintf(stderr, "\nError in select : %s\n", strerror(errno));
exit(1);
}
if (num_readable > 0) {
num_bytes = read(fd_stdin, buf, 1);
if (num_bytes < 0) {
fprintf(stderr, "\nError on read : %s\n", strerror(errno));
exit(1);
}
switch(buf[0]) {
case 105: /* i -> ascii 105*/
(*keys)[P2_UP] = 1;
break;
case 107: /* k -> ascii 107*/
(*keys)[P2_DOWN] = 1;
break;
case 119: /* w -> ascii 119*/
(*keys)[P1_UP] = 1;
break;
case 115: /* s -> ascii 115*/
(*keys)[P1_DOWN] = 1;
break;
}
}
}
return NULL;
}
Comment est-ce que je peux reconnaître plus d'une touche en même temps? Tout exemple sur la façon dont cela peut être fait serait grandement appréciée :)
TL; DR! Veuillez essayer de créer un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) et nous montrer. Quoi qu'il en soit, il n'est pas supporté par la norme C, vous devez utiliser des fonctions spécifiques à la plate-forme pour lire l'état du clavier. –