c++ - Changing text color when mouseover SDL2 -


i'm trying change color of text when hovering over. can't see why it's not working.

i have tried many diffrent things can't seem find solution problem.

mabey need use else sdl_freesurface?

here code:

int maingame::mainmenu(){     ttf_font *font;     ttf_init();     font = ttf_openfont("myfont.ttf", 30);      int x, y;     const int nummenu = 2;     const char* labels[nummenu] = { "play", "exit" };     sdl_surface* menus[nummenu];     bool selected[nummenu] = { 0, 0 };     sdl_color color[2] = { { 255, 255, 255 }, { 255, 0, 0 } };      sdl_window* window = null;      window = sdl_createwindow(         "main menu",         sdl_windowpos_centered,         sdl_windowpos_centered,         1024,         768,         sdl_window_shown     );     sdl_renderer* renderer = sdl_createrenderer(window, -1,       sdl_renderer_accelerated);       menus[0] = ttf_rendertext_solid(font, labels[0], color[0]);     menus[1] = ttf_rendertext_solid(font, labels[1], color[0]);      sdl_texture* play = sdl_createtexturefromsurface(renderer, menus[0]);     sdl_texture* exit = sdl_createtexturefromsurface(renderer, menus[1]);       sdl_rect pos[nummenu];     pos[0].x = 330;     pos[0].y = 250;     pos[0].w = 200;     pos[0].h = 100;     pos[1].x = 330;     pos[1].y = 380;     pos[1].w = 200;     pos[1].h = 100;      sdl_event event;       while (1)     {         sdl_renderclear(renderer);         sdl_rendercopy(renderer, play, null, &pos[0]);         sdl_rendercopy(renderer, exit, null, &pos[1]);         sdl_renderpresent(renderer);         t = sdl_getticks();          while (sdl_pollevent(&event))         {             switch (event.type)             {                 case sdl_quit:                     sdl_freesurface(menus[0]);                     sdl_freesurface(menus[1]);                     return 1;                 case sdl_mousemotion:                     x = event.motion.x;                     y = event.motion.y;                      (int = 0; < nummenu; += 1) {                         if (x >= pos[i].x && x <= pos[i].x + pos[i].w && y >= pos[i].y && y <= pos[i].y + pos[i].h)                         {                             if (!selected[i]) // part                             {                                 selected[i] = 1;                                 sdl_freesurface(menus[i]);                                 menus[i] = ttf_rendertext_solid(font, labels[i], color[1]);                             }                         }                         else                         {                             if (selected[i])                             {                                 selected[i] = 0;                                 sdl_freesurface(menus[i]);                                 menus[i] = ttf_rendertext_solid(font, labels[i], color[0]);                             }                         }                     }                     break;                 case sdl_mousebuttondown:                     x = event.button.x;                     y = event.button.y;                     (int = 0; < nummenu; += 1) {                         if (x >= pos[i].x && x <= pos[i].x + pos[i].w && y >= pos[i].y && y <= pos[i].y + pos[i].h)                         {                             sdl_freesurface(menus[0]);                             sdl_freesurface(menus[1]);                             return i;                         }                     }                     break;                 case sdl_keydown:                     if (event.key.keysym.sym == sdlk_escape)                     {                         sdl_freesurface(menus[0]);                         sdl_freesurface(menus[1]);                         return 0;                     }             }         }     }      sdl_destroyrenderer(renderer);     sdl_destroywindow(window);     sdl_quit(); } 

your problem indeed here :

if (!selected[i]) // part {     selected[i] = 1;     sdl_freesurface(menus[i]);     menus[i] = ttf_rendertext_solid(font, labels[i], color[1]); } 

here updating menus[i] sdl_surface. in rendering code :

sdl_rendercopy(renderer, play, null, &pos[0]); sdl_rendercopy(renderer, exit, null, &pos[1]); 

you're never updating play or exit.


you should rather make error out of sdl_textures , temporary create , destroyd sdl_surface :

init :

sdl_textue* menus[nummenu];  (int = 0; < nummenu; += 1) {     sdl_surface* temp = ttf_rendertext_solid(font, labels[i], color[i]);     menus[0] = sdl_createtexturefromsurface(renderer, temp); } 

updating `sdl_texture` :

if (!selected[i]) // part {     selected[i] = 1;      sdl_surface* temp = ttf_rendertext_solid(font, labels[i], color[1]);     menus[i]  = sdl_createtexturefromsurface(renderer, temp);     sdl_freesurface(temp); } 

rendering :

for (int = 0; < nummenu; += 1)     sdl_rendercopy(renderer, menu[i], null, &pos[i]); 

a final word of advice : create example people can run without modifying code. , use standard font. otherwise, font pointer null , application segfault


Comments

Popular posts from this blog

Email notification in google apps script -

c++ - Difference between pre and post decrement in recursive function argument -

javascript - IE11 incompatibility with jQuery's 'readonly'? -