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

SDL - 3. lekceSDL - 3. lekce

 

SDL - 3. lekce

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

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 Seznamte se s open source platformou NopCommerce – 1. díl

Seznamte se s open source platformou NopCommerce – 1. díl

Hledáte e-commerce řešení, které si dokážete přizpůsobit podle vašich požadavků? Chcete čistý a srozumitelný kód, se kterým bude radost pracovat? Prozkoumejte s námi možnosti open source projektu NopCommerce. Seriál programování pod NopCommerce Vám pomůže překonat první kroky nejistoty a úspěšně zvládnout vývoj pod platformou NopCommerce.

Reklama
Reklama
Obrázek ke článku Facebook spouští službu Marketplace V ČR

Facebook spouští službu Marketplace V ČR

Společná platforma Marketplace usnadní lidem na Facebooku vyhledávání, nákup a prodej použitého zboží na lokální úrovni. Bude tak přímou konkurencí pro weby a aplikace se stejným zaměřením jako je například Letgo, Bazoš, Aukro, Sbazar a další.

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