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

SDL - 3. lekceSDL - 3. lekce

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

SDL - 3. lekce

Google       zatím neprovedena       30. 10. 2005       15 699×

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 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.

Reklama
Reklama
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í.

Obrázek ke článku Konference: Moderní informační systémy podporují automatizaci

Konference: Moderní informační systémy podporují automatizaci

Současná situace v šíření onemocnění Covid-19 klade na řadu firem nové nároky a mnohé z nich jsou nyní více než kdy jindy závislé na nejmodernějších informačních technologiích. Proto i v oblasti podnikových informačních systémů vidíme rostoucí důraz na automatizaci nebo na důslednou integraci. Také o těchto trendech se bude mluvit na konferenci Firemní informační systémy, která se koná 24.9.2020 v pražském Kongresovém centru Vavruška na Karlově náměstí.

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