Palaan taas tähän ongelmaan, edellinen aihe ehti mennä jo liian vanhaksi.
Ongelmana on edelleen SDL_gfx:n toimivuus, sillä joka kerta kun teen ohjelman joka käyttää SDL_gfx:n funktioita, ohjelman käynnistyessä tulee heti herja ("Sovelluksen alustus epäonnistui (0xc0150002)."), ja Dev-C++:n debuggeri kertoo "An access violation (segmentation fault) raised in your program". Asensin SDL_gfx:n DevPakin kautta, joten kirjastoissa ei pitäisi olla vikaa. Kun kommentoin kaikki SDL_gfx:n funktiot, ohjelma toimii.
Teen näitä asioita Windows XP:llä, ja Ubuntu Linuxilla, ja jälkimmäisellä tätä koko ongelmaa ei ilmene ollenkaan. Kuitenkin samalla koodilla ohjelman suorittaminen ei sitten onnistu Windowsilla. En yhtään ymmärrä missä voisi olla minkäänsorttista muistin väärinkäyttöä, vai onko Linux niin anteeksiantavainen järjestelmä ettei se tälläistä huomioi?
Tässä on koodi jolla suoritan nyt SDL_rotozoomSurfacea:
void Player::Show(SDL_Surface *screen) { //luodaan tilapäinen pinta ja laitetaan siihen käännetty pelaajan kuva SDL_Surface *temp = rotozoomSurface(image, angle, 1, 1); //piirretään tilapäinen pinta ruudulle Draw(temp, screen, (int)x, (int)y); //vapautus SDL_FreeSurface(temp); temp = NULL; //imagen muistia ei vapauteta nyt, koska se vapautetaan myöhemmin }
Edellisestä keskustelusta jäi sellainen kuva, ettet ehkä debuggaa ohjelmaasi oikein. Millä tavalla olet nyt havainnut, että se "toimii" ilman rotozoomia? Näkyvätkö kääntämättömät kuvat, onko ohjelma periaatteessa käytettävissä?
viimeksi erakko- kirjoitti:
Tuon rivin kommentoin ja nyt ohjelma vain välähti. Tästä siis luulisin johtuvan...
Tämä ainakaan ei kuulosta minusta edes "toimivalta" ohjelmalta.
Kokeilepa vaikka korvata rotozoom-kutsut tällaisella:
SDL_Surface *rotozoomSurface_dbg(SDL_Surface *src, double a, double z, int s) { SDL_Surface *r; /* debug-viesti: kerrotaan, millä parametreilla kutsuttiin */ printf("rotozoomSurface_dbg(%p, %f, %f, %d)\n", (void*) src, a, z, s); /* luodaan 32-bittinen RGB-pinta ja kopioidaan kuva */ r = SDL_CreateRGBSurface(0, src->w, src->h, 32, 0xff, 0xff00, 0xff0000, 0); SDL_BlitSurface(src, 0, r, 0); return r; }
Jos käytät muita SDL_gfx:n funktioita, tee myös niistä vastaavat versiot. Jos ohjelma ei toimi vieläkään, vika on jossain muualla.
Kiitos! Tuo auttoi. Hyvä että sai vihdoinkin tämän ratkaistua.
Voisitko vielä tarkentaa, millä tavalla tämä auttoi, jotta joku myöhempi ongelmanentsijä voisi ymmärtää asian?
Ääh, olinpas tyhmä. Ei se tietenkään auttanut. Luulin vain että kun ohjelma käynnistyi oikein niin tämä jotenkin auttoi, mutta sitten huomasin että eihän tämä nyt siis mitään kuvia käännä. Eli nyt ohjelma siis toimii tuon kanssa, mutta missäänhän ei selvästikkään käännetä kuvaa. Ja kun yritetään kutsua ihan rotozoomSurfacea, ei koko ohjelma toimi.
Tälläistä tulostusta sain printfin kautta: "rotozoomSurface_dpg(009F6AC0, 90.000000, 1.000000, 1)", jos siitä kukaan saa mitään erikoista irti.
Et ilmeisesti oivaltanut tämän debuggausmenetelmän ideaa? Tarkoituksena on siis juurikin todeta (tässä tapauksessa), että ohjelma nyt toimii ja että vika on varmemmin rotozoomSurface-funktiossa eikä omassa koodissasi.
Seuraava kokeiltava asia voisi olla kyseisen funktion kopioiminen SDL_gfx:n lähdekoodista (.c-tiedostoista) suoraan ohjelmaasi.
Voisit myös kokeilla käyttää ohjelmointiputkan oppaan valmiiksi käännettyä versiota: SDL_gfx.lib. Itselläni se on pelittänyt ongelmitta winXP + Dev-cpp(mingw) yhdistelmällä.
Edit: pistetään nyt vielä ohjelma, jolla voit testata toimintaa. Tämä siis on testattu toimivaksi.
#include <iostream> #include <cstdlib> #include <SDL/SDL.h> #include <SDL/SDL_rotozoom.h> using namespace std; int main(int a, char** b) { SDL_Init(SDL_INIT_VIDEO); SDL_Surface* screen = SDL_SetVideoMode(800, 600, 32, SDL_DOUBLEBUF); SDL_Surface* picture = SDL_LoadBMP("pic.bmp"); if(!picture) { cerr << "Tee se pic.bmp!" << endl; return EXIT_FAILURE; } SDL_Surface* rotated = rotozoomSurface(picture, 120, 1, 0); SDL_FillRect(screen, NULL, 0); SDL_BlitSurface(rotated, NULL, screen, NULL); SDL_Flip(screen); SDL_Delay(1000); SDL_FreeSurface(picture); SDL_FreeSurface(rotated); SDL_Quit(); return EXIT_SUCCESS; }
Ei, ei toiminut. Muistaakseni olen tuota SDL_gfx.lib tiedostoa koittanut, ja kokeilin nyt äskenkin.
Ei toiminut myöskään kun kopioin kyseisen funktion lähdekoodista (jep, .c-tiedostosta).
Itse epäilisin että nyt on jotain vikaa asennuksessa tai siitä miten asensin.
Eräs aiempi keskustelu, jossa SDL_gfx aiheutti ongelmia, päättyi siihen, että kysyjä asensi ilmeisesti kääntäjän kaikkine kirjastoineen uudestaan. Se lienee ainakin kokeilemisen arvoinen vaihtoehto. (Samalla voi harkita siirtymistä esimerkiksi Code::Blocksin käyttäjäksi, kun Dev-C++ on kuollut jo aika kauan sitten.)
Noniin, nyt alkoi toimia. Yhtenä päivänä olin paininut tämän ongelman kanssa, ja etsiskellyt SDL_gfx:n tiedostoja. Nyt huomasin, että Dev-C++:an juurikansiossa oli jotain ylimääräistä, ja nämä olivat nähtävästi jostain aiemmin hankkimastani SDL_gfx-kansiosta, ja jostain päähäni pälkähti tutkia jo bin-kansiossa olevan SDL_gfx.dll tiedoston kokoa ja tämä toisessa kansiossa olevan SDL_gfx.dll tiedoston kokoa. Ja niiden ero olikin huima, nykyinen oli 13 Kt, ja korvasin tämä 80 Kt tiedostolla. Ja nyt toimii.
Aihe on jo aika vanha, joten et voi enää vastata siihen.