2015-07-12 2 views
2

Travail sur un clone de Pong. Avoir de sérieux problèmes avec essayer d'afficher le score sur l'écran. Beaucoup de choses que j'ai trouvées utilisent des images mais je veux juste utiliser du texte pour afficher le nombre de points. J'essaie d'utiliser la bibliothèque SDL TTF pour charger une police et l'afficher mais elle ne s'affichera pas correctement. Je trouve cette question How to blit Score on screen in SDL? et la réponse dit utiliser SDL_BlitSurface() que j'ai essayé et je viens de recevoir une erreur de construction (en supposant que je faisais correctement)SDL affiche le score à l'écran

Voici la fonction que j'appelle pour dessiner le score:

void Pong::drawScore(){ 
    leftScoreChar = leftScore; 
    rightScoreChar = rightScore; 

    SDL_Color text_color = {255, 255, 255}; 

    score = TTF_RenderText_Solid(font, 
           &leftScoreChar, 
           text_color); 

    score2 = TTF_RenderText_Solid(font, 
           &rightScoreChar, 
           text_color); 

    leftScoreText = SDL_CreateTextureFromSurface(renderer, score); 
    rightScoreText = SDL_CreateTextureFromSurface(renderer, score2); 

    SDL_RenderCopy(renderer, leftScoreText, NULL, &scoreA); 
    SDL_RenderCopy(renderer, rightScoreText, NULL, &scoreB); 
} 

qui lorsque les sorties exécuter ceci: https://goo.gl/dZxDEa

Aplogies, je mettrais une image dans le poste, mais apparemment, je ne peux pas.

Et le score ne s'affichera pas sauf si l'entier stockant le score est rendu égal à 1 pour une raison quelconque et affiche zéro. Et le score est deffinatly croissant parce que j'ai le jeu de sortie le score à la console pour s'assurer. Alors qu'est-ce que je fais de mal cela fait mal afficher mon score et avoir quelque chose 00?

Répondre

0

Il existe plusieurs façons de procéder. Vous pouvez le faire via un SDL_Surface ou un SDL_Texture. Je vais illustrer les deux. (S'adapter si nécessaire.)

int fontsize = 24; 
int t_width = 0; // width of the loaded font-texture 
int t_height = 0; // height of the loaded font-texture 
SDL_Color text_color = {0,0,0}; 
string fontpath = "my font path"; 
string text = "text I want to display"; 
TTF_Font* font = TTF_OpenFont(fontpath.c_str(), fontsize); 
SDL_Texture* ftexture = NULL; // our font-texture 

// check to see that the font was loaded correctly 
if (font == NULL) { 
    cerr << "Failed the load the font!\n"; 
    cerr << "SDL_TTF Error: " << TTF_GetError() << "\n"; 
} 
else { 
    // now create a surface from the font 
    SDL_Surface* text_surface = TTF_RenderText_Solid(font, text.c_str(), text_color); 

    // render the text surface 
    if (text_surface == NULL) { 
     cerr << "Failed to render text surface!\n"; 
     cerr << "SDL_TTF Error: " << TTF_GetError() << "\n"; 
    } 
    else { 
     // create a texture from the surface 
     ftexture = SDL_CreateTextureFromSurface(renderer, text_surface); 

     if (ftexture == NULL) { 
      cerr << "Unable to create texture from rendered text!\n"; 
     } 
     else { 
      t_width = text_surface->w; // assign the width of the texture 
      t_height = text_surface->h; // assign the height of the texture 

      // clean up after ourselves (destroy the surface) 
      SDL_FreeSurface(surface); 
     } 
    } 
} 

Notez que vous pouvez simplement arrêter d'utiliser uniquement la surface seule. Cependant, comme la surface est rendue par un logiciel, la texture est sans doute meilleure car elle est chargée en VRAM. (En savoir plus ici: Difference between surface and texture (SDL/general))

Ensuite, tout ce que vous devez faire est de le rendre (semblable à):

int x = 0; 
int y = 0; 
SDL_Rect dst = {x, y, t_width, t_height}; 
SDL_RenderCopy(renderer, ftexture, NULL, &dst); // renderer is a variable of the type `SDL_Renderer*` 

Enfin, rappelez-vous que l'ordre dans la façon dont vous affichez les questions de choses!

+0

J'ai essayé de copier et coller ce code et de l'ajuster pour mon programme mais maintenant je ne reçois aucune sortie de n'importe quel type de texte sur la fenêtre lors de l'exécution. – CharlieFan39

+0

@ CharlieFan39 Avez-vous initialisé correctement les bibliothèques correspondantes? Avez-vous activé 'SDL_RENDERER_ACCELERATED'? – jrd1

+0

Oui, j'ai. La façon dont j'essayais avant m'a donné une sortie incorrecte, mais pour une raison quelconque, je n'ai pas de sortie maintenant. Je suis tellement perdu avec ça. – CharlieFan39