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

SDL - 5. lekceSDL - 5. lekce

 

SDL - 5. lekce

Google       Google       10. 11. 2005       14 020×

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

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 Hybridní inteligentní systémy 2

Hybridní inteligentní systémy 2

V technické praxi využíváme často kombinaci různých disciplín umělé inteligence a klasických výpočtů. Takovým systémům říkáme hybridní systémy. V tomto článku se zmíním o určitém typu hybridního systému, který je užitečný ve velmi složitých výrobních procesech.

Obrázek ke článku Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Vedení týmu v oboru informačních technologií se nijak zvlášť neliší od jiných oborů. Přesto však IT manažeři čelí výzvě v podobě velmi rychlého rozvoje a tím i rostoucími nároky na své lidi. Udržet pozornost, motivaci a efektivitu týmu vyžaduje opravdu pevné manažerské základy a zároveň otevřenost a flexibilitu pro stále nové výzvy.

Obrázek ke článku Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Za poslední rok se podoba práce zaměstnanců změnila k nepoznání. Především plošné zavedení home office, které mělo být zpočátku jen dočasným opatřením, je pro mnohé už více než rok každodenní realitou. Co ale dělat, když se při práci z domova ztrácí motivace, zaměstnanci přestávají komunikovat a dříve fungující tým se rozpadá na skupinu solitérů? Odborníci na personalistiku dali dohromady několik rad, jak udržet tým v chodu, i když pracovní podmínky nejsou ideální.

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