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
Post a Comment