xkazeshinix Temat założony przez niniejszego użytkownika |
[SDL2] Problem z renderem » 2016-02-27 17:07:55 Witam! Niedawno zaczalem bawic sie biblioteka SDL2, natomiast mam problem z renderem. Poczatkowo upychalem wszystko w jednym pliku i wszystko dzialalo normalnie bez zarzutu, natomiast po rozbiciu na kilka plikow juz nie.. Oto moj program rysujacy kwadrat: main.cpp #include <SDL2/SDL.h> #include <iostream> #include "GameEngine.hpp" using namespace std;
int main( int argc, char * args[] ) { //Tworze okno SDL_Window * ekran = NULL; Tworze_Ekran(ekran, Wysokosc_Ekranu, Szerokosc_Ekranu);
//Tworze render do okna SDL_Renderer * render = NULL; Tworze_Render(ekran, render);
//Maluje render SDL_SetRenderDrawColor(render, 0, 0, 0, 255 ); SDL_RenderClear(render);
//Maluje kwadrat SDL_Rect kwadrat; kwadrat.x = 50; kwadrat.y = 50; kwadrat.w = 50; kwadrat.h = 50; SDL_SetRenderDrawColor( render, 0, 0, 255, 255 ); SDL_RenderFillRect( render, &kwadrat );
//Pokaz na ekranie SDL_RenderPresent(render);
//Przerwa SDL_Delay(3000);
//Koncze program SDL_DestroyRenderer(render); SDL_DestroyWindow(ekran); SDL_Quit(); return 0; }
GameEngine.hpp #pragma once #include <SDL2/SDL.h>
//Wymiary okna const int Wysokosc_Ekranu = 800, Szerokosc_Ekranu = 600;
void Tworze_Ekran(SDL_Window * ekran, const int Wysokosc_Ekranu, const int Szerokosc_Ekranu); void Tworze_Render(SDL_Window * ekran, SDL_Renderer * render);
Display.cpp #include <iostream> #include "GameEngine.hpp" #include <SDL2/SDL.h> using namespace std;
void Tworze_Ekran(SDL_Window * ekran, const int Wysokosc_Ekranu, const int Szerokosc_Ekranu) { ekran = SDL_CreateWindow("Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, Wysokosc_Ekranu, Szerokosc_Ekranu, SDL_WINDOW_SHOWN);
if (ekran == NULL) { cout << "SDL_CreateWindow Error: " << SDL_GetError() << endl; SDL_Quit(); } };
void Tworze_Render(SDL_Window * ekran, SDL_Renderer * render) { render = SDL_CreateRenderer(ekran, -1, SDL_RENDERER_ACCELERATED); if (render == NULL) { SDL_DestroyWindow(ekran); cout << "Blad rendera: " << SDL_GetError() << endl; SDL_Quit(); } };
Program sie kompiluje, ale uruchomiony wyswietla tylko ramke okna. W konsoli SDL wyrzuca blad: "Blad rendera: Invalid Window" (z funkcji Tworze_Render). Siedze juz nad tym troche i nie moge sie doszukac bledu. Z gory dziekuje za pomoc. |
|
dominicuss |
» 2017-01-02 12:39:50 Z tego co widzę w kodzie brakuje inicjalizacji biblioteki SDL_Init(SDL_INIT_EVERYTHING); albo minimalnie samego video poprzez flagę SDL_INIT_VIDEO sam mam podobny problem... ale narazie nie będę wklejał kodu. mój problem rozwiązałem tworząc strukturę zawierającą najważniejsze struktury sdl'a typedef struct SDL { SDL_Renderer* renderer = NULL; SDL_Window* window = NULL; SDL_Event event;
} SDL;
teraz funkcje operują na tej strukturze. Dobra rozwiązanie ze strukturą było obejściem problemu, twój problem (jak i mój) polega na tym, że funkcje pracują na lokalnych kopiach wskaźników, które przekazujesz do funkcji powinieneś skorzystać z referencji do wskaźników. void Tworze_Ekran(SDL_Window*& ekran, const int Wysokosc_Ekranu, const int Szerokosc_Ekranu); void Tworze_Render(SDL_Window*& ekran, SDL_Renderer*& render);
teraz funkcje będą pracować na twoich wskaźnikach a nie na kopiach. |
|
czaffik |
» 2017-01-05 22:43:15 Sęk w tym że wskaźnik w funkcjach jest przekazywany przez kopię, w konsekwencji po wyjściu z funkcji wskaźnik na ekran nadal jest pusty (NULL), wystarczy sprawdzić: SDL_Window * ekran = NULL; Tworze_Ekran( ekran, Wysokosc_Ekranu, Szerokosc_Ekranu );
if( ekran == NULL ) cout << "ekran jest pusty!!!!";
SDL_Renderer * render = NULL; Tworze_Render( ekran, render );
Sposobem jest stworzenie funkcji które będą zwracały wskaźnik na strukturę ekran i renderer, a nie przyjmowały go jako argument, który przyjmą przez kopię (nawet wskaźnik) i w konsekwencji nie zmodyfikują go poza funkcją: SDL_Window * Tworze_Ekran( const int Wysokosc_Ekranu, const int Szerokosc_Ekranu ) { SDL_Init( SDL_INIT_VIDEO ); SDL_Window * ekran = SDL_CreateWindow( "Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, Wysokosc_Ekranu, Szerokosc_Ekranu, SDL_WINDOW_SHOWN ); if( ekran == NULL ) { cout << "SDL_CreateWindow Error: " << SDL_GetError() << endl; SDL_Quit(); } return ekran; };
SDL_Window * ekran = Tworze_Ekran( Wysokosc_Ekranu, Szerokosc_Ekranu );
|
|
« 1 » |