SDL nie ładuje i nie pokazuje pliku .bmp

Odpowiedz Nowy wątek
2012-11-21 13:14

Rejestracja: 7 lat temu

Ostatnio: 6 lat temu

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?

Programuję w: C#, C++, PHP, AutoIT, Python, Java
GG: 3027377

Pozostało 580 znaków

2012-11-21 13:19

Rejestracja: 7 lat temu

Ostatnio: 6 lat temu

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.

edytowany 1x, ostatnio: R3m4ke, 2012-11-21 13:29

Pozostało 580 znaków

2012-11-21 15:35

Rejestracja: 7 lat temu

Ostatnio: 6 lat temu

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


Programuję w: C#, C++, PHP, AutoIT, Python, Java
GG: 3027377

Pozostało 580 znaków

abec
2012-11-22 13:28
abec
1

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

Pozostało 580 znaków

2012-11-23 21:04

Rejestracja: 7 lat temu

Ostatnio: 6 lat temu

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 toIMG_Load'`

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


Programuję w: C#, C++, PHP, AutoIT, Python, Java
GG: 3027377

Pozostało 580 znaków

sig
2012-11-23 21:16
sig

Rejestracja: 8 lat temu

Ostatnio: 3 godziny temu

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.

edytowany 4x, ostatnio: sig, 2012-11-23 21:24

Pozostało 580 znaków

2012-11-23 21:19

Rejestracja: 7 lat temu

Ostatnio: 6 lat temu

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


Programuję w: C#, C++, PHP, AutoIT, Python, Java
GG: 3027377

Pozostało 580 znaków

sig
2012-11-23 21:30
sig

Rejestracja: 8 lat temu

Ostatnio: 3 godziny temu

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.

edytowany 2x, ostatnio: sig, 2012-11-23 21:37

Pozostało 580 znaków

2012-11-23 22:20

Rejestracja: 7 lat temu

Ostatnio: 6 lat temu

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


Programuję w: C#, C++, PHP, AutoIT, Python, Java
GG: 3027377
edytowany 1x, ostatnio: Heniut, 2012-11-23 22:22

Pozostało 580 znaków

sig
2012-11-24 08:48
sig

Rejestracja: 8 lat temu

Ostatnio: 3 godziny temu

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.

edytowany 2x, ostatnio: sig, 2012-11-24 08:51

Pozostało 580 znaków

2012-11-24 09:41

Rejestracja: 7 lat temu

Ostatnio: 6 lat temu

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


Programuję w: C#, C++, PHP, AutoIT, Python, Java
GG: 3027377
edytowany 1x, ostatnio: Heniut, 2012-11-24 09:50

Pozostało 580 znaków

Odpowiedz

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