SDL nie ładuje i nie pokazuje pliku .bmp

0

Mam taki kod:

#include <SDL/SDL.h>
SDL_Surface * ekran = NULL;
SDL_Surface * texture[100];

int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 800, 450, 32, SDL_SWSURFACE );
    texture[0] = SDL_LoadBMP( "/data/background.bmp" );
    SDL_BlitSurface( texture[0], NULL, ekran, NULL );
    SDL_Flip( ekran );
    SDL_Delay( 2000 );
    SDL_Quit();
    for (int i = 0; i < 100; i++) SDL_FreeSurface( texture[i] );
    return 0;
}
  1. Dlaczego on mi nie pokazuje obrazka background.bmp w oknie, a powinien?
  2. Czy dobrze zrobiłem "czyszczenie" tekstur?
0

Nie sprawdzasz czy plik *.bmp został załadowany poprawnie. Funkcja SDL_LoadBMP przy wystąpieniu błędu zwróci wartość NULL. Zaś SDL_BlitSurface nie wysypie programu gdy przekażemy tam wskaźnik o wartości NULL, czego efektem będzie brak narysowanego obrazka na ekranie. Dodaj warunek sprawdzający czy stało się o co ci chodziło.

W zasadzie nic nie sprawdzasz. Z góry zakładasz, że inicjalizacja SDL przebiega pomyślnie, funkcja ładująca plik robi to czego oczekujesz, a potem pytasz dlaczego mi nie działa... Poczytaj w dokumentacji o funkcjach, których używasz to będziesz wiedział czy dobrze robisz.

0
#include <iostream>
#include <SDL/SDL.h>
SDL_Surface * ekran = NULL;
SDL_Surface * texture[100];

int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 800, 450, 32, SDL_SWSURFACE );
    texture[0] = SDL_LoadBMP( "/data/background.bmp" );
    if (texture[0] == NULL) std::cout << "Mam problem\n";
    SDL_BlitSurface( texture[0], NULL, ekran, NULL );
    SDL_Flip( ekran );
    SDL_Delay( 2000 );
    SDL_Quit();
    for (int i = 0; i < 100; i++) SDL_FreeSurface( texture[i] );
    return 0;
}

No i textrue nie jest równe NULL

1

na pewno masz ten plik w GLOWNYM katalogu - > data ? :)

0

O ja pie.. Dzięki wielkie ale mi wydawało się, że to jednak powinno być w bin/debug/ D:

I kolejny problem. Kod uległ zmianie:

#include <windows.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

SDL_Surface * screen = NULL;
SDL_Surface * texture[100];
SDL_Event event;

int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    screen = SDL_SetVideoMode( 800, 450, 32, SDL_SWSURFACE );
    SDL_WM_SetCaption( "2dWar Alpha", NULL );
    texture[0] = IMG_Load( "/data/background.bmp" );
    while(1)
    {
        SDL_PollEvent( &event );
        if( event.type == SDL_QUIT ) break;
        SDL_BlitSurface( texture[0], NULL, screen, NULL );
        SDL_Flip( screen );
    }
    SDL_Quit();
    for (int i = 0; i < 100; i++) SDL_FreeSurface( texture[i] );
    return 0;
}

W linkerze mam:
-lSDL -lopengl32 -lglu32 -lSDL_image

Ale i tak przy próbie odpalenia kodu mam:
undefined reference to IMG_Load'`

Ktoś wie co może być nie tak?

0

Dalej czytasz z katalogu głównego systemu, a tam katalogu data prawie na pewno nie ma (a co miałby tam robić plik bmp naprawdę nie wiem). Jak w katalogu z programem/projektem masz katalog data i tam ten plik, to wtedy powinno być texture[0] = IMG_Load( "data/background.bmp" ); Generalnie / na początku ścieżki oznacza tzw roota czyli miejsce gdzie są np katalogi home, media,czy etc. No chyba że masz Windowsa a nie system x-owy, wtedy sam nie wiem skąd to próbujesz czytać.

edit: coby nie było wątpliwości twój sposób pod Windowsem wyglądał by mniej więcej tak texture[0] = IMG_Load( "C:\data\background.bmp"); Zamiast c: możesz naturalnie wstawić dowolny inny dysk/napęd. A tobie chodzi chyba o coś innego.

0

Tak windowsa. Z czytaniem już sobie poradziłem... Chodzi mi teraz tylko o to, że przy img_load mam undefinde reference chociaż jest zalinkowany lib

0

Dlaczego nie SDL_LoadBMP? A ścieżkę masz dalej złą, usuń wreszcie / z początku.

edit: u mnie działa texture[0] = SDL_LoadBMP( "data/background.bmp" ) Ale ja spod Linuksa.

edit2: w Windowsie stosuje się \ a nie /, być może tu jest twój problem.

0

MÓWIĘ PO RAZ 3, ŻE Z WYŚWIETLANIEM JUŻ SOBIE PORADZIŁEM!

IMG_load ponieważ to obsługuje więcej typów plików. Problem mój jest taki, że pomimo dodania .h i lib'a sdl_image mam undefinde reference

P.S.
W windowsie nie robi to różnicy czy jest \ czy /, a nawet lepiej użyć /, ponieważ to podejdzie też pod linuksa oraz nie będą się "używały funkcje" typu \n

0

U mnie ten

//#include <windows.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

SDL_Surface * screen = NULL;
SDL_Surface * texture[100];
SDL_Event event;

int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    screen = SDL_SetVideoMode( 800, 450, 32, SDL_SWSURFACE );
    SDL_WM_SetCaption( "2dWar Alpha", NULL );
    texture[0] = IMG_Load("data/background.bmp");
    while(1)
    {
        SDL_PollEvent( &event );
        if( event.type == SDL_QUIT ) break;
        SDL_BlitSurface( texture[0], NULL, screen, NULL );
        SDL_Flip( screen );
    }
    SDL_Quit();
    for (int i = 0; i < 100; i++) SDL_FreeSurface( texture[i] );
    return 0;
}

 

W linkerze ``sdl-config --libs -lSDL_image pod code::blocks (dałem typ projektu sdl, -lSDL_image musiałem dodać ręcznie) i się bez problemu uruchamia.

0

No właśnie mi się też powinien, a nie uruchamia... Zrobię nowy projekt dodam ten kod i sprawdzę

@Edit:
Utworzyłem nowy projekt i nadal to samo

0

Hm a próbowałeś inny plik? być może SDL ma jakieś ograniczenia w tym zakresie, spróbuj na malutkim o ile ten jest duży.

0

a dll do projektu dodałeś? (tzn w katalogu czy dałeś dllke)

0

Mam ją w system32.

0
fasadin napisał(a):

a dll do projektu dodałeś? (tzn w katalogu czy dałeś dllke)

Ja nic takiego nie musiałem robić, starczyło dopisać do linkera -lSDL_image. No chyba że to od systemu/IDE zależy. W każdym razie g++ main.cpp -o test sdl-config --libs -lSDL_image z konsoli też przeszło bez problemu

0

To znowu ja, właśnie doczytałem że pod Windowsem jednak trzeba.

0

Nagle działa... dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1