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

SDL - 2. lekceSDL - 2. 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 - 2. lekce

Google       Google       10. 10. 2005       20 845×

V této lekci se naučíte vykreslit na pozici X a Y barevný pixel podle stupnice RGB...

Reklama
Reklama

Ještě než se pustíme do vykreslení bitmapy, ukážu vám funkci pro vykreslení barevného pixelu na určitou pozici. Budeme k tomu potřebovat kód z první lekce, a proto jej nyní najděte a otevřete.

Ikdyž se vykreslení pixelu může zdát jako jednoduchá věc, je to poměrně složitá záležitost. Ale my si nyní napíšeme funkci, která vše udělá za vás. Dovolil jsem si ji půjčit z tutoriálů od Mariuse Andry, kterému ještě jednou děkuji. Nemusíte všemu v této funkci rozumět, stačí pouze když ji opíšete. Napište tuto funkci nejlépe někde před hlavní funkci main(), nemusíte potom dělat ani prototyp funkce:


void DrawPixel(SDL_Surface *screen, int x, int y,
                       Uint8 R, Uint8 G, Uint8 B){

  Uint32 color = SDL_MapRGB(screen->format, R, G, B);
  switch (screen->format->BytesPerPixel)
  {
    case 1:
      {
        Uint8 *bufp;
        bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
        *bufp = color;
      }
      break;
    case 2:
      {
        Uint16 *bufp;
        bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
        *bufp = color;
      }
      break;
    case 3:
      {
        Uint8 *bufp;
        bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
        if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
        {
          bufp[0] = color;
          bufp[1] = color >> 8;
          bufp[2] = color >> 16;
        } else {
          bufp[2] = color;
          bufp[1] = color >> 8;
          bufp[0] = color >> 16;
        }
      }
      break;
    case 4:
      {
        Uint32 *bufp;
        bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
        *bufp = color;
      }
      break;
  }
}

Kód je tak dlouhý, protože to vykresluje různě podle hodnoty BPP (barevná hloubka). První parametr funkce je vrstva (surface), na kterou se pixel vykreslí. Druhý parametr je pro pozici na ose X daného pixelu a třetí pro osu Y. Čtvrtý, pátý a šestý parametr určuje hodnotu červené, zelené a modré barvy pixelu od 0 do 255.

Ikdyž už máme funkci pro vykreslení pixelu, ještě to není vše. U některých grafických karet totiž při vykreslování musíme vrstvu "zamknout", a proto si ještě napíšeme dvě funkce. Jedna vrstvu v případě nutnosti zamkne a druhá ji pak po vykreslení odemkne. Tyto funkce opět napište kamkoli před hlavní funkci main():


void Lock(SDL_Surface *screen){
  if ( SDL_MUSTLOCK(screen) ){
    if ( SDL_LockSurface(screen) < 0 ){
      exit(1);
    }
  }
}

void Unlock(SDL_Surface *screen){
  if ( SDL_MUSTLOCK(screen) ){
    SDL_UnlockSurface(screen);
  }
}

Funkce Lock() zjistí, zda-li je nutno vrstvu zamknout a pokud ano, tak to provede funkcí SDL_LockSurface(). Pokud má tato funkce návratovou hodnotu 0, je vše vpořádku a vrstva je odemknuta, ale pokud je návratová hodnota menší než 0, program se chybově ukončí. Funkce Unlock() opět zjistí, jestli je zamknutí nutné (a tím pádem jestli je vrstva zamčena) a v tom případě vrstvu odemkne.

A nyní už k vykreslování. Pro přehlednost si vytvoříme funkci DrawScene(), do které vše budeme vykreslovat. Buďte si ale jisti, že je tato funkce umístěna hned před funkci main(), tentokrát je to důležité. Umíme sice vykreslit jen jeden pixel, ale my si jich pomocí cyklu for vykreslíme celé okno a uděláme zajímavý barevný efekt. Takže funkce DrawScene() může vypadat třeba takto:


void DrawScene(SDL_Surface *screen){
  Lock(screen);

  for(int x=0; x<800; x++){
    for(int y=0; y<600; y++){
      DrawPixel(screen, x, y, x/4, y/3, x/8 + y/6);
    }
  }

  Unlock(screen);
  SDL_Flip(screen);
}

Naše funkce má i jeden parametr, a to vrstvu, kterou zamkneme, vykreslíme na ní pixely a pak odemkneme. Po zamknutí vrstvy se spustí cyklus, který vykreslí na každou pozici v našem okně pixel o různých barvách podle hodnot X a Y. Protože má naše okno rozměry 800×600, tak se pixel na ose Y vykreslí 600× a toto vykreslení na ose Y se opakuje 800× po ose X. Tím zaplníme pixely celé okno. Hodnoty červené, zelené a modré barvy jednotlivých pixelů jsou dány různě podle současné pozice pixelů a jsou vyděleny přibližně tak, aby nepřesahovaly maximální hodnotu 255. Nakonec vrstvu zamkneme. A jelikož používáme doublebuffering, bylo všechno zatím vykreslováno jen do paměti a na obrazovku musíme vše teprve vykreslit pomocí příkazu SDL_Flip().

A nyní už jen funkci DrawScene() s parametrem našeho okna screen připíšeme do hlavní smyčky našeho programu ve funkci main() z minulé lekce. Také bych chtěl ještě vyřešit problém se zavíráním okna, připsáním pár řádků s událostmi do této smyčky, avšak vysvětlím vám to až v lekci, kdy budeme brát ovládání klávesnicí. Zatím to prostě jen opište:


while(done == false){
  SDL_Event event;
  while( SDL_PollEvent(&event) ){
    if( event.type == SDL_QUIT ) done=true;
  }

  DrawScene(screen);
}

Toť z této lekce vše. Pokud je vše v pořádku, mělo by se vám otevřít barevné okno a mělo by jít normálně zavřít. Příště si ukážeme vykreslování BMP obrázků.

A tady je zdrojový kód celé lekce:


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

void DrawPixel(SDL_Surface *screen, int x, int y,
                       Uint8 R, Uint8 G, Uint8 B){

  Uint32 color = SDL_MapRGB(screen->format, R, G, B);
  switch (screen->format->BytesPerPixel)
  {
    case 1:
      {
        Uint8 *bufp;
        bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
        *bufp = color;
      }
      break;
    case 2:
      {
        Uint16 *bufp;
        bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
        *bufp = color;
      }
      break;
    case 3:
      {
        Uint8 *bufp;
        bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
        if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
        {
          bufp[0] = color;
          bufp[1] = color >> 8;
          bufp[2] = color >> 16;
        } else {
          bufp[2] = color;
          bufp[1] = color >> 8;
          bufp[0] = color >> 16;
        }
      }
      break;
    case 4:
      {
        Uint32 *bufp;
        bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
        *bufp = color;
      }
      break;
  }
}

void Lock(SDL_Surface *screen){
  if ( SDL_MUSTLOCK(screen) ){
    if ( SDL_LockSurface(screen) < 0 ){
      exit(1);
    }
  }
}

void Unlock(SDL_Surface *screen){
  if ( SDL_MUSTLOCK(screen) ){
    SDL_UnlockSurface(screen);
  }
}

void DrawScene(SDL_Surface *screen){
  Lock(screen);

  for(int x=0;x<800;x++){
    for(int y=0;y<600;y++){
      DrawPixel(screen, x, y, x/4, y/3, x/8 + y/6);
    }
  }

  Unlock(screen);
  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);

  SDL_Surface *screen;
  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);
  }

  bool done=false;

  while(done == false){
    SDL_Event event;
    while( SDL_PollEvent(&event) ){
      if( event.type == SDL_QUIT ) done=true;
    }
    
    DrawScene(screen);
  }

}

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

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 Generace Z: Proč je pro ně důležité, kolik mají follow?

Generace Z: Proč je pro ně důležité, kolik mají follow?

Životem jdou vybaveni chytrým telefonem v ruce a nedokáží si představit, že by to bylo jinak. Narodili se okolo přelomu tisíciletí a nikdy nezažili nic jiného než digitalizovaný svět. Dotykové obrazovky měli poprvé v rukou na základní škole, ti mladší možná už ve školce. Proto mají na svět jiný pohled než jejich předci. První zástupci této generace začínají dospívat a my brzy uvidíme, jestli je to s nimi tak zlé, jak o nich mnohdy tvrdí jejich rodiče.

Reklama
Reklama
Obrázek ke článku Proč mají absolventi v IT přemrštěné očekávání, a je vůbec přemrštěné?

Proč mají absolventi v IT přemrštěné očekávání, a je vůbec přemrštěné?

Poměrně nedávno zveřejnil portál Platy.cz zajímavé statistiky, kde mladí počítačoví experti nastupují do firem s průměrnou mzdou cca 36 000 Kč, hned v závěsu je bankovní sektor se svými cca 31 000 Kč. Pro srovnání – v ostatních oborech se průměrná nástupní mzda pohybuje okolo 28 000 Kč. Nástupní platy jsou samozřejmě ovlivněny i lokalitou zaměstnavatele

Obrázek ke článku Zpětné sledování sportovních přenosů využívá v létě řada lidí.

Zpětné sledování sportovních přenosů využívá v létě řada lidí.

Červenec a srpen představují měsíce, kdy Češi nejčastěji jezdí na vícedenní dovolené. V této době však rovněž probíhá řada důležitých sportovních událostí, jako jsou olympijské hry nebo například právě odehrané fotbalové mistrovství světa. Míra promeškaných sportovních přenosů však klesá díky moderních technologiím a službám. 

Obrázek ke článku Průzkum JetBrains: JavaScript mezi programátory vede, Kotlin získává na popularitě

Průzkum JetBrains: JavaScript mezi programátory vede, Kotlin získává na popularitě

Společnost JetBrains, přední tvůrce softwarových nástrojů pro profesionální vývojáře s centrálou v Praze, představila výsledky průzkumu, který pomáhá lépe porozumět a získat vhled do pracovních návyků programátorů. Zjištění mohou být nápomocná nejen pro zvýšení efektivity, ale také pro vytvoření ideálního pracovního prostředí pro programátory.  

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