Bonjour,
Je suis encore bloqué sur mon générateur de fractales mais au moins tout compile désormais.
J'obtiens bien une image ressemblante à celle-ci:
http://whatisnotseen.files.wordpress...elbrot_set.jpg
Mais je ne parviens à faire afficher un texte sur cette surface par le biais de SDL_TTF.
Je voudrais pour commencer afficher abscisse du pixel pointé par le curseur de la souris.
Voici mon main.cpp:
J'utilise au passage une fonction trouvée sur un forum. En voici le code:
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
73
74
75
76
77
78 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <SDL.h> #include <Complexe.h> #include <Mandelbrot.h> #include <Julia.h> #include <coloration.h> #include <Buddhabrot.h> #include <create_text.h> int main(int argc, char *argv[]) { Uint8 *keystates = SDL_GetKeyState(NULL); SDL_Surface *screen = NULL; // declaration de l'ecran SDL_Event event; SDL_Init(SDL_INIT_VIDEO); screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); // on génère une interface de taille 640*480 Mandelbrot f(screen,0, 0, 1,50); //On Initialise une fractale f.dessine(); // Puis on la dessine. /* Complexe j(-0.683,-0.408); Julia f(screen, 0, 0, 1,30,j); f.dessine();*/ /* Buddhabrot f(screen,320,240,0.7,500); f.dessine(); */ while(true) { SDL_PollEvent(&event); if( event.type == SDL_MOUSEMOTION ) { char *txt=(char *)event.motion.x; Create_text (screen,580, 460,10, SDL_MapRGB(screen->format, 255, 255, 255), "C:\WINDOWS\Fonts\ARIAL.TTF", txt ) ; SDL_Flip(screen); } if( event.type == SDL_MOUSEBUTTONDOWN ) // Par un clic de la souris, on centre sur la partie { // qui nous intéresse. f.setAbs( f.getAbs() + (event.motion.x-280)/(140*f.getZoom()) ); f.setOrd( f.getOrd() + (event.motion.y-240)/(120*f.getZoom()) ); f.dessine(); } SDL_PumpEvents(); if( event.button.button == SDL_BUTTON_WHEELUP || keystates[SDLK_UP]) // On zoome { f.setZoom(f.getZoom()*2); f.setIter(f.getIter()+10); f.dessine(); } if( event.button.button == SDL_BUTTON_WHEELDOWN || keystates[SDLK_DOWN]) // Et on dézoome. { f.setZoom(f.getZoom()/2); f.setIter(f.getIter()-10); f.dessine(); } if (event.type==SDL_QUIT) break; SDL_PumpEvents(); SDL_Flip(screen); } SDL_FreeSurface(screen); SDL_Quit(); return EXIT_SUCCESS; }
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 #include <SDL.h> #include <SDL_ttf.h> #define ERROR_MSG(func_name, msg) \ fprintf \ ( \ stderr, \ "**>> Erreur: "func_name": "msg \ ); /* -------------------------------------------------------------------------- Create_text -------------------------------------------------------------------------- Fonction privee de creation de texte. -------------------------------------------------------------------------- E: Pointeur de la surface sur laquelle rendre le texte. E: Position X du texte. E: Position Y du texte. E: Taille de la police. E: Couleur de la police (a creer avec la fonction SDL_MapRGB). E: Nom de la police a utiliser. E: Texte a rendre. S: -------------------------------------------------------------------------- */ static void Create_text (SDL_Surface * p_screen, short x, short y, short font_size, Uint32 i_color, const char * p_font_face, const char * p_message) { TTF_Font * p_font = NULL; SDL_Surface * s_text = NULL; SDL_Rect rect_dest; SDL_Color color; /* ----- Initialisation de SDL_ttf ----- */ if (TTF_Init () < 0) { ERROR_MSG ( "draw_text", "Impossible d'initialiser SDL_ttf !\n" ); return; } /* ----- */ /* ----- Chargement de toutes les donnees necessaires ----- */ /* Recuperation des informations de couleurs. */ color.r = (i_color & SDL_MapRGB (p_screen->format, 255, 0, 0)) >> 16; color.g = (i_color & SDL_MapRGB (p_screen->format, 0, 255, 0)) >> 8; color.b = (i_color & SDL_MapRGB (p_screen->format, 0, 0, 255)); /* Chargement de la police */ p_font = TTF_OpenFont (p_font_face, font_size); if (! p_font) { ERROR_MSG ( "draw_text", "Impossible de charger la police !\n" ); return; } /* ----- */ /* ----- Rendu du texte ----- */ s_text = TTF_RenderText_Solid (p_font, p_message, color); /* Mise en place du message sur la surface de jeu */ if (s_text == NULL) { ERROR_MSG ( "draw_text", "Impossible de rendre le texte !\n" ); } else if (s_text != NULL) { rect_dest.x = x; rect_dest.y = y; rect_dest.w = s_text->w; rect_dest.h = s_text->h; /* On blit la surface a l'ecran */ SDL_BlitSurface (s_text, NULL, p_screen, & rect_dest); SDL_FreeSurface (s_text); } /* Fermeture de la police */ TTF_CloseFont (p_font); /* ----- */ return; }
Pour résumer, mon problème est que ces lignes de code:
Ne m'affichent rien sur l'écran...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if( event.type == SDL_MOUSEMOTION ) { char *txt=(char *)event.motion.x; Create_text (screen,580, 460,10, SDL_MapRGB(screen->format, 255, 255, 255), "C:\WINDOWS\Fonts\ARIAL.TTF", txt ) ; SDL_Flip(screen); }
Merci de votre aide.
Partager