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

SDL - 3. lekceSDL - 3. lekce

 

SDL - 3. lekce

Google       zatím neprovedena       30. 10. 2005       13 038×

V této lekci se naučíme vykreslit do našeho okna bitmapový obrázek (BMP) na určitou pozici...

Reklama
Reklama

Tato lekce je rozšířením předchozí 2. lekce, avšak teď nebudeme potřebovat funkce DrawPixel(), Lock(), ani Unlock(). Takže pokud vyloženě nechcete vykreslovat pixely i zde, můžete tyto funkce klidně smazat. Dále vymažte obsah funkce DrawScene(), protože zde nyní budeme vykreslovat naše bitmapy. A také smažte jediný parametr této funkce, jak v její definici, tak při jejím volání ve funkci main().

Začneme tím, že si vytvoříme další vrstvu SDL_Surface, do které posléze načteme obrázek. Nazveme si ji třeba image. Potřebujeme, aby byla globální - přístupná pro všechny funkce, a proto ji umístěte hned pod include soubory. Tam přesuňte i vrstvu screen, kterou jsme v předchozích lekcích měli pouze ve hlavní funkci main().

SDL_Surface *screen;
SDL_Surface *image;

Obrázek, který budeme chtít zobrazit, si pojmenujte image.bmp a umístěte jej do stejné složky jako výsledný exe program naší aplikace. Pro načítání obrázků do vrstev si vytvoříme funkci LoadImages(), i když je obrázek zatím jen jeden. V této funkci obrázky načteme funkcí SDL_LoadBMP(), jejíž jediný parametr určuje cestu k obrázku, takto:

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

Tuto funkci můžeme umístit hned pod definice našich vrstev. Pod ní si dále napíšeme funkci DrawIMG() pro vykreslení onoho obrázku z určité vrstvy na vrstvu našeho okna. Má tři parametry: první je vrstva, ze které se bude vykreslovat, druhý je pozice X, kde chceme obrázek vykreslit a třetí je pozice Y.

V této funkci si nejdříve vytvoříme strukturu rect typu SDL_Rect, která ponese některé údaje o obrázku. Zatím nám jde jenom o pozice X a Y, a proto je předáme proměnným rect.x a rect.y z proměnných x a y (druhý a třetí parametr funkce DrawIMG()). Poté vyvoláme funkci SDL_BlitSurface() pro konečné vykreslení obrázku. První parametr je vrstva, ze které se obrázek vykresluje. Ten se zjistí při volání funkce DrawIMG() z prvního parametru (proměnná img). Druhý parametr v této lekci nevyužijeme, a proto mu předáme hodnotu NULL. Třetí parametr je vrstva, na kterou se vykresluje, což je v našem případě permanentně vrstva screen. A čtvrtému parametru předáme adresu struktury rect s údaji o pozici. Zdrojový kód funkce DrawIMG() vypadá takto:

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

Nyní už jen stačí přepsat funkci DrawScene(). Tentokrát to bude jednoduché - vyvoláme funkci DrawIMG() s vrstvou image a libovolnou pozicí. Já zde mám 0 a 0, takže se obrázek vykreslí v levém horním rohu okna. A funkci SDL_Flip(screen) známe už z minula, ta nám průběžně aktualizuje vrstvu screen (okno).

void DrawScene(){
  DrawIMG(image, 0, 0);
  SDL_Flip(screen);
}

Nakonec ještě nesmíme zapomenout ve funkci main() vyvolat naši funkci na načtení obrázků LoadImages() kdekoliv před hlavní smyčkou.

Pokud je vše v pořádku, měl by se vám na určené pozici v okně vykreslit váš obrázek. Výsledný zdrojový kód by měl vypadat asi takto:

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

SDL_Surface *screen;
SDL_Surface *image;

void LoadImages(){
  image = SDL_LoadBMP("image.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 DrawScene(){
  DrawIMG(image, 0, 0);
  SDL_Flip(screen);
}

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

  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();
  
  bool done=false;

  while(done == false){
    SDL_Event event;
    while(SDL_PollEvent(&event)){
      if(event.type == SDL_QUIT) done=true;
    }
    
    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.

3 názory  —  3 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 Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres HCPP16 pořádá od 30. září do 2. října nezisková organizace Paralelní Polis již potřetí, a to ve stejnojmenném bitcoinovém prostoru v pražských Holešovicích. Letos přiveze na třídenní konferenci přes 40 většinou zahraničních speakerů – lídrů z oblastí technologií, decentralizované ekonomiky, politických umění a aktivismu. Náměty jejich přednášek budou také hacking, kryptoměny, věda, svoboda nebo kryptoanarchie.

Reklama
Reklama
Obrázek ke článku ICT PRO školení zaměřené nejenom na ICT

ICT PRO školení zaměřené nejenom na ICT

Dovolte, abychom se představili. Jsme zaměstnanci společnosti ICT Pro, profesionálové v oblasti poskytování komplexních ICT služeb. Neboli služeb spojených s informačními a komunikačními technologiemi, které dnes - ve 21. století - tvoří  nedílnou součást běžného provozu všech moderních firem.

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 © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý