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 224×

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 Pracujete u počítače ve stoje? Dbejte na správné držení těla

Pracujete u počítače ve stoje? Dbejte na správné držení těla

Práce ve stoje je jedna z variant, jak změnit polohu těla při dlouhodobé práci u počítače. Především je důležité nezapomínat na správné držení těla, abychom při práci nenamáhali naší krční páteř. Primářka MUDr. Michaela Tomanová představí hlavní bonusy a rizika práce u počítače ve stoje.

Obrázek ke článku Firmy musejí s nástupem Průmyslu 4.0 více dbát na kyberbezpečnost. V ohrožení je i jejich know-how.

Firmy musejí s nástupem Průmyslu 4.0 více dbát na kyberbezpečnost. V ohrožení je i jejich know-how.

Destabilizace firmy či ukradené know-how. To jsou možná hlavní budoucí rizika spojená s nedostatečnou kybernetickou bezpečností průmyslových firem, na která upozorňují experti. Vzhledem k postupující digitalizaci výrobních či technologických procesů a přechodu k takzvanému Průmyslu 4.0 může těchto hrozeb postupně přibývat. Varují před nimi i nejnovější průzkumy. 

Obrázek ke článku Nový CEBIT je připraven: Pochopit digitální dnešek a objevit digitální zítřek

Nový CEBIT je připraven: Pochopit digitální dnešek a objevit digitální zítřek

Nový veletrh  CEBIT je připraven. V polovině června začne v Hannoveru evropský festival obchodu s radikálně změněnou koncepcí věnovaný inovacím a digitalizaci.  CEBIT jedinečnou formou spojuje obchod v digitálním hospodářství 
s festivalovými prvky a posouvá do středu pozornosti téma digitální transformace hospodářství a společnosti.  

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