Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SDL2] Problem z renderem

Ostatnio zmodyfikowano 2017-01-05 22:43
Autor Wiadomość
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.
P-145357
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.
P-155809
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ć:
C/C++
//Tworze okno
SDL_Window * ekran = NULL;
Tworze_Ekran( ekran, Wysokosc_Ekranu, Szerokosc_Ekranu );
// sprawdzamy czy wskaźnik na ekran nie jest NULL:
if( ekran == NULL ) cout << "ekran jest pusty!!!!";
//Tworze render do okna
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ą:
C/C++
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 );
P-156064
« 1 »
  Strona 1 z 1