Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Toinenkin Access Violation

temu92 [24.04.2006 18:48:08]

#

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;
}

Heikki [24.04.2006 18:55:21]

#

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ä.

Lumi-ukkeli [24.04.2006 19:04:50]

#

DrawImage() vapauttaa joka kerta ton pinnan, jota mun tietääkseni ei voi tehä.

temu92 [24.04.2006 19:08:46]

#

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);
}

Megant [24.04.2006 19:14:10]

#

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.

temu92 [24.04.2006 19:37:20]

#

Olenhan minä jo sen tehnyt. Tuolla on rivit

int angle;
double x,y;

Metabolix [24.04.2006 19:47:15]

#

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]);

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta