• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SDL Renderowanie Textu

Cloud VPS
0 głosów
1,102 wizyt
pytanie zadane 5 października 2019 w C i C++ przez Jakub Chomicz 1 Użytkownik (840 p.)

Witam mam problem otóż pisałem obiektowo aplikacje i obecnie pracuję nad wyświetlaniem textu tylko że jest problem otóż skubaniec nie chce się pokazać pomimo że żaden error mi się nie wyświetla ktoś ma jakiś pomysł ? proszę o szybką pomoc...

#include "TexturesAndTexts.h"

SDL_Texture * Texture::Load(const char*file,SDL_Renderer*ren)
{
    SDL_Surface*Surf = IMG_Load(file);
    SDL_Texture*tex = SDL_CreateTextureFromSurface(ren,Surf);
    SDL_FreeSurface(Surf);
    return tex;
}
void Texts::TextCreate(const char*name,const char*path,int s,SDL_Color color,int x,int y,SDL_Renderer*ren)
{
    TR.x = x;
    TR.y = y;
    TTF_Font*font = TTF_OpenFont(path,s);
    SDL_Surface*Surf = TTF_RenderText_Blended(font,name,color);
    SDL_Texture*textrender = SDL_CreateTextureFromSurface(ren,Surf);
    SDL_FreeSurface(Surf);
    SDL_QueryTexture(textrender,NULL,NULL,&TR.w,&TR.h);
    SDL_RenderCopy(ren,textrender,NULL,&TR);
}
#include "Game.h"
Texts*T;
Game::Game()
{

}
Game::~Game()
{

}
void Game::Init(const char*Title,int x,int y,int w,int h,bool FC)
{
    if(SDL_Init(SDL_INIT_EVERYTHING) == 0)
    {
        cout<<"SDL_INITIALIZATION_SUCCEED"<<endl;
        WINDOW = SDL_CreateWindow(Title,x,y,w,h,FC);
        if(WINDOW)
        {
            cout<<"Window Created"<<endl;
        }
        RENDER = SDL_CreateRenderer(WINDOW,-1,0);
        if(RENDER)
        {
            cout<<"Render Created"<<endl;
        }
        Running = true;
    }
    else
    {
        Running = false;
    }
    SDL_Color kolor = {255,0,0};
    T = new Texts;
    T->TextCreate("LOL","FONST/comici.ttf",60,kolor,0,0,RENDER);
}
void Game::Events()
{
    SDL_Event event;
    SDL_PollEvent(&event);
    switch(event.type)
    {
    case SDL_QUIT:
        Running = false; break;
    default:
        break;
    }
}
void Game::UpdateAndRender()
{

}
void Game::CleanRender()
{

}
void Game::QuitGame()
{
    cout<<"Cleaned"<<endl;
    SDL_DestroyWindow(WINDOW);
    SDL_Quit();
}
#include "Game.h"
Game*G;
int main(int argc,char* args[])
{
    G = new Game();
    G->Init("Demon Jake",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,1280,720,false);
    while(G->Running)
    {
        G->Events();
        G->UpdateAndRender();
    }
    G->CleanRender();
    G->QuitGame();
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 5 października 2019 przez j23 Mędrzec (195,240 p.)
wybrane 5 października 2019 przez Jakub Chomicz 1
 
Najlepsza

"FONST/comici.ttf"

Na pewno chodziło Ci o katalog FONST?

Dlaczego T i G jest globalne?

Powinieneś też zwalniać fonta funkcją TTF_CloseFont.

Chyba już Ci pisałem, żebyś nie nazywał zmiennych dużymi literami, bo ten sposób jest zarezerwowany dla makr, aliasów typów (w stylu C) i stałych.

komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
Tak to dobry folder :/ masz jeszcze jakieś pomysły?
komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
Już tą funkcję od zwalniania fonta użyłem pod freesurface ale nadal nic :/
komentarz 5 października 2019 przez j23 Mędrzec (195,240 p.)
Sprawdź, czy się w ogóle ten font ładuje.
komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
jak ?
komentarz 5 października 2019 przez j23 Mędrzec (195,240 p.)

Najprościej debuggerem - ustawiasz breakpointa na linii z TTF_RenderText_Blended i sprawdzasz wartość wskaźnika font. Jeśli jest null, to font nie został wczytany.

Inna opcja to po prostu zrób warunek sprawdzający wskaźnik font po wywołaniu funkcji TTF_OpenFont.

komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
    if(font=NULL)
    {
        cout<<"cdashdhasdl"<<endl;
    }

ani tu

    if(font)
    {
        cout<<"cdashdhasdl"<<endl;
    }

ani tu 

nic nie wypisuje

komentarz 5 października 2019 przez j23 Mędrzec (195,240 p.)

if(font=NULL)

Z takim warunkiem to na pewno nic nie wypisze...

 

Skoro drugi warunek też nic nie wypisuje, to znaczy, że font nie ładuje się.

komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
Sory na obiektóce mało się znam jeszcze a na sdl to prawie wcale dlatego się ucze
komentarz 5 października 2019 przez j23 Mędrzec (195,240 p.)
Ten błąd z obiektówką nie ma nic wspólnego. To są podstawy C ;)

Jeszcze raz napiszę: skoro drugi warunek też nic nie wypisuje, to znaczy, że font nie ładuje się.
komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
to o co może w takim układzie chodzić ?
komentarz 5 października 2019 przez j23 Mędrzec (195,240 p.)
Katalog roboczy może być inny niż ten, w którym jest binarka (w C::B to typowe).
komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
ok dzięki naprawione
komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
ale mam jeszcze 1 problem którego wgl nie rozumiem...

jak odpalam program bezpośrednio z pliku z folderu bin to nie wyświetla mi obrazów zaś jak odpalam z C::B  to działa elegancko wiesz może jeszcze o co tu może chodzić ?
komentarz 5 października 2019 przez j23 Mędrzec (195,240 p.)
C::B zmienia katalog roboczy do, jeśli mnie pamięć nie myli, katalogu projektu i stąd te problemy. Najsensowniej jest zrobić dowiązanie symboliczne w katalogu z binarką do katalogów z danymi programu. Wtedy będzie działać i z C::B, i z dwukliku.
komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
czyli ? bo nic prawie z tego nie rozumiem xd
komentarz 5 października 2019 przez j23 Mędrzec (195,240 p.)

Trzeba internetów używać -> link

komentarz 5 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
no dobra ale jak to zrobić ?
komentarz 5 października 2019 przez j23 Mędrzec (195,240 p.)

Mniej więcej tak (przy założeniu, że katalog z fontami leży w katalogu projektu, a binarka w <projekt>\bin\[debug|release]):

  1. wchodzisz do katalogu z binarką.
  2. otwierasz w nim wiersz poleceń.
  3. wpisujesz mklink /D Fonst ../../Fonst.
  4. powinno pojawić się dowiązanie.

Jeśli coś nie zadziała, to sam pokombinuj.

komentarz 6 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
kurde pobawiłem się troche ale dalej nic nie działa.

D:\GRY\Demon Jake\FONTS to jest ścieżka do font-ów może coś robie nie tak weź mi to wypisz jak mam to w pisać w cmd
komentarz 6 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
w sensie żeby się dowiązało symbolicznie
komentarz 6 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
You do not have sufficient privilege to perform this operation. mówi że nie mam uprawnień :/
komentarz 6 października 2019 przez j23 Mędrzec (195,240 p.)

Dobra, zamiast /D daj /J. Do stworzenia junction point nie trzeba uprawnień.

komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
"Nie można utworzyć pliku który już istnieje"
komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)
Jeszcze się z tym bawisz?

Pokaż screen wiersza poleceń z komendą, którą wywołujesz.
komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)

Do Fonts-ów wypisało że gitara ale do PNG pisze ze już istnieje a najlepsze jest to że już jak teraz odpalam(bezpośrednio z pliku) to zawiesza mi program nic nie działa i po chwili się wyłącza xd

komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)

Ścieżki ze spacjami musisz wpisywać w cudzysłowie.  Po drugie, nie podajesz nazwy "dowiązania". Składnia wywołania mklink jest taka:

mklink /J <nazwa dowiązania> <ścieżka do katalogu>

czyli:

mklink /J FONTS "D:\GRY\Demon Jake\FONTS"

komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)

Dalej nic :/

komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)

Nic, czyli co? Nie tworzy się, czy twój program nie działa?

Z tego, co pamiętam, C::B tworzył binarkę w katalogu Debug lub Release, a Ty komendę wywołujesz w katalogu Bin. Więc pytanie, czy tam leży binarka?

komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)

Wiem Pomyślałem o tym jak nie zadziałało więc zrobiłem tak jak mówisz w folderze Debug i nadal to samo po prostu biały ekran nie ma żadnych textur ani fontów nic

komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)
Sprawdzałeś w ogóle, czy stworzyło się to dowiązanie w katalogu z programem?
komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)

Tak stworzyło się

komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)
Jak odpalasz z C::B to działa?
komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)

No tak

komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)

Dziwne. Skoro dowiązanie jest poprawnie zrobione, to program powinien widzieć je jak zwykły katalog. Chyba że gdzieś w programie przestawiany jest katalog roboczy...

Daj taki warunek:

if(!font) {
    std::cout << "TTF_OpenFont error: " << TTF_GetError() << '\n';
}

i powiedz, co wypisuje.

komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)

właściwie to nic mi nie wypisuje :/

komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)

Nawet tekstu "TTF_OpenFont error: "? Jeśli tak, to znaczy, że font jest ładowany.

komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)

nawet TTF_OpenFont error nie wyświetla

 

komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
no ale jak jest ładowany to w czym tkwi problem

:/
komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)
Ta aplikacja oczywiście jest konsolowa, tak?

Wszystkie niezbędne pliki, biblioteki i katalogi są w katalogu programu?
komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
tak. bo z sdl2 to do folderu z binarką tylko .ddl trzeba wrzucić co nie?
komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)
Pewnie tak.

Co z tą konsolą?
komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
tak to konsolowa apk
komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)
Czyli wypisać coś powinno w przypadku błędu. Daj podobne warunki do innych fragmentów, gdzie ładujesz coś z pliku.
komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)

Wypisuje to co napisałem w sekcji else czyli PNG_OK

komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)
Nie wklejaj całego ekranu, bo kompletnie nic nie widać.
komentarz 7 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
w sumie racja. Tak czy siak pisze ze wszystko jest ok a nie wyświetla
komentarz 7 października 2019 przez j23 Mędrzec (195,240 p.)
Skończyły mi się pomysły. Skoro font się ładuje, to nie jest to problem katalogów. Jakby brakowało jakiejś DLL-ki, to dostałbyś odpowiednie info o tym. Być może to kwestia zmiennych środowiskowych, procesy potomne dziedziczą je po rodzicu (czyli C::B)... Ciężko powiedzieć.
komentarz 9 października 2019 przez Jakub Chomicz 1 Użytkownik (840 p.)
no trudno dobra dzięki za pomoc coś pokombinuje

Podobne pytania

0 głosów
1 odpowiedź 473 wizyt
pytanie zadane 23 września 2017 w C i C++ przez DonTweaks Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 213 wizyt
pytanie zadane 18 czerwca 2017 w C i C++ przez shout123131 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 557 wizyt
pytanie zadane 13 maja 2023 w C i C++ przez antekwi546 Użytkownik (510 p.)

93,484 zapytań

142,417 odpowiedzi

322,763 komentarzy

62,895 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...