2010-06-18 5 views
1

une autre question rapide, je veux faire un jeu de console simple, rien de trop chic, juste pour avoir un projet de week-end pour se familiariser avec C. Fondamentalement, je veux faire tetris, mais je se retrouver avec un problème:Contrôle en temps réel de Windows Console jeu

Comment laisser le moteur de jeu aller, et dans le même temps attendre l'entrée? Evidemment cin ou scanf est inutile pour moi.

Répondre

1

Il y a deux façons de le faire:

La première consiste à exécuter deux threads; on attend l'entrée et l'état des mises à jour en conséquence pendant que l'autre exécute le jeu. L'autre (plus commun dans le développement de jeu) consiste à écrire le jeu comme une grande boucle qui s'exécute plusieurs fois par seconde, mettant à jour l'état du jeu, redessinant l'écran et vérifiant l'entrée. Mais au lieu de bloquer lorsque vous recevez une entrée de touche, vous vérifiez la présence de touches en attente, et si rien ne s'est passé, vous continuez simplement votre boucle. Si vous avez plusieurs sources d'entrée (clavier, réseau, etc.), elles sont toutes mises en boucle, les unes après les autres.

Oui, c'est ce qu'on appelle l'interrogation. Non, ce n'est pas efficace. Mais les jeux haut de gamme visent généralement à tirer le meilleur parti des performances et des framats de l'ordinateur, sans pour autant être cool. Pour plus d'efficacité, vous pouvez éventuellement bloquer avec un délai d'attente - en disant "attendre une pression sur une touche, mais pas plus de 300 millisecondes" afin de pouvoir continuer avec votre boucle. Cela me vient à l'esprit, mais il y a aussi d'autres façons d'attendre ou de vérifier les entrées.

+0

Quelle approche est la plus efficace? Filetage ou grosse boucle? Ma conjecture serait threading, puisque de tous les processus d'exécution en arrière-plan, vous obtenez plus de temps CPU lorsque le multitâche a lieu, mais c'est juste ma conjecture. –

+0

En fin de compte, l'une ou l'autre des méthodes de programmation peut aboutir exactement au même résultat, mais le threading est probablement plus facile à programmer pour la plupart des gens, donc il sera probablement plus efficace. La méthode de la "grosse boucle" est plus courante dans les jeux haut de gamme parce que le programmeur veut un contrôle absolu sur le flux du programme, et les threads peuvent conduire à une certaine quantité d'imprévisibilité. – tylerl

2

Vous recherchez une librairie telle que ncurses.

Beaucoup de jeux Rogue-like sont écrits en utilisant ncurses ou similaire.

0

Vous pourriez trouver comment changer stdin en non-bloquant, ce qui vous permettrait d'écrire quelque chose comme tetris, mais le jeu pourrait être plus directement exprimé dans un paradigme axé sur les événements. Peut-être que c'est une bonne excuse pour apprendre la programmation Windows.

Quoi qu'il en soit, si vous voulez aller la route de la console, si vous utilisez le compilateur Microsoft, alors vous devriez avoir kbhit() disponible (via conio.h) qui peut vous dire si un appel à fgetc sur stdin bloquerait.

En fait, il convient de mentionner que le compilateur gCc MinGW 3.4.5 prend également en charge kbhit().