2017-03-06 2 views
0

Je suis en train d'écrire du code pour un jeu roguelike, et cette partie du code utilise getch() pour prendre une entrée utilisateur pour diriger le personnage vers l'emplacement suivant. Je crois comprendre que getch() mettra le programme en pause jusqu'à ce qu'il reçoive une entrée de l'utilisateur, mais mon code ne s'arrête pas lorsqu'il atteint la ligne. Voici le codeLe programme ne s'arrêtera pas à getch()

uint32_t pc_next_pos(dungeon *d) 
    { 
    char comm; 
    comm = getch(); 
    command_move(d, comm); 
    } 

L'ensemble du programme correctement compile, il est juste qu'au lieu de s'arrêter le programme pour me laisser passer mon personnage, il continue d'aller jusqu'à ce que le programme se termine une fois que tous les monstres dans la matrice du jeu. Ce code n'est pas inclus car il ne joue aucun rôle dans cette méthode. Est-ce que je fais quelque chose de mal dans cette méthode qui ne permet pas à getch() de mettre en pause le programme, ou est-ce que je ne comprends pas ce que fait getch()?

+1

Vous avez 2 instances de getch(). De quelle instance parlez-vous? –

+0

Mes excuses, j'ai ajusté le code. Le deuxième getch() était censé être comm – Zebs

+0

S'il vous plaît vérifier la réponse et les commentaires ici: http://stackoverflow.com/questions/12060572/getch-does-not-pause-the-loop – scorpGoku

Répondre

1

getch() peut bloquer ou non le blocage (ou le blocage même avec un délai d'attente), en fonction des options d'entrée. Vous voulez bloquer; vous obtenez non-bloquant. Le problème n'est pas ici, dans cette fonction, mais quelque part dans votre code d'initialisation curses (non montré) - vous appelez probablement quelque chose comme nodelay(stdscr, TRUE), ou timeout() précédemment mentionné, peu après initscr(). Sinon, vous devrez peut-être ajouter quelque chose comme nodelay(stdscr, FALSE), même si cela devrait être le comportement par défaut.

Vous devriez également lire sur halfdelay() et cbreak() (normalement sur la même page man que nodelay() et timeout()).

+0

Je me sens idiot. Le problème est venu parce que j'ai effectivement commenté initscr() pour une raison quelconque. Grâce à votre réponse, j'ai regardé en arrière et j'ai vu que c'était le problème. Maintenant, tout fonctionne très bien. Je vous remercie! – Zebs

0

Vous pouvez modifier le comportement de la fonction getch appelant timeout:

pour l'homme 3 délai d'attente:

Le délai d'attente et wtimeout ensemble de routines blocage ou non-bloquante pour une fenêtre donnée. Si le délai est négatif, la lecture bloquée est utilisée (c'est-à-dire, attend indéfiniment la saisie). Si le retard est égal à zéro, la lecture non bloquante est utilisée (c'est-à-dire que la lecture renvoie ERR si aucune entrée n'est en attente). Si le délai est positif, lisez les blocs pour des millisecondes de retard et renvoie ERR s'il n'y a toujours pas d'entrée. Par conséquent, ces routines fournissent la même fonctionnalité que nodelay, plus la possibilité supplémentaire de pouvoir bloquer pendant seulement quelques millisecondes (où le délai est positif).

uint32_t pc_next_pos(dungeon *d) 
    { 
    char comm; 
    /* set getch blocking */ 
    timeout(-1); 
    comm = getch(); 
    command_move(d, comm); 
    return .... 
    } 
+0

Cela va également compiler (comme OP fait), mais ne répond pas à la question. –