[C/C++ + SDL] PRVI KORAK - crtanje i micanje slike po ekranu

Sadržaji namijenjeni potpunim početnicima u svijetu programiranja i/ili razvoja igara.
Post Reply
User avatar
Danijel Korent
Romulanski špijun na Zemlji
Posts: 1583
Joined: Fri Sep 05, 2008 12:35 pm
Smallest prime number bigger than 20: 23
Location: Njemacka
Contact:

[C/C++ + SDL] PRVI KORAK - crtanje i micanje slike po ekranu

Post by Danijel Korent » Thu Jun 25, 2009 5:52 pm

Ovdje se nalazi source kod od jednostavnog programa u kojem ucitavate neku sliku sa diska, crtate je u prozor i mijenjate joj pozicija sa arrow tipkama. (taj isti kod napisan u Pythonu se moze vidjeti ovdje)

Da bi kod mogli pokrenuti:
morate imati instaliran neki C/C++ compiler i po mogucnosti neki IDE ako kanite dalje prckati po kodu, ovo je moja preporuka da bi najlakse i najbezbolnije izkompajlirali kod i pokrenuli program:

Dev-C++ 4.9 - 9Mb
http://prdownloads.sourceforge.net/dev- ... _setup.exe

SDL devpak za Dev-C++ - 1Mb
http://devpaks.org/category.php?category=SDL
- preporucujem ovaj: SDL Library version: 1.2.12 Devpak version: 1zapo, jer ima 2 gotova pocetnika templatea/primjera s kojima mozete pocet drljat bez da morate ista konfigurirati -> File -> New -> Project -> Multimedija -> SDL ili SDL&OpenGL

Kod instalacije ne treba nista posebno konfigurirati, jednostavno je kao i instaliranje neke igrice. Nakon sto se Dev-C++ instalira devpak datoteka se samo duplo klikne i automatski instalira u Dev-C++

Ovdje se moze skinuti source kod sa komentarima (u folderu C++):
http://www.box.net/shared/mhsr44earl
- kod se pokrece tako da pokrenete Kocka.dev koji se otvori u Dev-C++ programu. U njemu pritisnete F9, prvi puta ce javiti gresku jer jedan file fali, samo ignorirajte jer je taj file u meduvremenu izgeneriran i pritisnite jos jednom F9, ovaj put ce do kraja iskompajlirati program i pokrenuti ga.
Last edited by Danijel Korent on Thu Jun 25, 2009 6:55 pm, edited 9 times in total.

User avatar
Danijel Korent
Romulanski špijun na Zemlji
Posts: 1583
Joined: Fri Sep 05, 2008 12:35 pm
Smallest prime number bigger than 20: 23
Location: Njemacka
Contact:

Re: [C/C++ + SDL] - crtanje i micanje slike po ekranu

Post by Danijel Korent » Thu Jun 25, 2009 5:53 pm

Source kod programa bez komentara:

Code: Select all

#include <SDL/SDL.h> 


int main (int argc, char *argv[]) 
{
    SDL_Init(SDL_INIT_EVERYTHING);
    atexit (SDL_Quit);

	
    SDL_Surface *glavni_buffer;
    glavni_buffer = SDL_SetVideoMode (800, 600, 32, SDL_DOUBLEBUF);

    int kocka_PozicijaX, kocka_PozicijaY, kocka_brzina;
    kocka_PozicijaX = 100;
    kocka_PozicijaY = 100;
    kocka_brzina = 50;
    
    SDL_Surface *kocka_slika;
    kocka_slika = SDL_LoadBMP("kocka.bmp");
	
    bool glavna_petlja = true; 
	

    while (glavna_petlja == true)
    { 

    SDL_Event event; 
    while (SDL_PollEvent(&event)) 
      {
		
      if (event.type == SDL_QUIT) glavna_petlja = false;
		
      if  (event.type == SDL_KEYDOWN)
			{
			if (event.key.keysym.sym == SDLK_ESCAPE) glavna_petlja = false;
			if (event.key.keysym.sym == SDLK_LEFT) kocka_PozicijaX = kocka_PozicijaX - kocka_brzina;  
			if (event.key.keysym.sym == SDLK_RIGHT) kocka_PozicijaX = kocka_PozicijaX + kocka_brzina;
			if (event.key.keysym.sym == SDLK_UP) kocka_PozicijaY = kocka_PozicijaY - kocka_brzina;
			if (event.key.keysym.sym == SDLK_DOWN) kocka_PozicijaY = kocka_PozicijaY + kocka_brzina;
			}
      }

    Uint32 color;
    color = SDL_MapRGB (glavni_buffer->format, 0, 0, 0);
    SDL_FillRect (glavni_buffer, NULL, color);
        
    SDL_Rect pozicija;
    pozicija.x = kocka_PozicijaX;
    pozicija.y = kocka_PozicijaY;
    pozicija.w = kocka_slika->w;
    pozicija.h = kocka_slika->h;

    SDL_BlitSurface(kocka_slika, NULL, glavni_buffer, &pozicija);
    SDL_Flip (glavni_buffer);
    }
return 0;
}

Last edited by Danijel Korent on Fri Jun 26, 2009 11:09 am, edited 5 times in total.

User avatar
Danijel Korent
Romulanski špijun na Zemlji
Posts: 1583
Joined: Fri Sep 05, 2008 12:35 pm
Smallest prime number bigger than 20: 23
Location: Njemacka
Contact:

Re: [C/C++ + SDL] - crtanje i micanje slike po ekranu

Post by Danijel Korent » Thu Jun 25, 2009 5:54 pm

Source kod sa komentarima: (moglo bi ruzno izgledati na nizoj rezoluciji)

Code: Select all

#include <SDL/SDL.h> // includamo SDL library  da mozemo koristiti njegove funkcije



int main (int argc, char *argv[]) // da ne idem u detalje ovim se u C++ oznacava pocetak naseg programa
{
    // SDL-ova funkcija koju moramo pozvati da se sam SDL interno inicijalizira
    // bez toga ne rade njegove funkcije
    SDL_Init(SDL_INIT_EVERYTHING);

	// isto kao i ovo gore jednostavno se mora pozvati da bi sve OK zavrsilo :)
    atexit (SDL_Quit);
    

    // deklaracija objekta, u C/C++ prvo mu treba reci sto je, u ovom slucaju glavni_buffer da bi ga mogli 
    // koristiti - ova zvjezica ozdacava da je to pointer - tesko je u malo rijeci objasniti sto je pointer 
    // tako da cete za sada morati prihvatiti kao nesto sto tu mora biti
    SDL_Surface *glavni_buffer; 

    glavni_buffer = SDL_SetVideoMode (800, 600, 32, SDL_DOUBLEBUF);
    // funkcija  SDL_SetVideoMode stvara prozor na temelju argumenata koje smo joj dali - rezolucija, nacin 
    // rada povrsine koju smo dobili - ovdje je double buffer, i broj biteva boje
    // ta funkcija ujedno i "inicijalizira"  glavni_buffer 


    // ovdje smo si definirali nekliko varijbala koje cemo koristiti u nasem programu,
    // mislim da ih ne treba posebno komentirati.. :)
    // deklaracija  varijabala - govori compileru da su te tri varijable int tipa - odnsno cjelobrojne
    int kocka_PozicijaX, kocka_PozicijaY, kocka_brzina; 
    kocka_PozicijaX = 100;
    kocka_PozicijaY = 100;
    kocka_brzina = 50;
    
    // deklaracija da je temp SDL_Surface tip varijable
    SDL_Surface *kocka_slika;

    // ovom funkcijom se ucitava sklika iz zadane datoteku u varijablu kocka_slika
    kocka_slika = SDL_LoadBMP("kocka.bmp"); 

	
    // varijabla glavna petlja koja se koritisti u nasoj petlju dolje, 
    // kada je True petlja se "vrti", a kada je False petlja se prekida...
    bool glavna_petlja = true; 
	

    // kao sto pise gore -  kada je True petlja se "vrti", a kada je False petlja se prekida...
    while (glavna_petlja == true) 
    { 
    // vitlicastim zagradama { }  se ograduje odreden kod nakon naredbe za petlju, if i sl. odnosno odreduje 
    //  sto se sve izvrsava  unutar te petlje ili if-a, svaki { mora imati i svoj } inace bude svasta :)

    SDL_Event event; // deklarira se varijabla event u koji ce primati input od korisnika

    // ova petlja uzima  iz funkcije SDL_PollEvent nas unos/user input i salje ga u varijablu event
    while (SDL_PollEvent(&event)) 
      {
		
        // ako je pritisnut gumb x na prozoru  varijabla glavna_petlja je false
        // a time se i prekida ova petlja
      if (event.type == SDL_QUIT) glavna_petlja = false; 
        
      if  (event.type == SDL_KEYDOWN) // ako je pritisnut ESC
			{
			// ako je pritisnut ESC varijabla glavna_petlja je false a time se i prekida ova petlja
			if (event.key.keysym.sym == SDLK_ESCAPE) glavna_petlja = false;
			//ako je pritisnuta lijeva tipka (ona strelica lijevo :D ) onda se 
			// pozicija kocke poveca za iznos varijable kocka_brzina
			if (event.key.keysym.sym == SDLK_LEFT) kocka_PozicijaX = kocka_PozicijaX - kocka_brzina;  
			if (event.key.keysym.sym == SDLK_RIGHT) kocka_PozicijaX = kocka_PozicijaX + kocka_brzina;
			if (event.key.keysym.sym == SDLK_UP) kocka_PozicijaY = kocka_PozicijaY - kocka_brzina;
			if (event.key.keysym.sym == SDLK_DOWN) kocka_PozicijaY = kocka_PozicijaY + kocka_brzina;
			}
      }

    // ovaj dio koda puni nas glavni buffer sa RGB bojom 0,0,0 

    // znaci crnom kako bi se mogla u njemu crtati nova slika - odnosno da se nova ne crta preko stare
    // deklaracije varijable color, potrebna kao argument kod punjenja glavnog buffera odredenom bojom
    Uint32 color; 
    // ova funkcija stavlja u varijablu color boju koja se zadana argumentima te funkcije
    color = SDL_MapRGB (glavni_buffer->format, 0, 0, 0); 
    // glavni_buffer se cijelu puni zadanom bojom - crnom 
    SDL_FillRect (glavni_buffer, NULL, color); 
        

    // ovdje se kreira "pravokutnik" sa x,y,w,h vrijednostima  koje opisuju gdje cemo nasu kocku nacrtati 

    // pozicija je SDL_rect tip varijable, a taj tip je struktura, 
    // odnosno varijabla koja se sastoji od vise varijabla - u nasem slucaju x,y,w,h
    SDL_Rect pozicija; 
    pozicija.x = kocka_PozicijaX; // pozicija na x osi 
    pozicija.y = kocka_PozicijaY; // pozicija  na y osi
    pozicija.w = kocka_slika->w; // sirina - pridruzuje se duzina slike u varijabli kocka_slika
    pozicija.h = kocka_slika->h; // duzina - pridruzuje se duzina slike u varijabli kocka_slika

    // crta sadrzaj varijabke kocku_slika u glavni_buffer  na poziciji zadani varijablom pozicija
    SDL_BlitSurface(kocka_slika, NULL, glavni_buffer, &pozicija);
    // prebacuje sadrzaj glavnog buffera u prozor (na ekran)
    SDL_Flip (glavni_buffer);  
    } // kraj glavne peljte i petlja krece iz pocetka --> while (glavna_petlja == true)
return 0;
}

a.k.a. Koki

User avatar
Overseer
Spaaaaaaace!
Spaaaaaaace!
Posts: 593
Joined: Tue Aug 26, 2008 2:02 pm

Re: [C/C++ + SDL] PRVI KORAK - crtanje i micanje slike po ekranu

Post by Overseer » Fri Jun 26, 2009 10:35 pm

Dobar posao, sticky.
Don't combine bracket and dot syntax in Objective-C, it's bad practice and quite irritating.
There is no such thing as a better graphics API. They are just different. And hot. And sexy. I should stop now.
Your matrices are belong to us.

User avatar
ReiKo
Posts: 68
Joined: Tue Aug 26, 2008 8:23 pm

Re: [C/C++ + SDL] PRVI KORAK - crtanje i micanje slike po ekranu

Post by ReiKo » Sat Jun 27, 2009 7:57 pm

Evo ja baš sad radim s SDL bibliotekom, jako dobro samo tako nastavi! :)

Inače probaj još dublje i detaljnije objašnjavati što kako radi, ako možeš naravno, mislim da bi to još više usavršilo ovu seriju tutoriala :)

User avatar
Danijel Korent
Romulanski špijun na Zemlji
Posts: 1583
Joined: Fri Sep 05, 2008 12:35 pm
Smallest prime number bigger than 20: 23
Location: Njemacka
Contact:

Re: [C/C++ + SDL] PRVI KORAK - crtanje i micanje slike po ekranu

Post by Danijel Korent » Sun Jun 28, 2009 9:24 pm

heh.. to sam vise stavio kao template za brzi i lagani pocetak za pocetnike... ne znam dal cu jos sta pisati, C++ i SDL prakticki uopce ne koristim...
a.k.a. Koki

User avatar
ReiKo
Posts: 68
Joined: Tue Aug 26, 2008 8:23 pm

Re: [C/C++ + SDL] PRVI KORAK - crtanje i micanje slike po ekranu

Post by ReiKo » Tue Jun 30, 2009 1:16 pm

OK super no ja ti ipak preporučavam da pokušaš to bolje svojim rječima i dublje opisati :)

Bilo bi dobro da i obradiš SDL_mixer za zvuk :) Naravno, ništa prenapredno nego samo osnovni tutorial kako pokrenuti neku zvučnu datoteku putem konzole.

Samo tako naprijed! :tup:

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest