Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Peli kaatuu valikoissa

Sivun loppuun

mika132 [02.02.2011 18:06:14]

#

Eli tuli sellainen pikkuruinen ongelma, että pelini kaatuu kun valikossa mennään taakseppäin. Esimerkiksi huoneesta 11 huoneeseen 5 ja konsoliin palautuu arvo 3 eli jos oikein muistan windows erroreista "määrättyä polkua ei löydy" mihin ihmeeseen se hukkaa kuvia (tai näin ymmärtäisin) koska en vapauta niitä missään ennen kuin peli lopetetaan?

Onko jotain muita vinkkejä miksi tämä tapahtuisi? Taitaa olla turha laittaa koodia tähän, koska törkeän pitkä, mutta jos se vaaditaan niin voin sen laittaa myöhemmin.

ankzilla [02.02.2011 18:08:34]

#

Kristallipallo pitäs kiillottaa.

Jokotai [02.02.2011 18:43:37]

#

Minkälainen valikko? Mikä on huone? Mitä kuvia ja mistä? Millä toteutettu? Laitappas edes se kohta, jossa noita kuvia haetaan.

mika132 [02.02.2011 18:56:53]

#

No tästä tulee hieman pitkää tavaraa ja sekaista, muttamutta.

Kyseessä: C++
SDL_image kirjastoilla .png kuvia

Kuvat ladataan heti pelin alussa funktiossa "GameStart" jota tähän nyt on melko turha laittaa, koska se on vain funktio johon kirjotetaan polku ja läpinäkyvyys (true tai false)

Tässä "PeliAlkaa" funktio, jossa hypitään valikosta toiseen ja yhdessä vaiheessa kilpailuunkin:

void Game::PeliAlkaa(int rooms) {
    if (rooms == 1) {
        piirra_kuva(Photos::tausta, 0, 0, false);
        Valikko();
    }
    else if (rooms == 2) {
        Uint8* nappi;
        nappi = SDL_GetKeyState(NULL);
        piirra_kuva(Photos::tausta, 0, 0, false);
        piirra_kuva(Photos::car_2, 20,30, false);
        piirra_kuva(Photos::car_3, 20,60, false);
        piirra_kuva(Photos::car, 20,90, false);
        DrawText(Tekstit::text_44, 80,30);
        DrawText(Tekstit::text_45, 80,60);
        DrawText(Tekstit::text_46, 80,90);
        DrawText(Tekstit::text_47, 20,0);
        valinta = Mouse::ValikkoOhjaukset(valinta);
        if (valinta == 0) {
            SDL_Delay(200);
            valinta=1;
        }
        if (valinta == 1) {
            piirra_kuva(Photos::valitsija2, 10,28, false);
        }
        if (valinta == 2) {
            piirra_kuva(Photos::valitsija2, 10,55, false);
        }
        if (valinta >= 3) {
            piirra_kuva(Photos::valitsija2, 10,85, false);
        }
        if (painettu_pika_kisassa == true) {
            if(nappi[SDLK_RETURN]) {
                if (valinta==1) {
                    valittu_auto=1;
                    rooma=10;
                }
                if (valinta==2) {
                    valittu_auto=2;
                    rooma=10;
                }
                if (valinta==3) {
                    valittu_auto=3;
                    rooma=10;
                }
            }
        } else {
            SDL_Delay(200);
            painettu_pika_kisassa=true;
        }
    }
    else if (rooms == 3) {
        piirra_kuva(Photos::Kuva, 20,50, false);
        piirra_kuva(Photos::Kuva, 20,170, false);
        piirra_kuva(Photos::Kuva, 20,290, false);
        DrawText(Tekstit::text_4, 30,20);
        DrawText(Tekstit::text_5, 30,70);
        DrawText(Tekstit::text_6, 30,190);
        DrawText(Tekstit::text_7, 30,310);
        ValikkoEngine();
    }
    else if (rooms == 4) {
        piirra_kuva(Photos::Kuva, 20,50, false);
        piirra_kuva(Photos::Kuva, 20,170, false);
        piirra_kuva(Photos::Kuva, 20,290, false);
    }
    else if (rooms == 5) {
        Uint8* nappi;
        piirra_kuva(Photos::tausta, 0, 0, false);
        piirra_kuva(Photos::ura_valikko, 0,0, false);
        DrawText(Tekstit::text_8, 55,50);
        DrawText(Tekstit::text_9, 110,50);
        DrawText(Tekstit::text_10, 165,50);
        DrawText(Tekstit::text_11, 220,50);
        DrawText(Tekstit::text_12, 275,50);
        DrawText(Tekstit::text_13, 330,50);
        DrawText(Tekstit::text_14, 385,50);

        int valinta_mika = Mouse::UraValikkoOhjaukset(rooma);
        TextSomeNewColor(valinta_mika);
        Mouse::PiirraTekstit();

        SDL_GetMouseState(&x, &y);
        hiiri=SDL_GetMouseState(&x, &y);
        if(hiiri & SDL_BUTTON(1)) {
            rooma = Mouse::UraValikko(valinta_mika, rooma);
        }
    }
    else if (rooms == 6) {
        Uint8* nappi;
        nappi = SDL_GetKeyState(NULL);

        Photos::temp_oma = rotozoomSurface(Photos::car, rad2deg(auton_kulma_oma), 1, 1);
        piirra_kuva(Photos::tyhjenna, 0,0, false);
        piirra_kuva(Photos::track_1, 0,0, false);
        std::vector<Fysiikka::RenkasVana>::iterator vanaa = RenkasVanat.begin();
        while(vanaa != Game::RenkasVanat.end()){
            piirra_kuva(Photos::musta_tapla, vanaa->x, vanaa->y, true);
            vanaa++;
        }
        piirra_kuva(Photos::temp_oma, x_oma, y_oma, true);
        std::vector<Racer::RacersInRace>::iterator kisaa = RacerRace.begin();
        while(kisaa != Game::RacerRace.end()){
        if (jj == 1) {
            Photos::temp_racer[jj] = rotozoomSurface(Photos::car_2, rad2deg(kisaa->kulma), 1, 1);
        } else if (jj==0) {
            Photos::temp_racer[jj] = rotozoomSurface(Photos::car_3, rad2deg(kisaa->kulma), 1, 1);
        }
            piirra_kuva(Photos::temp_racer[jj], kisaa->x, kisaa->y, true);
            SDL_FreeSurface(Photos::temp_racer[jj]);
            jj++;
            if (jj >= 2) {
                jj=0;
            }
            kisaa++;
        }
        SDL_FreeSurface(Photos::temp_oma);
        if(nappi[SDLK_p]) {
            rooma=5;
        }
    }
    else if (rooms == 7) {
        int y_akselilla=200;
        int x_akseli=200;
        piirra_kuva(Photos::ura_valikko, 0,0, false);
        DrawText(Tekstit::text_8, 55,50);
        DrawText(Tekstit::text_9, 110,50);
        DrawText(Tekstit::text_10, 165,50);
        DrawText(Tekstit::text_11, 220,50);
        DrawText(Tekstit::text_12, 275,50);
        DrawText(Tekstit::text_13, 330,50);
        DrawText(Tekstit::text_14, 385,50);
        std::vector<Cars::OmatAutot>::iterator autoo = Autot.begin();
        while(autoo != Game::Autot.end()){
            if (autoo->omistaja == 1) {
                SDL_FreeSurface(Tekstit::text_23);
                SDL_FreeSurface(Tekstit::text_33);
                Tekstit::text_23 = Tekstit::LoadTextString("", true, autoo->malli, Fontit::font2, 255, 0, 0);
                Tekstit::text_33 = Tekstit::LoadText("", true, autoo->tehot, Fontit::font2, 255, 0, 0);
                DrawText(Tekstit::text_23, 20,y_akselilla);
                DrawText(Tekstit::text_33, 200,y_akselilla);
                y_akselilla+=20;
            }
            autoo++;
        }

        int valinta_mika = Mouse::UraValikkoOhjaukset(rooma);
        TextSomeNewColor(valinta_mika);

        Mouse::PiirraTekstit();

        SDL_GetMouseState(&x, &y);
        hiiri=SDL_GetMouseState(&x, &y);
        if(hiiri & SDL_BUTTON(1)) {
            rooma = Mouse::UraValikko(valinta_mika, rooma);
        }
        DrawText(Tekstit::text_20, 25,190);
    }
    else if (rooms == 8) {
        piirra_kuva(Photos::tyhjenna, 0,0, false);
        piirra_kuva(Photos::ura_valikko, 0,0, false);
        DrawText(Tekstit::text_8, 55,50);
        DrawText(Tekstit::text_9, 110,50);
        DrawText(Tekstit::text_10, 165,50);
        DrawText(Tekstit::text_11, 220,50);
        DrawText(Tekstit::text_12, 275,50);
        DrawText(Tekstit::text_13, 330,50);
        DrawText(Tekstit::text_14, 385,50);
        int y_akselilla=200;
        int valittava_kohde=1;
        Uint8* nappi;
        nappi = SDL_GetKeyState(NULL);
        SDL_GetMouseState(&mouse_x, &mouse_y);
        hiiri=SDL_GetMouseState(&mouse_x, &mouse_y);
        std::vector<Cars::KaikkiOsat>::iterator osaa = Osat.begin();
        while(osaa != Game::Osat.end()){
            SDL_FreeSurface(Tekstit::text_24);
            SDL_FreeSurface(Tekstit::text_25);
            SDL_FreeSurface(Tekstit::text_26);
            SDL_FreeSurface(Tekstit::text_27);
            SDL_FreeSurface(Tekstit::text_28);
            SDL_FreeSurface(Tekstit::text_29);
            SDL_FreeSurface(Tekstit::text_30);
            SDL_FreeSurface(Tekstit::text_31);
            SDL_FreeSurface(Tekstit::text_32);
            if (mouse_x >= 20 && mouse_x <= 400) {
                if (mouse_y >= y_akselilla && mouse_y <= y_akselilla + 18) {
                    Tekstit::text_24 = Tekstit::LoadTextString("", true, osaa->malli, Fontit::font2, 255, 255, 0);
                    Tekstit::text_25 = Tekstit::LoadText("", true, osaa->iskutilavuus, Fontit::font2, 255, 255, 0);
                    Tekstit::text_26 = Tekstit::LoadText("cm3", false, 1, Fontit::font2, 255, 255, 0);
                    Tekstit::text_27 = Tekstit::LoadText("", true, osaa->hinta, Fontit::font2, 255, 255, 0);
                    Tekstit::text_32 = Tekstit::LoadText("", true, osaa->hv, Fontit::font2, 255, 255, 0);
                    DrawText(Tekstit::text_24, 20,y_akselilla);
                    DrawText(Tekstit::text_25, 180,y_akselilla);
                    DrawText(Tekstit::text_26, 240,y_akselilla);
                    DrawText(Tekstit::text_27, 340,y_akselilla);
                    DrawText(Tekstit::text_32, 400,y_akselilla);
                    if(hiiri & SDL_BUTTON(1)) {
                        std::vector<Cars::OmatAutot>::iterator autoo = Autot.begin();
                        while(autoo != Game::Autot.end()){
                            if (Rahaa >= osaa->hinta) {
                                autoo->tehot = osaa->hv;
                                Rahaa-=osaa->hinta;
                            }
                            autoo++;
                        }
                    }
                } else {
                    Tekstit::text_24 = Tekstit::LoadTextString("", true, osaa->malli, Fontit::font2, 255, 0, 0);
                    Tekstit::text_25 = Tekstit::LoadText("", true, osaa->iskutilavuus, Fontit::font2, 255, 0, 0);
                    Tekstit::text_26 = Tekstit::LoadText("cm3", false, 1, Fontit::font2, 255, 0, 0);
                    Tekstit::text_27 = Tekstit::LoadText("", true, osaa->hinta, Fontit::font2, 255, 0, 0);
                    Tekstit::text_32 = Tekstit::LoadText("", true, osaa->hv, Fontit::font2, 255, 0, 0);
                    DrawText(Tekstit::text_24, 20,y_akselilla);
                    DrawText(Tekstit::text_25, 180,y_akselilla);
                    DrawText(Tekstit::text_26, 240,y_akselilla);
                    DrawText(Tekstit::text_27, 340,y_akselilla);
                    DrawText(Tekstit::text_32, 400,y_akselilla);
                }
            } else {
                Tekstit::text_24 = Tekstit::LoadTextString("", true, osaa->malli, Fontit::font2, 255, 0, 0);
                Tekstit::text_25 = Tekstit::LoadText("", true, osaa->iskutilavuus, Fontit::font2, 255, 0, 0);
                Tekstit::text_26 = Tekstit::LoadText("cm3", false, 1, Fontit::font2, 255, 0, 0);
                Tekstit::text_27 = Tekstit::LoadText("", true, osaa->hinta, Fontit::font2, 255, 0, 0);
                Tekstit::text_32 = Tekstit::LoadText("", true, osaa->hv, Fontit::font2, 255, 0, 0);
                DrawText(Tekstit::text_24, 20,y_akselilla);
                DrawText(Tekstit::text_25, 180,y_akselilla);
                DrawText(Tekstit::text_26, 240,y_akselilla);
                DrawText(Tekstit::text_27, 340,y_akselilla);
                DrawText(Tekstit::text_32, 400,y_akselilla);
            }


            Tekstit::text_28 = Tekstit::LoadText("Valmistaja", false, 1, Fontit::font2, 255, 0, 0);
            Tekstit::text_29 = Tekstit::LoadText("Iskutilavuus", false, 1, Fontit::font2, 255, 0, 0);
            Tekstit::text_30 = Tekstit::LoadText("Hinta", false, 1, Fontit::font2, 255, 0, 0);
            Tekstit::text_31 = Tekstit::LoadText("HV", false, 1, Fontit::font2, 255, 0, 0);
            DrawText(Tekstit::text_28, 20, 180);
            DrawText(Tekstit::text_29, 180, 180);
            DrawText(Tekstit::text_30, 340, 180);
            DrawText(Tekstit::text_31, 400, 180);

            y_akselilla+=20;
            valittava_kohde++;
            osaa++;
        }
        int valinta_mika = Mouse::UraValikkoOhjaukset(rooma);
        TextSomeNewColor(valinta_mika);

        Mouse::PiirraTekstit();
        if(hiiri & SDL_BUTTON(1)) {
            rooma = Mouse::UraValikko(valinta_mika, rooma);
        }
        DrawText(Tekstit::text_20, 25,190);
    } else if (rooms == 9) {

    } else if (rooms == 10) {

    } else if (rooms == 11) {
        SDL_FreeSurface(Tekstit::text_49);
        SDL_FreeSurface(Tekstit::text_51);
        Tekstit::text_49 = Tekstit::LoadText("notging", true, kierros, Fontit::font, 0, 0, 0);
        Tekstit::text_51 = Tekstit::LoadText("", true, seconds, Fontit::font, 0, 0, 0);
        Uint8* nappi;
        nappi = SDL_GetKeyState(NULL);
        if (valittu_auto == 1) {
            Photos::temp_oma = rotozoomSurface(Photos::car_2, rad2deg(auton_kulma_oma), 1, 1);
        }
        if (valittu_auto == 2) {
            Photos::temp_oma = rotozoomSurface(Photos::car_3, rad2deg(auton_kulma_oma), 1, 1);
        }
        if (valittu_auto == 3) {
            Photos::temp_oma = rotozoomSurface(Photos::car, rad2deg(auton_kulma_oma), 1, 1);
        }
        Photos::temp_nopeusmittari = rotozoomSurface(Photos::viisari, nopeus_mittarin_kulma, 1, 1);
        piirra_kuva(Photos::tyhjenna, 0,0, false);
        piirra_kuva(Photos::track_1, 0,0, false);
        DrawText(Tekstit::text_49, 45, 10);
        DrawText(Tekstit::text_50, 65, 10);
        DrawText(Tekstit::text_52, 0, 10);
        DrawText(Tekstit::text_53, 0, 30);
        DrawText(Tekstit::text_51, 100, 30);
        DrawText(Tekstit::text_54, 700, 30);
        DrawText(Tekstit::text_55, 700, 60);
        DrawText(Tekstit::text_56, 700, 90);
        DrawText(Tekstit::text_57, 700, 120);
        piirra_kuva(Photos::mittaristo, 0, 500, false);
        piirra_kuva(Photos::temp_nopeusmittari, 50, 560, true);

        std::vector<Fysiikka::RenkasVana>::iterator vanaa = RenkasVanat.begin();
        while(vanaa != Game::RenkasVanat.end()){
            piirra_kuva(Photos::musta_tapla, vanaa->x, vanaa->y, true);
            vanaa++;
        }
        piirra_kuva(Photos::temp_oma, x_oma, y_oma, true);
        std::vector<Racer::RacersInRace>::iterator kisaa = RacerRace.begin();
        while(kisaa != Game::RacerRace.end()){
            if (jj == 1) {
                Photos::temp_racer[jj] = rotozoomSurface(Photos::car_2, rad2deg(kisaa->kulma), 1, 1);
            } else if (jj==0) {
                Photos::temp_racer[jj] = rotozoomSurface(Photos::car_3, rad2deg(kisaa->kulma), 1, 1);
            }
            piirra_kuva(Photos::temp_racer[jj], kisaa->x, kisaa->y, true);
            SDL_FreeSurface(Photos::temp_racer[jj]);
            jj++;
            if (jj >= 2) {
                jj=0;
            }
            kisaa++;
        }
        SDL_FreeSurface(Photos::temp_oma);
        SDL_FreeSurface(Photos::temp_nopeusmittari);
    }
    else if (rooms == 12) {
        piirra_kuva(Photos::ura_valikko, 0,0, false);
        DrawText(Tekstit::text_8, 55,50);
        DrawText(Tekstit::text_9, 110,50);
        DrawText(Tekstit::text_10, 165,50);
        DrawText(Tekstit::text_11, 220,50);
        DrawText(Tekstit::text_12, 275,50);
        DrawText(Tekstit::text_13, 330,50);
        DrawText(Tekstit::text_14, 385,50);

        int valinta_mika = Mouse::UraValikkoOhjaukset(rooma);
        TextSomeNewColor(valinta_mika);

        Mouse::PiirraTekstit();

        SDL_GetMouseState(&x, &y);
        hiiri=SDL_GetMouseState(&x, &y);
        if(hiiri & SDL_BUTTON(1)) {
            rooma = Mouse::UraValikko(valinta_mika, rooma);
        }
        DrawText(Tekstit::text_20, 25,190);
        DrawText(Tekstit::text_48, 25,190);
    }
    else if (rooms == 13) {
        piirra_kuva(Photos::tyhjenna, 0,0, false);
        piirra_kuva(Photos::ura_valikko, 0,0, false);
        DrawText(Tekstit::text_8, 55,50);
        DrawText(Tekstit::text_9, 110,50);
        DrawText(Tekstit::text_10, 165,50);
        DrawText(Tekstit::text_11, 220,50);
        DrawText(Tekstit::text_12, 275,50);
        DrawText(Tekstit::text_13, 330,50);
        DrawText(Tekstit::text_14, 385,50);
        int y_akselilla=200;
        int valittava_kohde=1;
        Uint8* nappi;
        nappi = SDL_GetKeyState(NULL);
        SDL_GetMouseState(&mouse_x, &mouse_y);
        hiiri=SDL_GetMouseState(&mouse_x, &mouse_y);
        std::vector<Racer::AllRacers>::iterator kuskii = Kuskit.begin();

        while(kuskii != Game::Kuskit.end()) {
            SDL_FreeSurface(Tekstit::text_24);
            SDL_FreeSurface(Tekstit::text_25);
            SDL_FreeSurface(Tekstit::text_27);
            SDL_FreeSurface(Tekstit::text_28);
            SDL_FreeSurface(Tekstit::text_29);
            SDL_FreeSurface(Tekstit::text_30);
            int jako_tulos=kuskii->Ajotaito / 10;
            int Ajotaidot = jako_tulos * 3;

            int jako_tulos2=kuskii->Hermot / 10;
            int Hermott = jako_tulos2 * 5;
            if (mouse_y >= y_akselilla && mouse_y <= y_akselilla + 18) {
                Tekstit::text_24 = Tekstit::LoadTextString("", true, kuskii->nimi, Fontit::font2, 255, 255, 0);
                Tekstit::text_25 = Tekstit::LoadText("", true, Ajotaidot, Fontit::font2, 255, 255, 0);
                Tekstit::text_27 = Tekstit::LoadText("", true, Hermott, Fontit::font2, 255, 255, 0);
                DrawText(Tekstit::text_24, 30,y_akselilla);
                DrawText(Tekstit::text_25, 190,y_akselilla);
                DrawText(Tekstit::text_27, 350,y_akselilla);
            } else {
                Tekstit::text_24 = Tekstit::LoadTextString("", true, kuskii->nimi, Fontit::font2, 0, 0, 0);
                Tekstit::text_25 = Tekstit::LoadText("", true, Ajotaidot, Fontit::font2, 0, 0, 0);
                Tekstit::text_27 = Tekstit::LoadText("", true, Hermott, Fontit::font2, 0, 0, 0);
                DrawText(Tekstit::text_24, 30,y_akselilla);
                DrawText(Tekstit::text_25, 190,y_akselilla);
                DrawText(Tekstit::text_27, 350,y_akselilla);
            }

            Tekstit::text_28 = Tekstit::LoadText("Nimi", false, 1, Fontit::font2, 0, 0, 0);
            Tekstit::text_29 = Tekstit::LoadText("Ajotaito", false, 1, Fontit::font2, 0, 0, 0);
            Tekstit::text_30 = Tekstit::LoadText("Hermot", false, 1, Fontit::font2, 0, 0, 0);
            DrawText(Tekstit::text_28, 30, 180);
            DrawText(Tekstit::text_29, 190, 180);
            DrawText(Tekstit::text_30, 350, 180);

            y_akselilla+=20;
            valittava_kohde++;
            kuskii++;
        }

        int valinta_mika = Mouse::UraValikkoOhjaukset(rooma);
        TextSomeNewColor(valinta_mika);

        Mouse::PiirraTekstit();
        if(hiiri & SDL_BUTTON(1)) {
            rooma = Mouse::UraValikko(valinta_mika, rooma);
        }
        DrawText(Tekstit::text_20, 25,190);
    }
    else if (rooms == 14) {
        piirra_kuva(Photos::ura_valikko, 0,0, false);
        DrawText(Tekstit::text_8, 55,50);
        DrawText(Tekstit::text_9, 110,50);
        DrawText(Tekstit::text_10, 165,50);
        DrawText(Tekstit::text_11, 220,50);
        DrawText(Tekstit::text_12, 275,50);
        DrawText(Tekstit::text_13, 330,50);
        DrawText(Tekstit::text_14, 385,50);

        int valinta_mika = Mouse::UraValikkoOhjaukset(rooma);
        TextSomeNewColor(valinta_mika);

        Mouse::PiirraTekstit();

        SDL_GetMouseState(&x, &y);
        hiiri=SDL_GetMouseState(&x, &y);
        if(hiiri & SDL_BUTTON(1)) {
            rooma = Mouse::UraValikko(valinta_mika, rooma);
        }
        DrawText(Tekstit::text_20, 25,190);
        DrawText(Tekstit::text_48, 25,190);
    }
    else if (rooms == 15) {
        ww=1;
        return_arvo=true;
        return_arvo_palautus=false;
        kierros=0;
        x_oma=80;
        y_oma=350;
        auton_kulma_oma=1.60;//1.60
        kulma_oma=-1.61;//1.60
        Rahaa+=500;
        rooma=5;
    }
    SDL_Flip(ruutu);
}

Jokotai [02.02.2011 19:13:30]

#

GameStart saattaisi olla hyödyllinen, koska ongelmahan on oletettavasti polussa.

mika132 [02.02.2011 19:26:44]

#

Se lataa pelin aluksi ongelmitta ja kaikki toimii, mutta kun lähdetään takaisin päin valikoissa niin alkaa tulemaan ongelmia. Eli kun mennään huoneisiin joissa ollaan oltu jo.

tässä on päätiedosto joka on pelin juurihakemistossa main.cpp

//täällä on kaikki vectori jutut (siirretään tulevaisuudessa lataus funktioon) en laittanut niitä tähän koska peli teki ennen vectoreitakin samallaista joten vika ei voi olla niissä.

    bool loppu = false;
    bool first_time=true;
    float pelin_kello = Game::sekunnit(true);
    while(pois==false) {
        int tulos = 0;
        while (pelin_kello + ajan_muutos <= Game::sekunnit()) {
			pelin_kello += ajan_muutos;
			piirretty = false;
            if(Game::rooma==10) {
                if (Game::return_arvo==true) {
                    Game::return_arvo = Game::Lahto();
                    Game::rooma=11;
                    Game::return_arvo_palautus=true;
                }
            }
			if(Game::rooma==11) {
			    if (Game::return_arvo == false) {
                    Game::Liikuta(Game::kiihtyy_oma, Game::max_nopeus_oma);
                }
            }
        }

		if (piirretty) {
			Game::odota();
		} else {
            Game::PeliAlkaa(Game::rooma);
            if (Game::rooma == 11) {
                if (Game::return_arvo_palautus == true) {
                    std::vector<Racer::RacersInRace>::iterator kisaa = Game::RacerRace.begin();
                    while(kisaa != Game::RacerRace.end()){
                        float erotus=350 - kisaa->y;
                        float kerroin = Game::ww*60;
                        float erotus_x=kisaa->x-kerroin;
                        kisaa->y += erotus;
                        kisaa->x -= erotus_x;
                        kisaa->nopeus -= kisaa->nopeus;
                        kisaa->kulma = 1.60;
                        Game::ww++;
                        kisaa++;
                    }
                    Game::return_arvo_palautus=false;
                }
            }
			piirretty = false;
		}
        SDL_PumpEvents();
            if(nappi[SDLK_ESCAPE]) {
                pois=true;
            }
    }

mutta tässä tuo lataus funktio samassa tiedostossa kuin huoneen käsittely funktio eli data/game.h

void Game::Download_StartGame() {
    //SaveFilesInformation();
    std::clog << "Game::Download_StartGame() = Start" << std::endl;
    if (SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) != 0) {
        std::clog << "Game::Download_StartGame() = Kaatunut" << std::endl;
    }
    /*if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1) {
        fprintf(stderr, "SDL_Mixerin alustus ei onnistunut.");
    }*/
    TTF_Init();
    //SaveOsaInformation();
    //SaveKuskiInformation();
    auton_kulma_oma+=1.60;//1.60
    kulma_oma-=1.61;//1.60
    std::string asas="jee";
    ruutu = SDL_SetVideoMode(RESOLUUTIO_LEVEYS, RESOLUUTIO_KORKEUS, 32, SDL_DOUBLEBUF);
    Photos::Kuva = Photos::DownloadPicturePNG("data/grafiikat/aloita_peli_nappi.png", true);
    Photos::valitsija = Photos::DownloadPicturePNG("data/grafiikat/valitsija.png", true);
    Photos::ura_valikko = Photos::DownloadPicturePNG("data/grafiikat/ura_valikko.png", true);
    Photos::tyhjenna = Photos::DownloadPicturePNG("data/grafiikat/tyhjenna.png", true);
    Photos::car = Photos::DownloadPicturePNG("data/grafiikat/kupla.png", true);
    Photos::car_2 = Photos::DownloadPicturePNG("data/grafiikat/Racer 2011-Fiat133.png", true);
    Photos::car_3 = Photos::DownloadPicturePNG("data/grafiikat/Racer2011-Toyota Corolla KE-20.png", true);
    Photos::track_1 = Photos::DownloadPicturePNG("data/grafiikat/track_1.png", true);
    Photos::piste = Photos::DownloadPicturePNG("data/grafiikat/piste.png", true);
    Photos::penkka = Photos::DownloadPicturePNG("data/grafiikat/penkka.png", true);
    Photos::musta_tapla = Photos::DownloadPicturePNG("data/grafiikat/musta_tapla.png", true);
    Photos::tausta = Photos::DownloadPicturePNG("data/grafiikat/tausta.png", true);
    Photos::valitsija2 = Photos::DownloadPicturePNG("data/grafiikat/valitsija2.png", true);
    Photos::mittaristo = Photos::DownloadPicturePNG("data/grafiikat/mittaristo.png", true);
    Photos::viisari = Photos::DownloadPicturePNG("data/grafiikat/viisari.png", true);
//    Musics::musiikki_1 = Musics::DownloadMusic("data/Music/Manian.wav");


    Fontit::font4 = Fontit::LoadFont("arial.ttf", 16);
    Fontit::font = Fontit::LoadFont("arial.ttf", 22);
    Fontit::font1 = Fontit::LoadFont("arial.ttf", 26);
    Fontit::font2 = Fontit::LoadFont("arial.ttf", 18);
    Fontit::font3 = Fontit::LoadFont("arial.ttf", 52);
    Tekstit::text_1 = Tekstit::LoadText("Pika kisa", false, 1, Fontit::font4, 0, 0, 0);
    Tekstit::text_2 = Tekstit::LoadText("Ura Moodi", false, 1, Fontit::font4, 0, 0, 0);
    Tekstit::text_3 = Tekstit::LoadText("Asetukset", false, 1, Fontit::font4, 0, 0, 0);
    Tekstit::text_4 = Tekstit::LoadText("Vaikeusaste", false, 1, Fontit::font1, 255, 0, 0);
    Tekstit::text_5 = Tekstit::LoadText("Helppo", false, 1, Fontit::font4, 0, 0, 0);
    Tekstit::text_6 = Tekstit::LoadText("Keskitaso", false, 1, Fontit::font4, 0, 0, 0);
    Tekstit::text_7 = Tekstit::LoadText("Vaikea", false, 1, Fontit::font4, 0, 0, 0);
    Tekstit::text_8 = Tekstit::LoadText("MA", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_9 = Tekstit::LoadText("TI", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_10 = Tekstit::LoadText("KE", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_11 = Tekstit::LoadText("TO", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_12 = Tekstit::LoadText("PE", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_13 = Tekstit::LoadText("LA", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_14 = Tekstit::LoadText("SU", false, 1, Fontit::font2, 255, 0, 0);

    Tekstit::text_15 = Tekstit::LoadText("Seuraava kisa", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_16 = Tekstit::LoadText("Talli", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_17 = Tekstit::LoadText("Tallenna", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_18 = Tekstit::LoadText("Muut kuskit", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_21 = Tekstit::LoadText("Romuttamo", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_22 = Tekstit::LoadText("Osa kauppa", false, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_19 = Tekstit::LoadText(" ", true, 1, Fontit::font2, 255, 0, 0);
    Tekstit::text_23 = Tekstit::LoadTextString("", false, asas, Fontit::font2, 255, 255, 0);
    Tekstit::text_24 = Tekstit::LoadTextString("", false, asas, Fontit::font2, 255, 255, 0);
    Tekstit::text_34 = Tekstit::LoadTextString("3", false, asas, Fontit::font3, 255, 255, 0);
    Tekstit::text_35 = Tekstit::LoadTextString("2", false, asas, Fontit::font3, 255, 255, 0);
    Tekstit::text_36 = Tekstit::LoadTextString("1", false, asas, Fontit::font3, 255, 255, 0);
    Tekstit::text_37 = Tekstit::LoadTextString("V. Alpha 0.9.3.855", false, asas, Fontit::font2, 255, 0, 0);
    Tekstit::text_38 = Tekstit::LoadTextString("Projektissa mukana!", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_39 = Tekstit::LoadTextString("Ohjelmointi: ", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_40 = Tekstit::LoadTextString("Matti", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_41 = Tekstit::LoadTextString("Grafiikka: ", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_42 = Tekstit::LoadTextString("Ossi (Autot / radat)", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_43 = Tekstit::LoadTextString("Niksa (Taustakuvat)", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_47 = Tekstit::LoadTextString("Valitse autosi: ", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_44 = Tekstit::LoadTextString("Fiat 850: ", false, asas, Fontit::font1, 0, 0, 0);
    Tekstit::text_45 = Tekstit::LoadTextString("Toyota Corolla KE-20", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_46 = Tekstit::LoadTextString("WW Kupla", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_48 = Tekstit::LoadTextString("Ei käytössä", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_49 = Tekstit::LoadText("", true, kierros, Fontit::font, 0, 0, 0);
    Tekstit::text_50 = Tekstit::LoadTextString("/ 3", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_51 = Tekstit::LoadText("", true, seconds, Fontit::font, 0, 0, 0);
    Tekstit::text_52 = Tekstit::LoadTextString("Lap: ", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_53 = Tekstit::LoadTextString("Lap Time: ", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_54 = Tekstit::LoadTextString("--", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_55 = Tekstit::LoadTextString("--", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_56 = Tekstit::LoadTextString("--", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_57 = Tekstit::LoadTextString("--", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_58 = Tekstit::LoadTextString("Rahaa: ", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_59 = Tekstit::LoadText("", true, Rahaa, Fontit::font, 0, 0, 0);
    /*Tekstit::text_46 = Tekstit::LoadTextString("Matu", false, asas, Fontit::font, 0, 0, 0);
    Tekstit::text_46 = Tekstit::LoadTextString("Matti", false, asas, Fontit::font, 0, 0, 0);*/
    sekunnit(true);
}

Jokotai [02.02.2011 20:39:09]

#

Katselimpas tuosta että mikä se virhe 3 oikein on ja löysin: http://error-message.net/error_path_not_found/
Auttaako?

mika132 [02.02.2011 22:02:13]

#

Juu tiedän saan tuon errorin vähäväliä, mutta polku on oikea. Koitin nyt muuttaa polut niin, että etisttiin grafiikat/ kansiosta joka siis sijaitsee data kansiossa, mutta sitten ei tule kuvia ollenkaan.

Teuro [03.02.2011 07:05:53]

#

Oletko varma, ettei huoneessa (rooms 11) poisteta mitään tarpeellista? Tuollahan on jokunen SDL_FreeSurface funktio kuitenkin esillä. Miksi muuten rooms, joka viittaa monikkoon, mutta kuitenkin sitä käytetään kuin yksikköä? Viittaako room selected asiaa?

Metabolix [03.02.2011 10:30:57]

#

Tiedostojen puuttumisen ei pitäisi kaataa peliä. Luultavasti olet tulkinnut virheilmoituksen väärin tai se aiheutuu muusta syystä sattumalta.

Kokeile korvata SDL_FreeSurface tällä makrolla (joka siis pitää ensin lisätä koodin alkuun):

#define SDL_FreeSurface_Null(x) (SDL_FreeSurface(x), (x = 0))

Eli lisää edellä mainittu koodi tiedoston alkuun ja vapauta sitten kuvat näin:

SDL_FreeSurface_Null(Tekstit::text_24);

mika132 [03.02.2011 12:57:42]

#

Ei auttanut. Yleisin kaatumispiste on kilpailusta valikkoon ja toisinpäin siirtymisen välillä. Ja aina kaatuminen tapahtuu kun valikosta mennään ajamaan toinen kilpailu.

Eli sama koodistani josta ei välttämättä kaikki ymmärrä.

Room 10 = Lähtöhuone. Tämä on ns. Ylimääräinen, mutta ilman tätä autot lähtevät lähdöstä "teleportilla"

Room 11 = Kilpailu huone

Room 5, 7, 8, 12, 13, 14 = Valikko huoneita joista päästään kilpailuun

Room 15 = Kilpailun päättymisen jälkeen ohjataan tänne, jotta kisan akselit kierrokset yms saadaan nollattua.

Ja kaatumispiste on yleensä 5,7,8,12,13,14 joistankin noista huoneista siirryttäessä toisen kerran kilpailuun eli huoneeseen 10 josta siirrytään huoneeseen 11


ja tässä huoneen 10 ominaisuudet koska ne ovat eri tiedostossa (main.cpp):

            if(Game::rooma==10) {
                if (Game::return_arvo==true) {
                    Game::return_arvo = Game::Lahto();
                    Game::rooma=11;
                    Game::return_arvo_palautus=true;
                }
            }
	    if(Game::rooma==11) {
			    if (Game::return_arvo == false) {
                    Game::Liikuta(Game::kiihtyy_oma, Game::max_nopeus_oma);
                }
            }

Gaxx [03.02.2011 21:12:08]

#

Jos et debuggeria käytä niin sitten vaan debuggitulosteilla siivilöimään koodia. Turhaan sitä virheettä etsii niiden kuvien käsittelystä, kun tuon tyyppinen virhe voi johtua mistä tahansa muistinkäpistelyvirheestä.

eq [03.02.2011 21:35:05]

#

Tuolla määrällä koodia (ei siis varsinaisesti paljon, mutta ei enää vähänkään) kannattaisi vakavasti harkita edes jonkinlaista organisointia, ja mahdollisesti eri toimintojen (kuten pelilogiikan ja valikkojen piirtämisen) erottamista eri moduuleihin.

mika132 [07.02.2011 00:24:09]

#

yritin käyttää Code:Blocksin debuggeria ja tulos heti ohjelman käynnistyessä:

KUVA

Sen jälkeen debuggeri ei anna mitään virheilmoituksia vaikka pelaisin peliä sen kaatumis pisteeseen asti.

jalski [07.02.2011 10:08:59]

#

mika132 kirjoitti:

yritin käyttää Code:Blocksin debuggeria ja tulos heti ohjelman käynnistyessä:

KUVA

Sen jälkeen debuggeri ei anna mitään virheilmoituksia vaikka pelaisin peliä sen kaatumis pisteeseen asti.

En tunne Code:Blocksin debuggeria, mutta jos tuo on kaikki tieto, mitä debuggeri näyttää niin epäilen vahvasti ettet ole laittanut debug-tietoa mukaan käännökseen.

Yleensähän debuggeri itsessään harvemmin antaa mitään varsinaista virheilmoitusta, vaan käyttöjärjestelmä saattaa näyttää huonosti käyttäytyneelle prosessille exit-statuksen mitä voi käyttää apuna virheen etsimisessä.

Teuro [07.02.2011 10:39:32]

#

Ainakin mulla tulee koko kutsuketju tuohon backtraceen, jos ajaa debug käännöksen (F8). Tuossahan ei ole kuin funktioiden muistiosoitteet, joista ei kyllä apua oikein ole. Tuleeko tuosta kuitenkin ohjelma on suorittanut laittoman toiminnon vai millainen kaatuminen on?

crafn [07.02.2011 19:14:31]

#

mika132 kirjoitti:

yritin käyttää Code:Blocksin debuggeria ja tulos heti ohjelman käynnistyessä:

KUVA

Sen jälkeen debuggeri ei anna mitään virheilmoituksia vaikka pelaisin peliä sen kaatumis pisteeseen asti.

Itselläni oli sama tilanne, mikä korjaantui kun otin projektin polusta välilyönnit pois.

User137 [07.02.2011 20:02:49]

#

Yleinen virhe on olettaa että ohjelma aina käynnistetään sen sijaintikansiosta. Ei pidä paikkaansa.

Toisinsanoen jos kuva ladataan kansiosta 'kuvat\joku.bmp' niin se voi pääsääntöisesti toimia kun taas toisinaan ei. Sen takia kannattaa käyttää koko polkua, jonka saa C++:ssa kai selville ohjelman parametrista [0]. Toiseksi Windows ympäristö saattaa joskus vaatia lainausmerkit polun ympärille, erityisesti välilyöntien kanssa?

mika132 [08.02.2011 13:32:38]

#

No nyt debugger ilmeisesti toimi oikein, koska alkoi tulemaan ongelman lähteitä ja rivejä.

yritin niitä ratkoa, mutta ina ne roikkuvat. enkä ymmärtänyt error riveistä täysin kuin ekan (ilmeisesti kuvan arvo on NULL jostain syystä?)

seuraavaavan tiedän suurinpiirtein mutta sen jälkeen ei mitään tietoa, että mitä ihmettä.

Enkä kyllä ole saanut ainuttakaan riviä vielä korjattua.

KUVA


ja errori rivit:

//503 (game.h)
        r.x -= kuva->w / 2;
//Kyseinen kohta on piirto funktiossa, joka löytyy alempaa.

//999 (game.h)
piirra_kuva(Photos::temp_racer[jjj], Racers_x[jjj], Racers_y[jjj], true);
//Kyseinen kohta on lähtö funktiossa joka löytyy alempaa.

//89 (main.cpp)
Game::return_arvo = Game::Lahto();
//Kyseinen kohta on main.cpp tiedostossa lähtö tarkistuksessa joka löytyy alempaa.
//Piirtofunktio:
static void Game::piirra_kuva(SDL_Surface *kuva, int x, int y, bool keskikohta) {
    SDL_Rect r = {x, y};
    if (keskikohta) {
        r.x -= kuva->w / 2;
        r.y -= kuva->h / 2;
    }
    SDL_BlitSurface(kuva, 0, ruutu, &r);
}
bool Game::Lahto() {
    jj=0;
    std::vector<Racer::RacersInRace>::iterator kisaa = RacerRace.begin();
    while(kisaa != Game::RacerRace.end()){
        if (jj == 1) {
            Photos::temp_racer[jj] = rotozoomSurface(Photos::car_2, rad2deg(kisaa->kulma), 1, 1);
        } else if (jj==0) {
            Photos::temp_racer[jj] = rotozoomSurface(Photos::car_3, rad2deg(kisaa->kulma), 1, 1);
        } else if (jj==2) {
            Photos::temp_racer[jj] = rotozoomSurface(Photos::car_3, rad2deg(kisaa->kulma), 1, 1);
        }
        Racers_x[jj]=kisaa->x;
        Racers_y[jj]=kisaa->y;
        jj++;
        kisaa++;
    }
        if (valittu_auto == 1) {
            Photos::temp_oma = rotozoomSurface(Photos::car_2, rad2deg(auton_kulma_oma), 1, 1);
        }
        if (valittu_auto == 2) {
            Photos::temp_oma = rotozoomSurface(Photos::car_3, rad2deg(auton_kulma_oma), 1, 1);
        }
        if (valittu_auto == 3) {
            Photos::temp_oma = rotozoomSurface(Photos::car, rad2deg(auton_kulma_oma), 1, 1);
        }
    piirra_kuva(Photos::tyhjenna, 0,0, false);
    piirra_kuva(Photos::track_1, 0,0, false);
    piirra_kuva(Photos::temp_oma, x_oma, y_oma, true);
    for(int jjj=0; jjj <= 2; jjj++){
        piirra_kuva(Photos::temp_racer[jjj], Racers_x[jjj], Racers_y[jjj], true);
/*
---------------------------------------------
ERRORI RIVI 999 ON YLEMPI RIVI
---------------------------------------------
*/
    }

    DrawText(Tekstit::text_34, 400, 400);
    SDL_Flip(ruutu);
    piirra_kuva(Photos::tyhjenna, 0,0, false);
    piirra_kuva(Photos::track_1, 0,0, false);
    piirra_kuva(Photos::temp_oma, x_oma, y_oma, true);
    for(int jjj=0; jjj <= 2; jjj++){
        piirra_kuva(Photos::temp_racer[jjj], Racers_x[jjj], Racers_y[jjj], true);
    }
    SDL_Delay(1000);
    DrawText(Tekstit::text_35, 400, 400);
    SDL_Flip(ruutu);
    piirra_kuva(Photos::tyhjenna, 0,0, false);
    piirra_kuva(Photos::track_1, 0,0, false);
    piirra_kuva(Photos::temp_oma, x_oma, y_oma, true);
    for(int jjj=0; jjj <= 2; jjj++){
        piirra_kuva(Photos::temp_racer[jjj], Racers_x[jjj], Racers_y[jjj], true);
    }
    SDL_Delay(1000);
    DrawText(Tekstit::text_36, 400, 400);
    SDL_Flip(ruutu);
    SDL_Delay(500);
    return false;
}
        while (pelin_kello + ajan_muutos <= Game::sekunnit()) {
			pelin_kello += ajan_muutos;
			piirretty = false;
            if(Game::rooma==10) {
                if (Game::return_arvo==true) {
                    Game::return_arvo = Game::Lahto();
/*
ERROR RIVI 89 MAIN.CPP ON YLEMPI RIVI
*/
                    Game::rooma=11;
                    Game::return_arvo_palautus=true;
                }
            }
			if(Game::rooma==11) {
			    if (Game::return_arvo == false) {
                    Game::Liikuta(Game::kiihtyy_oma, Game::max_nopeus_oma);
                }
            }
        }

Teuro [08.02.2011 13:48:48]

#

Käytät siis tuota metabolixin vinkkaamaa makroa? Siinähän nimenomaan asetetaan kuvapinnan arvoksi NULL. Tämä sinun pitäisi tietää kyllä ihan ehdottomasti. Mutta siis jos sen arvo on NULL, niin olet onnistunut vapauttamaan kuvapinnan ihan väärässä paikassa.

mika132 [08.02.2011 14:52:49]

#

Ilmeisesti näin on koska kilpailu roomissa kuva vapautetaan ja jos tuon vapautuksen poistaa peli toimii muuten ongelmitta, mutta se lataa muistiin samaa kuvaa montamonta kertaa eli muistin käyttö kasvaa nopeasti.

} else if (rooms == 11) {
    SDL_FreeSurface_Null(Tekstit::text_49);
    SDL_FreeSurface_Null(Tekstit::text_51);
    Tekstit::text_49 = Tekstit::LoadText("notging", true, kierros, Fontit::font, 0, 0, 0);
    Tekstit::text_51 = Tekstit::LoadText("", true, seconds, Fontit::font, 0, 0, 0);
    Uint8* nappi;
    nappi = SDL_GetKeyState(NULL);
    if (valittu_auto == 1) {
        Photos::temp_oma = rotozoomSurface(Photos::car_2, rad2deg(auton_kulma_oma), 1, 1);
    }
    if (valittu_auto == 2) {
        Photos::temp_oma = rotozoomSurface(Photos::car_3, rad2deg(auton_kulma_oma), 1, 1);
    }
    if (valittu_auto == 3) {
        Photos::temp_oma = rotozoomSurface(Photos::car, rad2deg(auton_kulma_oma), 1, 1);
    }
    Photos::temp_nopeusmittari = rotozoomSurface(Photos::viisari, nopeus_mittarin_kulma, 1, 1);
    piirra_kuva(Photos::tyhjenna, 0,0, false);
    piirra_kuva(Photos::track_1, 0,0, false);
    DrawText(Tekstit::text_49, 45, 10);
    DrawText(Tekstit::text_50, 65, 10);
    DrawText(Tekstit::text_52, 0, 10);
    DrawText(Tekstit::text_53, 0, 30);
    DrawText(Tekstit::text_51, 100, 30);
    DrawText(Tekstit::text_54, 700, 30);
    DrawText(Tekstit::text_55, 700, 60);
    DrawText(Tekstit::text_56, 700, 90);
    DrawText(Tekstit::text_57, 700, 120);
    piirra_kuva(Photos::mittaristo, 0, 500, false);
    piirra_kuva(Photos::temp_nopeusmittari, 50, 560, true);

    std::vector<Fysiikka::RenkasVana>::iterator vanaa = RenkasVanat.begin();
    while(vanaa != Game::RenkasVanat.end()){
        piirra_kuva(Photos::musta_tapla, vanaa->x, vanaa->y, true);
        vanaa++;
    }
    piirra_kuva(Photos::temp_oma, x_oma, y_oma, true);
    std::vector<Racer::RacersInRace>::iterator kisaa = RacerRace.begin();
    while(kisaa != Game::RacerRace.end()){
        if (jj == 1) {
            Photos::temp_racer[jj] = rotozoomSurface(Photos::car_2, rad2deg(kisaa->kulma), 1, 1);
        } else if (jj==2) {
            Photos::temp_racer[jj] = rotozoomSurface(Photos::car, rad2deg(kisaa->kulma), 1, 1);
        } else if (jj==0) {
            Photos::temp_racer[jj] = rotozoomSurface(Photos::car_3, rad2deg(kisaa->kulma), 1, 1);
        }
        piirra_kuva(Photos::temp_racer[jj], kisaa->x, kisaa->y, true);
        jj++;
        if (jj >= 2) {
            jj=0;
        }
        kisaa++;
    }
    for (int aa=0; aa <= 2; aa++) {
        SDL_FreeSurface_Null(Photos::temp_racer[aa]);
    }
    SDL_FreeSurface_Null(Photos::temp_oma);
    SDL_FreeSurface_Null(Photos::temp_nopeusmittari);
}

Tuolla näkyy kuvan vapautus. temp_racer[aa] jos otan _Null kohdan pois tuosta peli ei edes käynnisty kun se jo kaatuu erroriin 3. Vinkkejä?

Metabolix [08.02.2011 16:36:59]

#

Mikset käytä koodivinkkini kuvavarastoa? Sillä jokainen kuva ladattaisiin takuulla vain kerran ja myös takuulla ladattaisiin oikealla hetkellä. Lisäksi voisit käyttää pyöritettyjen kuvien piirtoon seuraavaa koodia (jollainen sinun olisi kyllä pitänyt jo itsekin tajuta ja osata tehdä):

void piirra_kuva_kaannettyna(SDL_Surface* kuva, int x, int y, double kulma) {
  SDL_Surface* tmp = rotozoomSurface(kuva, rad2deg(kulma), 1, 1);
  piirra_kuva(tmp, x, y, true);
  SDL_FreeSurface(tmp);
}

jalski [08.02.2011 18:14:33]

#

mika132 kirjoitti:

No nyt debugger ilmeisesti toimi oikein, koska alkoi tulemaan ongelman lähteitä ja rivejä.

yritin niitä ratkoa, mutta ina ne roikkuvat. enkä ymmärtänyt error riveistä täysin kuin ekan (ilmeisesti kuvan arvo on NULL jostain syystä?)

Positiivista kuitenkin, että ymmärsit virheen olevan siinä, että piirrä_kuva() funktion kutsuparametriksi annettu kuvapinnan osoitin osoittaa 0x0 osoitteeseen.

Huomioi muuten, että linkittämässäsi kuvassa olevat debuggerin näyttämät rivit eivät varsinaisesti ole ongelman lähteitä (välttämättä). Tuo on vain stack dumppi ohjelmasi funktio kutsuista.

Itse muuten tykkään nähdä kerralla hiukan enemmän tietoa ja yleensä otan tulosteeseen mukaan myös kaikkien funktioiden lokaalit muuttujat. Tällä tietomäärällä ja pienellä pohtimisella ovatkin jo sitten useimmat ongelmat selvitettävissä.


Kannattaa muuten oikeasti opetella tuntemaan käyttämänsä alusta ja työkalut.

Esim. Plan 9 käyttöjärjestelmällä nolla osoittimen kaltainen virhe löytyisi helposti:

- ajettaessa ohjelmaa shell antaisi ohjelmalle exit statuksen:

suicide: sys: trap: fault read addr=0x0 pc=0x000016ff

- src apuohjelmalla saadaan selville lähdetiedosto ja rivinumero, mikä vastaa kyseistä program counterin arvoa

; src -n -s 0x000016ff ohjelman_nimi

- jos tuo tieto ei vielä riittänyt, niin kaatunut prosessi on vielä olemassa broken tilassa ja siihen päästään helposti käsiksi Plan 9:n acid debuggerilla.

stk() funktiolla saadaan näkyville aiemmin linkittämäsi kuvan kaltainen stack dumppi funktiokutsuista.

lstk() funktiolla saadaan näkyville stack dumppi funktiokutsuista funktioiden lokaalien muuttujien kanssa.


Sivun alkuun

Vastaus

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

Tietoa sivustosta