Autor Wątek: SDL-surfejsy  (Przeczytany 2253 razy)

Offline MofC

  • Użytkownik

# Grudzień 21, 2010, 15:43:10
Mam problem z SDL, robie coś takiego :

//Skrócona wersja kodu

        SDL_Rect dest;

        SDL_Surface* tekstury[10]; 
SDL_Surface* mapa;             
        SDL_Surface* kafelki[20][20];

        tekstury[1]=SDL_LoadBMP("grafika/mapa/woda.bmp");
        //Dalej uzupełniam tablice róznym obrazkami
       
 
        kafelki[2][2]=tekstury[1]; // kopiuje wskaźnik do indeksu kafelka

        dest.x=1; //Przykładowa pozycja
        dest.y=1;


SDL_BlitSurface(kafelki[1][1],NULL,mapa,&dest); //I "układam" na powierzchni mapa obrazki...

i wywala błąd przy próbie wywołania funkcji SDL_BlitSurface()
Unhandled exception at 0x68128c2c in Three Kingdoms.exe: 0xC0000005: Access violation reading location 0xccccccf8.
Jeśli to wam nic nie mówi to mogę przesłać większy kawałek kodu
Proszę o pomoc

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Lerhes

  • Użytkownik

# Grudzień 21, 2010, 15:55:24
Trochę jednak mało napisałeś, generalnie, to czy nie możesz po prostu oblookać debuggerem gdzie coś się nie wczytało? Najpierw narysuj po kolei tekstury, bo mogą się niepoprawnie wczytywać (zła ścieżka itp).

Ale odpowiedź udzielę ci taką, patrząc na kod ( tekstury[1]=SDL_LoadBMP("grafika/mapa/woda.bmp"); ) i na sposób w jaki zapisujesz do tablicy... to .. wydaje mi się, że źle indeksujesz tablice. W C++ indeksujemy od zera.   
tekstury[0]=SDL_LoadBMP("grafika/mapa/woda.bmp");
kafelki[0][0]=tekstury[0];
Czyli patrząc na twój kod, nie ma elementu tekstury[10].

Wydaje mi się że przy wyświetlaniu zrobiłeś pętlę:

for(int i = 1 ; i <= 10; i++)
for(int j = 1; j <= 10; j++)
SDL_BlitSurface(kafelki[i][j],NULL,mapa,&dest);
 
i się posypało, powinno być oczywiście:
for(int i = 0 ; i < 10; i++) itd...

Wklej więcej kodu, albo najlepiej daj linka do spakowanego projektu, bo z tego co napisałeś to jak wróżenie z fusów.

Lerhes

Offline MofC

  • Użytkownik

# Grudzień 21, 2010, 16:10:59
Plik mapsvc.h
class map
{
public:
int ax,ay;
int x,y;

SDL_Rect dest;

SDL_Surface* tekstury[10];
SDL_Surface* mapa;



SDL_Surface* kafelki[20][20];

void DrawMap();
void TekstureLoad();
void DataLoad();
void DrawGrid(int ilosclinix,int iloscliniy);
void ShowMap(SDL_Surface *main_surface);

map (int x,int y);
~map();


};

Plik mapsvc.cpp
#include<iostream>
#include<SDL.h>
#include"mapservice.h"

map::map(int b,int n)
{
x=b;
y=n;
ax=0;
ay=0;

}

map::~map()
{
SDL_FreeSurface(tekstury[0]);
SDL_FreeSurface(tekstury[1]);
SDL_FreeSurface(tekstury[2]);
SDL_FreeSurface(tekstury[3]);
SDL_FreeSurface(tekstury[4]);
SDL_FreeSurface(tekstury[5]);
SDL_FreeSurface(tekstury[6]);
SDL_FreeSurface(tekstury[7]);
SDL_FreeSurface(tekstury[8]);
SDL_FreeSurface(tekstury[9]);

}
void map::TekstureLoad()
{
tekstury[0]=SDL_LoadBMP("grafika/mapa/woda.bmp");
tekstury[1]=SDL_LoadBMP("grafika/mapa/trawa.bmp");
tekstury[2]=SDL_LoadBMP("grafika/mapa/brzeg1.bmp");
tekstury[3]=SDL_LoadBMP("grafika/mapa/brzeg2.bmp");
tekstury[4]=SDL_LoadBMP("grafika/mapa/brzeg3.bmp");
tekstury[5]=SDL_LoadBMP("grafika/mapa/brzeg4.bmp");
tekstury[6]=SDL_LoadBMP("grafika/mapa/naroznik1.bmp");
tekstury[7]=SDL_LoadBMP("grafika/mapa/naroznik2.bmp");
tekstury[8]=SDL_LoadBMP("grafika/mapa/naroznik3.bmp");
tekstury[9]=SDL_LoadBMP("grafika/mapa/naroznik4.bmp");
if (!tekstury[10]) std::cout<<"Error";

}
void map::DataLoad()
{

for (int i=0; i<x; i++)
{
for (int j=0; j<y; j++)
{
kafelki[i][j]=SDL_LoadBMP("grafika/mapa/woda.bmp");
}

}


for (int i=4; i<x-3; i++)
{
for (int j=3; j<y-5; j++)
{
kafelki[i][j]=SDL_LoadBMP("grafika/mapa/trawa.bmp");;
}

}

for (int i=5; i<9; i++) kafelki[i][3]=SDL_LoadBMP("grafika/mapa/brzeg2.bmp");
for (int i=5; i<9; i++) kafelki[i][7]=SDL_LoadBMP("grafika/mapa/brzeg2.bmp");

for (int i=4; i<7; i++) kafelki[4][i]=SDL_LoadBMP("grafika/mapa/brzeg2.bmp");
for (int i=4; i<7; i++) kafelki[9][i]=SDL_LoadBMP("grafika/mapa/brzeg2.bmp");


kafelki[4][3]=SDL_LoadBMP("grafika/mapa/woda.bmp");
kafelki[9][3]=SDL_LoadBMP("grafika/mapa/naroznik3.bmp");
kafelki[9][7]=SDL_LoadBMP("grafika/mapa/naroznik3.bmp");
kafelki[4][7]=SDL_LoadBMP("grafika/mapa/naroznik3.bmp");

}

void map::DrawMap()
{
for (int i=0; i<10; i++)
{
for (int j=0; j<y; j++)
{
dest.x=(i*64)-(ax*3);
dest.y=(j*48)-(ay*2);


SDL_BlitSurface(kafelki[i][j],NULL,mapa,&dest);

}

}
}

void map::ShowMap(SDL_Surface *main_surface)
{
dest.x=0;
dest.y=0;

SDL_BlitSurface(mapa,NULL,main_surface,&dest);

}


i w pliku main.cpp (fragment)
while(timer.getLaps() >= 1)
{


ludek.Control(zdarzenie);

//if (ludek.retposx() < 320) {wyspa.ax=wyspa.ax-1;ludek.position_x=ludek.position_x+3;}
//if (ludek.retposx() > 448) {wyspa.ax=wyspa.ax+1;ludek.position_x=ludek.position_x-3;}
//if (ludek.retposy() < 240) {wyspa.ay=wyspa.ay-1;ludek.position_y=ludek.position_y+2;}
//if (ludek.retposy() > 336) {wyspa.ay=wyspa.ay+1;ludek.position_y=ludek.position_y-2;}






}
SDL_FillRect(ekran, &rect_all, SDL_MapRGB(ekran->format, 100,100,100));
wyspa.DrawMap();
wyspa.ShowMap(ekran);

    ludek.UnitDraw(ekran);
SDL_Flip(ekran);

}


« Ostatnia zmiana: Grudzień 21, 2010, 17:14:28 wysłana przez MofC »

Offline Karol

  • Użytkownik

# Grudzień 21, 2010, 16:22:24
Czyli jest dokładnie tak jak Lerhes napisał, nie musiałeś wklejać tego kodu już, wystarczyło zastosować się do jego sugestii - czyżbyś przeczytał tylko pierwszy akapit jego odpowiedzi?

Offline MofC

  • Użytkownik

# Grudzień 21, 2010, 17:18:58
Poprawiłem to indeksowanie ale błąd jest nadal, nawet jak napisze
SDL_BlitSurface(kafelki[4][3],NULL,mapa,&dest);  w miejscu gdzie wywala błąd.

Offline ismu

  • Użytkownik

# Grudzień 21, 2010, 17:42:24
Spróbuj użyć '\\' przy wczytywaniu tekstur np. tekstury[0]=SDL_LoadBMP("grafika\\mapa\\woda.bmp");
« Ostatnia zmiana: Grudzień 21, 2010, 18:11:07 wysłana przez ismu »

Offline hfjh

  • Użytkownik

# Grudzień 21, 2010, 17:56:20
@up: nie te slashe ;)

Offline Lerhes

  • Użytkownik

# Grudzień 21, 2010, 17:59:10
Weź wrzuć paczkę z kodem i grafikami na jakiś warez, bo naprawdę tak będzie mi szybciej. Tylko odpalę, postawie dwa brakepointy, i już będzie wszystko wiadomo. W sumie to Ty powinieneś to zrobić, ale cóż...

Widzę, że na raty poprawiasz ten kod który wkleiłeś. No teraz wygląda lepiej i nie widać w nim jakichś rażących błędów. Ale to nie znaczy że ich tam nie ma... Nie wkleiłeś wszystkiego, to część rzeczy pozostaje tajemnicą, na przykład jakimi parametrami inicjalizujesz obiekt map.

Generalnie, skoro nie wiesz jak indeksuje się tablice w C++, to tym bardziej nie wiesz co to debugger, prawda?
Przed wykonaniem tej linijki, najlepiej postawić sobie break pointa i sprawdzić co jest tak naprawdę w kafelki i co w dest.
SDL_BlitSurface(kafelki[4][3],NULL,mapa,&dest);Nie jest to problem z dest, bo nawet jak źle go obliczysz, to po prostu dostaniesz czarny ekran. Ale na 90% jest to problem z twoimi grafikami. Jak się je źle wczyta, to potem od razu jest error. Po prostu w kafelki[4][3] nie masz wcale zaczytanego obrazu, tylko śmieci:

Ale w sumie nawet jak są śmieci to powinno działać, ale już wiem. Wróżka mi powiedziała, że chyba brakuje Ci gdzieś utworzenia obiektu mapa. Czyżbyś w klasie map, nie miał wskaźnika do mapa? A gdzie go sobie tworzysz? Brakuje Ci w konstruktorze:
map::map(int b,int n,SDL_Surface *main_surface)
{
x=b;
y=n;
ax=0;
ay=0;
mapa =  SDL_ConvertSurface(main_surface, main_surface->format, main_surface->flags);
SDL_FillRect(mapa,NULL,0);
}

Lerhes
« Ostatnia zmiana: Grudzień 21, 2010, 18:01:26 wysłana przez Lerhes »

Offline cybek

  • Użytkownik
    • Strona domowa!

# Grudzień 21, 2010, 20:31:50
tekstury[0]=SDL_LoadBMP("grafika/mapa/woda.bmp");
tekstury[1]=SDL_LoadBMP("grafika/mapa/trawa.bmp");
tekstury[2]=SDL_LoadBMP("grafika/mapa/brzeg1.bmp");
tekstury[3]=SDL_LoadBMP("grafika/mapa/brzeg2.bmp");
tekstury[4]=SDL_LoadBMP("grafika/mapa/brzeg3.bmp");
tekstury[5]=SDL_LoadBMP("grafika/mapa/brzeg4.bmp");
tekstury[6]=SDL_LoadBMP("grafika/mapa/naroznik1.bmp");
tekstury[7]=SDL_LoadBMP("grafika/mapa/naroznik2.bmp");
tekstury[8]=SDL_LoadBMP("grafika/mapa/naroznik3.bmp");
tekstury[9]=SDL_LoadBMP("grafika/mapa/naroznik4.bmp");
if (!tekstury[10]) std::cout<<"Error";
Ten if jest straszne słodki <3 Lubię go :D

Offline MofC

  • Użytkownik

# Grudzień 21, 2010, 21:30:40
Wysłałem Ci Lerhes na PW link do całego projektu

Offline Lerhes

  • Użytkownik

# Grudzień 22, 2010, 00:51:53
Dostałem twój kod, zmieniłem to co ci napisałem w poście... działa płynnie... mogłeś już przeczytać do końca co napisałem i skopiować do swojego kodu...

Edit: Odesłałem Ci troszkę poprawiony kod.

Lerhes
« Ostatnia zmiana: Grudzień 22, 2010, 11:47:16 wysłana przez Lerhes »