Oui, si tu relis ma première réponse, tu verras que je parle aussi de rediriger les sorties standard (qui par défaut vont vers un fichier si tu utilises SDL)
Oui, si tu relis ma première réponse, tu verras que je parle aussi de rediriger les sorties standard (qui par défaut vont vers un fichier si tu utilises SDL)
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Mais comment on fait pour rediriger les sorties vers la console ?
En fait il y a plus simple :
http://www.libsdl.org/faq.php?action...&category=4#85
En gros, soit tu recompiles la SDL pour qu'elle ne fasse pas la redirection (c'est pas forcément le plus pratique...), soit tu définis la macro NO_STDIO_REDIRECT dans les options de ton projet.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Moi je n'arrivais pas a rediriger les sorties vers la console par défaut de la SDL, c'est pour cette raison que dans ma fonction j'en crée une nouvelle.
Une image pour illustrer : cliquez ici.
Du code a me preter stp ?Moi je n'arrivais pas a rediriger les sorties vers la console par défaut de la SDL, c'est pour cette raison que dans ma fonction j'en crée une nouvelle.
Sinon j'avais pensé a créer un autre projet, qui ouvre une console et lit tout ce qui se trouve dans un fichier ( n'importe lequel, un .txt par exemple ... ), tandis que mon jeu écrira dans ce meme fichier ce qu'il se passe ( appels de fonction, chargement de fichiers ... ).
J'ai tout de meme remarqué que mon idée était irréalisable: si a chaque chargement d'image je demande au prog d'écrire dans le fichier, cela prendra quasiment 1/10eme de seconde le temps d'écrire puis de charger ( multipliez cela par le nombre d'images, soit environ une centaine actuellement pour mon jeu, et vous obtiendrez de la lenteur en barres ).
Je comptait ensuite binder les deux projets et voila...
Le code est à la page 1, mon application est configuré en GUI, donc sans console de base. Le code sert à créé la console et y rediriger les stdout ou stderr au choix.
Il faut inclure les librairies <windows.h> et <fcntl.h> car la console est spécifique à windows, sous linux ça s'affiche dans le shell donc il n'y a pas ce problème (j'ai jamais essayé sous linux, p'têt que je me trompte).
Je remet la source :
Bien sûr, comme la console écrit tous les printf à la suite, il ne vaut mieux pas s'en servir pour marquer les FPS ou la position de tel ou tel personnage, mais plutôt pour contrôler s'il n'y a pas de problème dans les chargements d'image, dans l'initialisation des paramètres.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void ActivateConsole() { AllocConsole(); HANDLE newConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); int outFd = _open_osfhandle((long)newConsoleOutput, _O_TEXT); FILE* consoleOut = _fdopen(outFd, "w"); setvbuf(consoleOut, NULL, _IONBF, 0); *stdout = *consoleOut; }
Enjoy !
Et NO_STDIO_REDIRECT (qui est quand même vachement plus simple...) ça ne marche pas ?
'\r' permet de revenir au début de la ligneBien sûr, comme la console écrit tous les printf à la suite, il ne vaut mieux pas s'en servir pour marquer les FPS ou la position de tel ou tel personnage
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Ca y est ! J'ai testé NO_STDIO_REDIRECT, (un peu galéré mais bon).
Je résume ma méthode, dites moi si elle va bien, elle marche mais est un peu lourde :
- Supprimer la liaison -lSDLmain de son projet.
- Rajouter le fichier SDL_win32_main.c dans son projet.
- Le modifier et rajouter #define NO_STIO_REDIRECT ou mieux, rajouter -DNO_STDIO_REDIRECT dans les options de compilation pour SDL_win32_main.c.
On trouve SDL_win32_main.c là SDL-1.2.11 Source Code dans le sous-répertoire \src\main\win32\
Edit : Avec cette méthode les fichiers ne sont plus créés donc on ne peux pas récupérer stderr.txt, ce qui peut être handicapant . C'est pour ca que je vais garder ma méthode précédente. Il faudrait retoucher SDL_win32_main.c pour définir que seul stdout soit redirigé vers la console .
Moi je me sert de "\n" ça doit être équivalent, mais je voulais dire par :Laurent Gomila a écrit :
'\r' permet de revenir au début de la ligne.
que si on compte faire un compteur de FPS ou n'importe quoi d'autre qui serait affiché chaque image c'est pas le bon choix (à >30 images par secondes, on a pas trop le temps de lire quoi que ce soit avec le défilement).comme la console écrit tous les printf à la suite
Non pas du tout, le \n met le pointeur à la ligne en dessous, en revanche \r met le pointeur au tout début de la ligne courante et donc tout ce qui va être écrit va effacer la ligne qui à été écrite juste avant.Envoyé par Polyfructol
Ahhh très très interessant alors ! Ça m'apprendra de pas tester
Sinon vivement que tout cela soit dans la FAQ , je pourrais faire un petit récapitulatif si il faut, mais d'abord j'aimerais savoir si les manipulations que j'effectue dans mon post précédents sont convenables.
Bonne soirée.
C'est en effet la meilleure solution que je vois mais elle ne me plaît pas énormément parce qu'à ce moment là, le code ne serait plus portable.Envoyé par Polyfructol
Peut-être en ajoutant un #ifdef dans le code windows, suffirait...
Jc
Il y a également moyen de rediriger stdout et stderr vers la console après l'initialisation de SDL :
http://www.libsdl.org/cgi/docwiki.cgi/FAQ_20Console
(Windows only, toujours)
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Donc il suffit que j'appelle cette fonction pour pouvoir utiliser les printf("") ?void ActivateConsole()
{
AllocConsole();
HANDLE newConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
int outFd = _open_osfhandle((long)newConsoleOutput, _O_TEXT);
FILE* consoleOut = _fdopen(outFd, "w");
setvbuf(consoleOut, NULL, _IONBF, 0);
*stdout = *consoleOut;
}
Je ne connais pas les mots clé que tu utilises ( genre HANDLE ) mais apparemment tu créés une console et la relie directement a stdout ... ??
J'ais jeté un oeil, mais je n'ais pas fait les tests ...Il y a également moyen de rediriger stdout et stderr vers la console après l'initialisation de SDL :
http://www.libsdl.org/cgi/docwiki.cgi/FAQ_20Console
(Windows only, toujours)
Désolé mais je n'ais pas assez d'experience pour manipuler les fichiers sources comme cela ( en plus je préfèrerais utiliser une fonction dynamique comme la tienne ) ...Je résume ma méthode, dites moi si elle va bien, elle marche mais est un peu lourde :
- Supprimer la liaison -lSDLmain de son projet.
- Rajouter le fichier SDL_win32_main.c dans son projet.
- Le modifier et rajouter #define NO_STIO_REDIRECT ou mieux, rajouter -DNO_STDIO_REDIRECT dans les options de compilation pour SDL_win32_main.c.
On trouve SDL_win32_main.c là SDL-1.2.11 Source Code dans le sous-répertoire \src\main\win32\
Edit : Avec cette méthode les fichiers ne sont plus créés donc on ne peux pas récupérer stderr.txt, ce qui peut être handicapant . C'est pour ca que je vais garder ma méthode précédente. Il faudrait retoucher SDL_win32_main.c pour définir que seul stdout soit redirigé vers la console .
Il suffit de seulement rajouter la librairie windows.h.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void ActivateConsole() { AllocConsole(); // Redirection des flux I/O standards freopen("conout$", "w", stdout); freopen("conin$", "r", stdin); freopen("conout$", "w", stderr); }
J'envois la source pour ceux qui veulent voir le résultat. lien
Euh désolé de te contredire, mais l'écriture dans un fichier ne prendsrien comme temps. Déjà, en utilisant cout et cerr, SDL ecrit dans le fichier, il te reste simplement à le lire. Ensuite, je charge pas moins de 150 sprites au lancmeent de mon programme. Voilà ce que j'écris pour les 6 premiers :Envoyé par ironzorgBen ca démarre directement, sans ralentissement. En imaginant qu'une écriture prenne 1/10 de seconde, ca prendrait un long moment. Plutôt que d'affirmer des tas de choses, essaye avant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 Picture loaded successfully from images/fish.bmp frame number 0 get x=0 and y=0 with an height=54 and a width=21 loaded. frame number 1 get x=21 and y=0 with an height=54 and a width=21 loaded. frame number 2 get x=42 and y=0 with an height=54 and a width=21 loaded. frame number 3 get x=63 and y=0 with an height=54 and a width=21 loaded. frame number 4 get x=84 and y=0 with an height=54 and a width=21 loaded. frame number 5 get x=105 and y=0 with an height=54 and a width=21 loaded. frame number 6 get x=126 and y=0 with an height=54 and a width=21 loaded. frame number 7 get x=147 and y=0 with an height=54 and a width=21 loaded. frame number 8 get x=168 and y=0 with an height=54 and a width=21 loaded. frame number 9 get x=189 and y=0 with an height=54 and a width=21 loaded. frame number 10 get x=210 and y=0 with an height=54 and a width=21 loaded. frame number 11 get x=231 and y=0 with an height=54 and a width=21 loaded. frame number 12 get x=252 and y=0 with an height=54 and a width=21 loaded. Picture loaded successfully from images/coin.bmp frame number 0 get x=0 and y=0 with an height=16 and a width=16 loaded. frame number 1 get x=16 and y=0 with an height=16 and a width=16 loaded. frame number 2 get x=32 and y=0 with an height=16 and a width=16 loaded. frame number 3 get x=48 and y=0 with an height=16 and a width=16 loaded. frame number 4 get x=64 and y=0 with an height=16 and a width=16 loaded. frame number 5 get x=80 and y=0 with an height=16 and a width=16 loaded. frame number 6 get x=96 and y=0 with an height=16 and a width=16 loaded. frame number 7 get x=112 and y=0 with an height=16 and a width=16 loaded. Picture loaded successfully from images/truc.bmp frame number 0 get x=0 and y=0 with an height=30 and a width=36 loaded. frame number 1 get x=36 and y=0 with an height=30 and a width=36 loaded. frame number 2 get x=72 and y=0 with an height=30 and a width=36 loaded. frame number 3 get x=108 and y=0 with an height=30 and a width=36 loaded. frame number 4 get x=144 and y=0 with an height=30 and a width=36 loaded. frame number 5 get x=180 and y=0 with an height=30 and a width=36 loaded. Color 16711935 transparent. Color 16711935 transparent. Color 16711935 transparent. Sprite S0 at (609,100) with speed of (0,-1) Sprite T0 at (598,364) with speed of (-4,0) Sprite U0 at (82,78) with speed of (-4,2) Picture loaded successfully from images/fish.bmp frame number 0 get x=0 and y=0 with an height=54 and a width=21 loaded. frame number 1 get x=21 and y=0 with an height=54 and a width=21 loaded. frame number 2 get x=42 and y=0 with an height=54 and a width=21 loaded. frame number 3 get x=63 and y=0 with an height=54 and a width=21 loaded. frame number 4 get x=84 and y=0 with an height=54 and a width=21 loaded. frame number 5 get x=105 and y=0 with an height=54 and a width=21 loaded. frame number 6 get x=126 and y=0 with an height=54 and a width=21 loaded. frame number 7 get x=147 and y=0 with an height=54 and a width=21 loaded. frame number 8 get x=168 and y=0 with an height=54 and a width=21 loaded. frame number 9 get x=189 and y=0 with an height=54 and a width=21 loaded. frame number 10 get x=210 and y=0 with an height=54 and a width=21 loaded. frame number 11 get x=231 and y=0 with an height=54 and a width=21 loaded. frame number 12 get x=252 and y=0 with an height=54 and a width=21 loaded. Picture loaded successfully from images/coin.bmp frame number 0 get x=0 and y=0 with an height=16 and a width=16 loaded. frame number 1 get x=16 and y=0 with an height=16 and a width=16 loaded. frame number 2 get x=32 and y=0 with an height=16 and a width=16 loaded. frame number 3 get x=48 and y=0 with an height=16 and a width=16 loaded. frame number 4 get x=64 and y=0 with an height=16 and a width=16 loaded. frame number 5 get x=80 and y=0 with an height=16 and a width=16 loaded. frame number 6 get x=96 and y=0 with an height=16 and a width=16 loaded. frame number 7 get x=112 and y=0 with an height=16 and a width=16 loaded. Picture loaded successfully from images/truc.bmp frame number 0 get x=0 and y=0 with an height=30 and a width=36 loaded. frame number 1 get x=36 and y=0 with an height=30 and a width=36 loaded. frame number 2 get x=72 and y=0 with an height=30 and a width=36 loaded. frame number 3 get x=108 and y=0 with an height=30 and a width=36 loaded. frame number 4 get x=144 and y=0 with an height=30 and a width=36 loaded. frame number 5 get x=180 and y=0 with an height=30 and a width=36 loaded. Color 16711935 transparent. Color 16711935 transparent. Color 16711935 transparent. Sprite S1 at (316,27) with speed of (-3,-3) Sprite T1 at (524,231) with speed of (1,-4) Sprite U1 at (153,62) with speed of (0,3)
Mindiell
"Souvent, femme barrit" - Elephant man
Tu peux me dire ce que c'est AllocConsole ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void ActivateConsole() { AllocConsole(); // Redirection des flux I/O standards freopen("conout$", "w", stdout); freopen("conin$", "r", stdin); freopen("conout$", "w", stderr); }
Ca doit etre mon ordi ou alors je n'est pas fait les bons tests parce que j'avais établit un petit projet qui écrivait dans un fichier et qui lisait en meme temps ce qu'il écrivait et ça prenait pas loin de 3 ou 4 secondes pour faire des chargements de 10 images... En revanche j'utilisait stdio.h, est ce que ça joue ?Ben ca démarre directement, sans ralentissement. En imaginant qu'une écriture prenne 1/10 de seconde, ca prendrait un long moment. Plutôt que d'affirmer des tas de choses, essaye avant
AllocConsole() c'est tout simplement une fonction qui dit à Windows d'ouvrir une console , j'suis pas allé le chercher loin mais je connais pas en détail comment tout ça marche faut dire.
D'après MSDN :
Allocates a new console for the calling process.
Autre idée qui a le mérite de ne pas nécessiter de code ni d'option de configuration :
Les heureux utilisateurs de windows peuvent... installer cygwin (), utiliser http://tailforwin32.sourceforge.net/ ou encore aller voir http://malektips.com/xp_dos_0001.html ou télécharger toute autre version locale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part tail -f stdout.txt
En effet, cela a le mérite d'être mentionnéEnvoyé par Sivrît
Au moins cela ne demande pas de modifier la SDL
Jc
En fait j'ai utilisé le lien de Laurent Gomila () en mensionnant simplement :
Et voila! Ca marche impeck'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int main(int argc, char* argv[]) { freopen("CON","w",stdout); }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager