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

SDL - 3. lekceSDL - 3. lekce

 

SDL - 3. lekce

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

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 RAD Studio a Windows Store

RAD Studio a Windows Store

RAD Studio je první vývojové prostředí se zabudovanou podporou balení aplikací typu Win32 a Win64 pro jejich umístění a šíření prostřednictvím Windows 10 Store.

Reklama
Reklama
Obrázek ke článku Testujte na 2 400+ Android a iOS zařízení

Testujte na 2 400+ Android a iOS zařízení

V dnešní době, kdy většina softwaru pro mobilní aplikace je tvořena a distribuována průběžně, mnohdy do celého světa je třeba zajistit také průběžnou automatizaci testování mobilního softwaru. V případě mobilních aplikací pro Android a iOS začíná být problém, jak testovat na obrovském množství kombinací HW variant, rozměrů, edic operačních systémů různých výrobců v různých částech světa na reálných zařízení. Simulátory a emulátory nejsou většinou to pravé. Pokud již testuji, jak si udělat vlastní beta distribuci opravdovým reálným testerům napříč platformami?

Obrázek ke článku Funkcie main vo Windows API

Funkcie main vo Windows API

V tretej časti seriálu o Windows API budeme hovoriť o funkčných prototypoch main. Funkčný prototyp je tvorený názvom funkcie a typom signatúry, pričom sa vynecháva telo funkcie. 

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ý