SDL - 5. lekce
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

SDL - 5. lekceSDL - 5. lekce

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno

SDL - 5. lekce

Google       Google       10. 11. 2005       12 275×

Vylepšíme 4. lekci tak, aby za posunovaným obrázkem nezůstávala šmouha a do pozadí si vykreslíme další bitmapu...

Reklama
Reklama

Když má aplikace pozadí, tak se dá tento problém vyřešit jednoduše. Při každém opakování funkce DrawScene() se nejdříve vykreslí pozadí, které minulý obrázek překryje a až pak se vykreslí obrázek na nové pozici. Avšak pokud se při každém opakování hlavní smyčky překresluje každý pixel v okně, i když to v tom místě zrovna není nutné, dává to procesoru docela zabrat. A proto si napíšeme pár funkcí, díky kterým se bude pozadí vykreslovat pouze v potřebných místech.

Nejprve si však vytvoříme samotnou SDL_Surface vrstvu s pozadím, nazvanou background. Umístěte ji samozřejmě k ostatním globálním vrstvám. Dále do ní ve funkci LoadImages() načtěte obrázek nazvaný třeba bg.bmp stejně, jako do vrstvy image v minulé lekci.


void LoadImages(){
  image = SDL_LoadBMP("image.bmp");
  background = SDL_LoadBMP("bg.bmp");
}

Tento obrázek by měl mít rozměry 800x600, stejně jako naše okno, protože ho chceme přes celé pozadí. Úplně celý si ho v aplikaci vykreslíme jen jednou, a to nejlépe hned po volání funkce LoadImages() ve funkci main(). Souřadnice X a Y jsou nulové.


LoadImages();
DrawIMG(background, 0, 0);

Pokud kód zkompilujete teď, bude ve výsledném programu pozadí, ale šmouha za posunovaným obrázkem zůstává pořád.

Nyní si napíšeme funkci pro vykreslení jen určité části obrázku. Můžeme si ji opět nazvat DrawIMG(), protože má 7 parametrů a C++ umožňuje mít více funkcí se stejným názvem, ale jiným počtem parametrů.

První tři parametry zůstávají stejné, tedy vrstva, ze které se bude vykreslovat a pozice X a Y obrázku v okně. Další dva parametry určují, jak velká část obrázku se vykreslí, resp. její šířka a výška. Poslední dva parametry jsou souřadnice X a Y v obrázku, odkud se vyřízne obdélník požadované velikosti a pak se vykreslí do okna.


void DrawIMG(SDL_Surface *img, int x, int y, int w, int h,
                                           int x2, int y2){
  SDL_Rect rect;
  rect.x = x;
  rect.y = y;
  SDL_Rect rect2;
  rect2.x = x2;
  rect2.y = y2;
  rect2.w = w;
  rect2.h = h;
  SDL_BlitSurface(img, &rect2, screen, &rect);
}

Oproti první funkci DrawIMG() zde přibyla ještě struktura rect2, která nese údaje o rozměrech a pozici vykreslované části z obrázku. Tato struktura se pak předá druhému parametru funkce SDL_BlitSurface().

Teď se přesuneme do funkce DrawScene(). Před vykreslením posunovaného obrázku potřebujeme "vymazat" obrázek z minulého opakování smyčky tím, že jej překreslíme částí pozadí na tom samém místě. A protože se z minula mohl obrázek kterýmkoliv směrem o jeden pixel posunout, bude tato část pozadí na každé straně o jeden pixel delší, dohromady tedy na ose X i Y o 2 pixely. A zároveň jej posuneme o jeden pixel doleva a nahoru.


void DrawScene(){
  DrawIMG(background, image_x-1, image_y-1, 130, 130,
                                image_x-1, image_y-1);
  DrawIMG(image, image_x, image_y);
  SDL_Flip(screen);
}

Můj obrázek má rozměry 128x128, takže část pozadí, která u mně překresluje předchozí obrázek, má rozměry 130x130. Pokud byste např. měli obrázek 100x100, byla by část pozadí velká 102x102 px.

To je vše, za obrázkem by už nyní neměla zůstávat šmouha. Zde je zdrojový kód lekce:


#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>

SDL_Surface *screen;
SDL_Surface *image;
SDL_Surface *background;

int image_x, image_y;

void LoadImages(){
  image = SDL_LoadBMP("image.bmp");
  background = SDL_LoadBMP("bg.bmp");
}

void DrawIMG(SDL_Surface *img, int x, int y){
  SDL_Rect rect;
  rect.x = x;
  rect.y = y;
  SDL_BlitSurface(img, NULL, screen, &rect);
}

void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2){
  SDL_Rect rect;
  rect.x = x;
  rect.y = y;
  SDL_Rect rect2;
  rect2.x = x2;
  rect2.y = y2;
  rect2.w = w;
  rect2.h = h;
  SDL_BlitSurface(img, &rect2, screen, &rect);
}


void DrawScene(){
  DrawIMG(background, image_x-1, image_y-1, 130, 130, image_x-1, image_y-1);
  DrawIMG(image, image_x, image_y);
  SDL_Flip(screen);
}

int main(int argc, char *argv[]){

  Uint8* keys;

  if( SDL_Init(SDL_INIT_VIDEO) < 0 ){
    printf("Inicializace SDL se nezdařila: %s
", SDL_GetError());
    exit(1);
  }

  atexit(SDL_Quit);
  screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);

  if ( screen == NULL ){
    printf("Vytvoření okna se nezdařilo: %s
", SDL_GetError());
    exit(1);
  }
  
  LoadImages();
  DrawIMG(background, 0, 0);
  
  bool done=false;

  while(done == false){
    SDL_Event event;
    while(SDL_PollEvent(&event)){
      if(event.type == SDL_QUIT) done = true;
      if(event.type == SDL_KEYUP){
        if(event.key.keysym.sym == SDLK_RETURN) done = true;
      }
    }
    
    keys = SDL_GetKeyState(NULL);
    if(keys[SDLK_RIGHT]) image_x += 1;
    if(keys[SDLK_LEFT]) image_x -= 1;
    if(keys[SDLK_DOWN]) image_y += 1;
    if(keys[SDLK_UP]) image_y -= 1;
    
    DrawScene();
  }

}

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

4 názory  —  4 nové  
Hlasování bylo ukončeno    
0 hlasů
Google
Autor programuje v C++, resp. využívá knihovnu SDL. Sportuje, má rád hudbu a zvířata.

Nové články

Obrázek ke článku Generace Z: Proč je pro ně důležité, kolik mají follow?

Generace Z: Proč je pro ně důležité, kolik mají follow?

Životem jdou vybaveni chytrým telefonem v ruce a nedokáží si představit, že by to bylo jinak. Narodili se okolo přelomu tisíciletí a nikdy nezažili nic jiného než digitalizovaný svět. Dotykové obrazovky měli poprvé v rukou na základní škole, ti mladší možná už ve školce. Proto mají na svět jiný pohled než jejich předci. První zástupci této generace začínají dospívat a my brzy uvidíme, jestli je to s nimi tak zlé, jak o nich mnohdy tvrdí jejich rodiče.

Reklama
Reklama
Obrázek ke článku Proč mají absolventi v IT přemrštěné očekávání, a je vůbec přemrštěné?

Proč mají absolventi v IT přemrštěné očekávání, a je vůbec přemrštěné?

Poměrně nedávno zveřejnil portál Platy.cz zajímavé statistiky, kde mladí počítačoví experti nastupují do firem s průměrnou mzdou cca 36 000 Kč, hned v závěsu je bankovní sektor se svými cca 31 000 Kč. Pro srovnání – v ostatních oborech se průměrná nástupní mzda pohybuje okolo 28 000 Kč. Nástupní platy jsou samozřejmě ovlivněny i lokalitou zaměstnavatele

Obrázek ke článku Zpětné sledování sportovních přenosů využívá v létě řada lidí.

Zpětné sledování sportovních přenosů využívá v létě řada lidí.

Červenec a srpen představují měsíce, kdy Češi nejčastěji jezdí na vícedenní dovolené. V této době však rovněž probíhá řada důležitých sportovních událostí, jako jsou olympijské hry nebo například právě odehrané fotbalové mistrovství světa. Míra promeškaných sportovních přenosů však klesá díky moderních technologiím a službám. 

Obrázek ke článku Průzkum JetBrains: JavaScript mezi programátory vede, Kotlin získává na popularitě

Průzkum JetBrains: JavaScript mezi programátory vede, Kotlin získává na popularitě

Společnost JetBrains, přední tvůrce softwarových nástrojů pro profesionální vývojáře s centrálou v Praze, představila výsledky průzkumu, který pomáhá lépe porozumět a získat vhled do pracovních návyků programátorů. Zjištění mohou být nápomocná nejen pro zvýšení efektivity, ale také pro vytvoření ideálního pracovního prostředí pro programátory.  

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032018 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý