Otsikko kertoo käytännössä kaiken. En löytänyt yhtään tämän kaltaista opasta niin päätin itse – vaikkakin vielä aloittelija itsekin olenkin – yrittää auttaa muita aloittelijoita. Oppaassa käyn läpi gravitaation, hypyn, liikkumisen, ns. collision checkin ja muuta pientä.
Peli tarvitsee tiedostot Head.bmp (ukko), Ruoho.bmp (tausta), Coin.bmp (kolikko) ja Coin.wav (kolikon ääni).
Peli käyttää kirjastoja SDL ja SDL_mixer.
//KIRJASTOT #include <SDL.h> #include <SDL_mixer.h> #include <time.h> ////////////////////////// //Käytettävät vakiot const int SCREEN_WIDTH = 800; const int SCREEN_HEIGHT = 600; const int SCREEN_BPP = 32; ///////////////////////// //Käytettävät funktiot (joista lisää myöhemmin) int AlustaKaikki(); void ExitOhjelma(); void KuvanPiirto(SDL_Surface *Piirto, SDL_Surface *Naytto, int x, int y); void OhjausJne(); void RandomKolikko(int x, int y); void OsumaKolikkoon(); void Gravity(); ///////////////////////// //Määritellään käytettävät pinnat ja ääni SDL_Surface *Naytto; SDL_Surface *Head; SDL_Surface *RuohoTausta; SDL_Surface *Kolikko; Mix_Chunk *KolikkoSound; ////////////////////////////////////////////// //Käytettäviä yleisiä muuttujia suojattuna structuressa. Lähinnä sen takia laitoin //struct rakenteeseen ettei tule päällekkäisyyksiä yleisten ja paikallisten muuttujien nimien suhteen. struct YleisiaMuuttujia { bool KolikkoShow; bool Exit; bool Kolikko; bool OsumaMaahan; bool Hyppy; int KolikkoX; int KolikkoY; double HeadX; double HeadY; double HyppyNopeus; }Program; ///////////////////////////////////// //MAIN FUNKTIO int main(int argc, char *argv[]) { //Alustetaan kaikki tässä funktiossa AlustaKaikki(); //Alkuarvot kaikille muuttujille Program.Hyppy = false; Program.OsumaMaahan = false; //Voimme hypätä vain jos osumme maahan ja emme ole hypänneet (eli Hyppy == false) Program.Exit = false; Program.HeadX = 200; Program.HeadY = 540; Program.Kolikko = false; Program.KolikkoX = 400; Program.KolikkoY = 400; Program.KolikkoShow = true; //Random generaattoria varten srand( time(NULL) ); //Näppäimiä varten SDL_Event NappiEventti; //MAIN LOOPPI while (Program.Exit == false) { SDL_PollEvent(&NappiEventti); //Piirretään kuvat KuvanPiirto(RuohoTausta, Naytto, 0, 0); KuvanPiirto(Head, Naytto, Program.HeadX, Program.HeadY); if ( Program.KolikkoShow == true) { RandomKolikko(Program.KolikkoX, Program.KolikkoY); } OhjausJne(); OsumaKolikkoon(); Gravity(); SDL_Flip(Naytto); //Tsekataan onko UP painettu eli ollaanko hyppäämässä ja liikutetaan päätä ylöspäin alkunopeudella -3, if (Program.Hyppy == true) //hidastetaan hiljalleen kunnes lopulta etumerkki vaihtuu ja aletaan pudota { Program.HeadY -= Program.HyppyNopeus; Program.HyppyNopeus -= 0.01; Program.OsumaMaahan = false; } } ExitOhjelma(); return 0; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //COLLISION CHEKKI KOLIKON KANSSA & RANDOM GENERAATTORI KOLIKON UUDELLE PAIKALLE & JA KIVA PIKKU SOUNDI SIIHEN VÄLIIN void OsumaKolikkoon() { //Tässä alla olevassa IFissä laitetaan pieni neliö kolikon ympärille johon päällä osuttua kolikko vaihtaa paikkaa ja soitetaan pikku ääni if ( Program.HeadX >= (Program.KolikkoX-50) && Program.HeadX <= (Program.KolikkoX + 30) && Program.HeadY >= (Program.KolikkoY - 35) && Program.HeadY <= (Program.KolikkoY + 30)) { Program.KolikkoShow = false; Mix_PlayChannel(0, KolikkoSound, 0); Program.KolikkoX = (rand() % 740 + 1); Program.KolikkoY = (rand() % 540 + 1); Program.KolikkoShow = true; } } //////////////////////////////////////////////////////////////////////////// //KOLIKON PIIRTO UUTEEN PAIKKAAN JOS KOLIKKO ON KERÄTTY ELI KOLIKKO = FALSE void RandomKolikko(int x, int y) { if ( Program.Kolikko == false) { KuvanPiirto(Kolikko, Naytto, x, y); } } ///////////////////////////////////////////////////////////////////////////////////////////////////// //Ei kyllä itseasiassa painovoima mut lähinnä chekki et onko head maassa ja toimenpiteet sen mukaan void Gravity() { if ( Program.HeadY >= 540 ) { Program.HeadY = 539; //Kun tullaan takas maahan päällä hypyn jälkeen niin laitaaan se 1 pikseli ylöspäin jolloin funktio Program.Hyppy = false; //ei lähe looppaamaaan ja päästään hyppäämään uudestaan. Program.OsumaMaahan = true; Program.HyppyNopeus = 3; } } //////////////////////////// //OHJAUS JNE void OhjausJne() { //Tarvittavat asiat nappien syöttöön koneelle Uint8* NapinPainallus; NapinPainallus = SDL_GetKeyState(NULL); //LIIKKUMINEN, HYPPY JA BOUNDARY CHECK if ( NapinPainallus[SDLK_UP] ) { if ( Program.OsumaMaahan == true ) //Tsekataan osutaanko maahan... { Program.Hyppy = true; //Jos osutaan niin sillon voidaan hypätä } } if ( NapinPainallus[SDLK_RIGHT] ) //Jos painetaan oikeaa nappia niin... { if ( Program.HeadX < 740 ) //Tarkistetaan että Head kuvan X koordinaatti on alle 740 jolloin ei mennä ulos ruudusta { Program.HeadX += 1; //Liikutetaan päätä jos edelliset ehdot toteutui } } if ( NapinPainallus[SDLK_LEFT] ) { if ( Program.HeadX > 0 ) { Program.HeadX -= 1; } } if ( NapinPainallus[SDLK_ESCAPE] ) { Program.Exit = true; } //Escillä pois ohjelmasta } ///////////////////////////////////// //ALUSTAA OHJELMAN int AlustaKaikki() { //Alustaa SDL:n if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { fprintf(stderr, "Virhe alustaessa peliä \n", SDL_GetError); ExitOhjelma(); return 1; } //Alustaa Mixin jolla saadaan ääni tuotettua if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) < 0) { fprintf(stderr, "Virhe alustaessa ääntä /n", SDL_GetError); ExitOhjelma(); return 1; } //Tekee meille ikkunan johon laittaa kuvat ja muut sälät Naytto = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_HWSURFACE|SDL_DOUBLEBUF); Kolikko = SDL_LoadBMP("Coin.bmp"); // Ladataan Coin kuva ja yksi rivi alempana asetetaan valkoinen väri läpinäkyväksi. SDL_SetColorKey(Kolikko, SDL_SRCCOLORKEY, SDL_MapRGB(Kolikko->format, 255, 255, 255)); KolikkoSound = Mix_LoadWAV_RW(SDL_RWFromFile("Coin.wav", "rb"), 0); //Ladataan kolikon ääni RuohoTausta = SDL_LoadBMP("Ruoho.bmp"); Head = SDL_LoadBMP("Head.bmp"); SDL_SetColorKey(Head, SDL_SRCCOLORKEY, SDL_MapRGB(Head->format, 255, 255, 255)); return 0; } //////////////////////////////////////////////////////// //OHJELMAN LOPETUSFUNKTIO/PUDOTTAA TAVARAT MUISTISTA void ExitOhjelma() { SDL_FreeSurface(Kolikko); SDL_FreeSurface(RuohoTausta); SDL_FreeSurface(Head); Mix_FreeChunk(KolikkoSound); Mix_CloseAudio(); SDL_Quit(); } ///////////////////////////////// //KUVAN PIIRTOFUNKTIO void KuvanPiirto(SDL_Surface *Piirto, SDL_Surface *Naytto, int x, int y) { SDL_Rect Alue; Alue.x = x; Alue.y = y; SDL_BlitSurface(Piirto, NULL, Naytto, &Alue); }
Tämä koodi ei ole millään mittapuulla mallikelpoinen. Koodi on monelta osin huonosti kirjoitettu ja jopa buginen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.