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

SDL - 5. lekceSDL - 5. lekce

 

SDL - 5. lekce

Google       Google       10. 11. 2005       11 508×

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

Reklama
Reklama
Obrázek ke článku Nový IT hráč na českém trhu

Nový IT hráč na českém trhu

V roce 2015 otevřela v Praze na Pankráci v budově City Tower své kanceláře společnost EPAM Systems (NYSE:EPAM), jejíž centrála se nachází v USA. Společnost byla založená v roce 1993 a od té doby prošla velkým vývojem a stále roste.

Obrázek ke článku České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace opět hledají nejlepší nápady pro internet věcí

České Radiokomunikace (CRA) pořádají druhý ročník CRA IoT Hackathonů. Zájemci z řad vývojářů a fanoušků moderních technologií mohou změřit své síly a během jediného dne sestrojit co nejzajímavější funkční prototyp zařízení, které bude komunikovat prostřednictvím sítě LoRa. CRA IoT Hackathony se letos uskuteční ve dvou fázích, na jaře a na podzim, v různých městech České republiky. Jarní běh se odstartuje 31. března v Brně a 7. dubna v Praze.

Obrázek ke článku Cloud computing je využíván stále intenzivněji

Cloud computing je využíván stále intenzivněji

Využívání cloud computingu nabývá na intenzitě. Jen v letošním roce vzroste podle analytiků trh se službami veřejného cloudu o 18 %, přičemž o téměř 37 % vzrostou služby typu IaaS. Růst o více než pětinu pak čeká služby poskytování softwaru formou služby, tedy SaaS. Aktuálním trendům v oblasti využívání cloudu se bude věnovat konference Cloud computing v praxi, která se koná 23. března. 2017 v pražském Kongresovém centru Vavruška na Karlově náměstí 5.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý