Olen vasta aloittelija SDL:n käytössä ja koetin kokeilla miten minulta onnistuu tehdä pieni pelipohja jossa ukkoa voi liikuttaa ja se kulkee siihen suuntaan joka sen kulma on.
Nyt kuitenkin debuggeri rääkyy Access Violationista. En itse osaa tätä korjata. Tiedän vain että se meinaa muistivuotoa.
Ja kielihän on C++ ja kääntäjänä toimii Dev-C++ (jos tuolla tiedolla jotain tekee)
#include <iostream> #include <math.h> #include <SDL/SDL.h> #include <SDL/SDL_rotozoom.h> void DrawImage(SDL_Surface *kuva, SDL_Surface *naytto, double x, double y) { int nx,ny; nx=(int)x; ny=(int)y; //mihin näytöllä SDL_Rect alue; alue.x = nx; alue.y = ny; //näytölle SDL_BlitSurface(kuva, NULL, naytto, &alue); SDL_FreeSurface(kuva); } int main(int argc, char* argv[]){ int angle; double x,y; SDL_Surface *ukko[360]; ukko[0]=SDL_LoadBMP("ukko.bmp"); SDL_SetColorKey(ukko[0], SDL_SRCCOLORKEY, SDL_MapRGB(ukko[0]->format,0,0,0)); int i; for(i=1; i <= 359; i++){ ukko[i]=rotozoomSurface(ukko[0], i, 1, 2); } SDL_Surface *naytto; SDL_Init(SDL_INIT_VIDEO); naytto = SDL_SetVideoMode (800,600,32,SDL_FULLSCREEN|SDL_HWSURFACE|SDL_DOUBLEBUF); while(1){ SDL_Event tapahtuma; while(SDL_PollEvent(&tapahtuma)){ switch(tapahtuma.type){ case SDLK_UP: x=x+cos(angle)*2; y=y-sin(angle)*2; break; case SDLK_DOWN: x=x+cos(angle+180)*2; y=y-sin(angle+180)*2; break; case SDLK_LEFT: angle-=5; break; case SDLK_RIGHT: angle+=5; break; } } DrawImage(ukko[angle],naytto,x,y); SDL_Flip(naytto); } SDL_Quit(); return 1; }
Auttaisi jos kertoisit millä rivillä tuo oikeusvirhe tulee. Pikavilkaisulla nyt ainakin kannattaa siirtää SDL_Init() siten että se on ennen kuin mitään SDL:n funktiota kutsutaan (käytät esim. SDL_SetColorCeytä ennen sitä).
Tarkista myös että angle pysyy aina hyväksyttävien rajojen sisällä.
DrawImage() vapauttaa joka kerta ton pinnan, jota mun tietääkseni ei voi tehä.
Korjailin koodia ohjeiden mukaan ja nyt se jopa saa SDL:n ikkunan auki, mutta kaatuu sitten.
#include <iostream> #include <math.h> #include <SDL/SDL.h> #include <SDL/SDL_rotozoom.h> using namespace std; void DrawImage(SDL_Surface *kuva, SDL_Surface *naytto, double x, double y); int main(int argc, char* argv[]){ int angle; double x,y; SDL_Init(SDL_INIT_VIDEO); SDL_Surface *naytto; naytto = SDL_SetVideoMode (800,600,32,SDL_HWSURFACE|SDL_DOUBLEBUF); SDL_Surface *ukko[360]; ukko[0]=SDL_LoadBMP("ukko.bmp"); SDL_SetColorKey(ukko[0], SDL_SRCCOLORKEY, SDL_MapRGB(ukko[0]->format,0,0,0)); int i; for(i=1; i <= 359; i++){ ukko[i]=rotozoomSurface(ukko[0], i, 1, 2); } while(1){ SDL_Event tapahtuma; while(SDL_PollEvent(&tapahtuma)){ switch(tapahtuma.type){ case SDLK_UP: x=x+cos(angle)*2; y=y-sin(angle)*2; break; case SDLK_DOWN: x=x+cos(angle+180)*2; y=y-sin(angle+180)*2; break; case SDLK_LEFT: angle-=5; break; case SDLK_RIGHT: angle+=5; break; } } DrawImage(ukko[angle],naytto,x,y); SDL_Flip(naytto); } SDL_Quit(); return 1; } void DrawImage(SDL_Surface *kuva, SDL_Surface *naytto, double x, double y) { int nx,ny; nx=(int)x; ny=(int)y; SDL_Rect alue; alue.x = nx; alue.y = ny; SDL_BlitSurface(kuva, NULL, naytto, &alue); }
Kokeileppas alustaa nuita muuttujia, esim. tuo angle-muuttuja.
C:ssä ja C++:ssa pitää aina muistaa alustaa muuttujat, muuten niiden arvo voi olla mikä tahansa.
Olenhan minä jo sen tehnyt. Tuolla on rivit
int angle;
double x,y;
Alustaa, toisin sanoen asettaa alkuarvot. Pidä huolta, että kulma pysyy välillä [0, 359], eli aina sen muuttuessa muista tarkistaa rajat ja lisätä tai vähentää tarvittaessa 360.
Toiseksikin lopussa, juuri ennen SDL_Quit-kutsua, pitäisi vapauttaa kaikki nuo kuvat, sekä alkuperäinen että pyöritetyt.
for (i = 0; i <= 359; ++i) SDL_FreeSurface(ukko[i]);
Aihe on jo aika vanha, joten et voi enää vastata siihen.