Dobrý den, mám problém s knihovnou TTF. Když spustím program tak jede naprosto v pořádku, ovšem po nějaké době zmizí všechen text a když se podívám do logu tak to píše že nejde otevřít font. Nicméně se začátku to všechno jede v pohodě.
Doplním ještě že to samozřejmě kombinuji s SDLkem.
Diky
Fórum › C / C++
TTF-po čase nejde otevřít font
Zaviram právě....vůbec netuším v čem může byt ta chyba. Nechci sem házet celý zdroják protože má asi 400 řádků..
Jak to myslis? Ja s grafikou teprve zacinam a tak jsem si jen rychle nasel jak vyrenderovat text a tim to pro me skoncilo. Jedine co tam mam je TTF_Init(), TTF_OpenFont(), TTF_CloseFont() a TTF_Quit(). Nic dál jsem neřešil.
#include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
void lock(SDL_Surface *Surface)
{
if (SDL_MUSTLOCK(Surface))
{
if (SDL_LockSurface(Surface)<0) cout<< "Error";
}
else
{
SDL_UnlockSurface(Surface);
}
};
void funkce(SDL_Surface *Surface,SDL_Surface *text)
{
SDL_Rect rectangle={30,585,15,50};
lock(Surface);
SDL_BlitSurface(text,NULL,Surface,&rectangle);
TTF_Font *textFont;
{ //TEXT
//promenne pro text
SDL_Color barvaTextu={255,0,0,0};
SDL_Color barvaBila={255,255,255,0};
SDL_Color barvaPozadi={0,0,0,100};
//otevreni fontu
cout<< "Otevreni fontu" << endl;
textFont=TTF_OpenFont("times.ttf",50);
if (!textFont)
{
cout<< "font se nepovedlo otevrit" << endl;
TTF_Quit();
if(TTF_Init()==-1)
{
cout<< "Opetovna inicializase SDL_TTF se nezdarila"<<endl << TTF_GetError();
}
else {cout<< "Opetovna inicializace SDL_TTF se zdarila" << endl;}
textFont=TTF_OpenFont("times.ttf",50);
if (!textFont)
{
cout<< "Tak a je to v prdeli..." << endl << TTF_GetError() << endl;
}
}
//samotny text
text=TTF_RenderText_Shaded(textFont,"nejakyText",barvaTextu,barvaPozadi);
SDL_BlitSurface(text,NULL,Surface,&rectangle);
if(textFont!=NULL)
{
cout<< "Zavreni fontu" << endl;
TTF_CloseFont(textFont);
textFont=NULL;
}
lock(Surface);
}
int main(int argc, char *argv[])
{
//inicializase SDL
if( SDL_Init(SDL_INIT_VIDEO) < 0 )
{
cout<<"Inicializace SDL se nezdařila: \n"<< SDL_GetError();
return -1;
}
if(TTF_Init()==-1)
{
cout<< "Inicializase SDL_TTF se nezdarila \n" << TTF_GetError();
return -1;
}
SDL_Surface *screen=new SDL_Surface;
screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( screen == NULL )
{
cout<<"Vytvoření okna se nezdařilo: \n"<< SDL_GetError();
return -1;
}
//promenne pro text
TTF_Font *textFontFPS;
SDL_Color barvaTextu={255,255,255,0};
SDL_Color barvaPozadi={0,0,0,100};
SDL_Surface *text=new SDL_Surface;
//otevreni fontu
cout<< "Otevreni fontu" << endl;
textFontFPS=TTF_OpenFont("times.ttf",15);
if (!textFontFPS)
{
cout<< "font se nepovedlo otevrit" << endl;
TTF_Quit();
if(TTF_Init()==-1)
{
cout<< "Opetovna inicializase SDL_TTF se nezdarila"<<endl << TTF_GetError();
}
else {cout<< "Opetovna inicializace SDL_TTF se zdarila" << endl;}
textFontFPS=TTF_OpenFont("times.ttf",15);
if (!textFontFPS)
{
cout<< "Tak a je to v prdeli..." << endl << TTF_GetError() << endl;
}
}
bool done=true;
while(done)
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
if(event.type == SDL_QUIT) done=false;
}
text=TTF_RenderText_Shaded(textFontFPS,"FPS",barvaTextu,barvaPozadi);
funkce(screen,text);
SDL_Flip(screen);
}
TTF_Quit();
}
Trošku jsem to čistil, tak snad jsem nic nevynechal.
V zavírání fontů to nebude, mám uzavřené všechno. Navíc jsou všechny ukazatele ve funkcích a neukazují na volnou paměť, takže by se měli smazat při skončení funkce.
Já vím že to běží. Mě to běží i tak. Jenže se to po nějaké době klekne a TTF_GetError() hlásí že nejde otevřít font. Přitom asi 10 minut jde v pohodě otevřít, potom to klekne. To jak mám za sebou QUIT a INIT byla taková zkouška to vypnout a zapnout, ale pořád nic :/ :D
to TTF_Init by melo stacit jednou na zacatku programu a quit na konci...
+ pokud pouzivas furt ten samy font, tak by melo stacit nacist taky na zacatku a pak uz jen vykreslovat... furt to otvirat a zavirat + i dokonce inicializovat a rusit cely je podle me asi zbytecny
Zkusím, ale až zítra. Nicméně nevidím souvilost mezi Surfacem a tím že nejde otevřít font.
To Init a Quit jsem měl právě na začátku a na konci. Jinak je to v podmínce jestliže se nepodařilo přidat font k ukazateli, a spustí se tedy jen tehdy. Jak jsme psal byla to snaha zkusit to zapnout a vypnout. Jinak otevírám ho a zavírám kvůli různé velikosti písma (tedy TTF_FontOpen a TTF_FontClose)
Skutečně bylo nutné na každý *text surface zavolat SDL_FreeSurface ....diky, na toto bych vážně sám nepřišel.
označuji tedy za vyřešené.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Proč nejde změnit font na Hebrew? — založil oxidián
Nejde otevřít soubor v C (fopen) — založil oxidián
Ttf pismo podobne Arial-u — založil marioff
@font-face — založil ANV
Moderátoři diskuze