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

SDL - 6. lekceSDL - 6. lekce

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

SDL - 6. lekce

Google       Google       22. 11. 2005       12 800×

Jednoduché animace a průhlednost obrázku..

Reklama
Reklama

Dnes opět navážeme na předchozí lekci a trochu ji vylepšíme. Z posunovaného obrázku uděláme animaci a zároveň můžeme některé jeho části udělat průhledné. Jde však zatím o animace velmi jednoduché a ne moc dobré, protože rychlost střídání obrázků animace není závislá na čase, ale na rychlosti procesoru.

Animaci si složíme ze čtyř snímků. Všechny budou mít rozměry 128x128px a naskládáme si je všechny vedle sebe do obrázku image.bmp, který se posléze načte do SDL_Surface vrstvy image. To znamená, že celkově bude mít tento obrázek rozměry 512x128 px.

Pokud chcete mít nějakou část animace průhlednou, vybarvěte ji jakoukoli barvou, kterou jinde v animaci nepoužíváte a zapište si její hodnoty červené zelené a modré barvy. Aby tato barva byla ve vrstvě image průhledná zajistíme funkcí SDL_SetColorKey().


SDL_SetColorKey(image, SDL_SRCCOLORKEY,
              SDL_MapRGB(image->format, 0, 0, 0));

Klíčové jsou poslední při parametry funkce SDL_MapRGB(), což jsou hodnoty červené, zelené a modré barvy (0-255). V mojí aplikaci se stane průhlednou barva úplně černá (0, 0, 0), avšak vy si můžete zvolit kteroukoli jinou. Funkci vyvolejte ve funkci main() přibližně pod voláním funkce LoadImages().

Dále si vytvoříme globální proměnnou frame typu int, která bude sloužit pro střídání jednotlivých snímků animace. Počáteční hodnotu ponecháme nulovou.


int frame=0;

Ve funkci DrawScene() trochu upravíme vykreslování obrázku tak, aby se vždy vykreslila jen jeho určitá část (jeden ze snímků animace) podle hodnoty proměnné frame.


DrawIMG(image, image_x, image_y, 128, 128, frame*128, 0);

Jak vidíte, použil jsem delší variantu funkce DrawIMG(). První tři parametry zůstávají stejné, jako předtím, další dva parametry znamenají, že se z obrázku vyřízne čtverec o rozměrech 128x128 px a poslední dva parametry určují, z jakých souřadnic v obrázku se tento čtverec vyřízne. Pozice na ose X je určena proměnnou frame, jejíž hodnoty se pohybují od 0 do 3. Toto číslo se pak vynásobí 128 (šířka obrázku). Pozice na ose Y je vždy nulová.

Nakonec zajistíme, aby se po každém volání funkce DrawScene() inkrementovala proměnná frame a pokud bude její hodnota 3, tak se vrátí zpět na nulu.


if(frame++ == 3) frame=0;

To je vše. Obrázek by nyní měl být animovaný. Snímky se sice pravděpodobně střídají velmi rychle, ale v některé z příštích lekcí budeme moci ovládat rychlost střídání snímků podle času. Zde je zdrojový kód lekce:


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

SDL_Surface *screen;
SDL_Surface *image;
SDL_Surface *background;

int image_x, image_y;
int frame=0;

void LoadImages(){
  image = SDL_LoadBMP("image.bmp");
  background = SDL_LoadBMP("bg.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 DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2){
  SDL_Rect rect;
  rect.x = x;
  rect.y = y;
  SDL_Rect rect2;
  rect2.x = x2;
  rect2.y = y2;
  rect2.w = w;
  rect2.h = h;
  SDL_BlitSurface(img, &rect2, screen, &rect);
}


void DrawScene(){
  DrawIMG(background, image_x-1, image_y-1, 130, 130, image_x-1, image_y-1);
  DrawIMG(image, image_x, image_y, 128, 128, frame*128, 0);
  SDL_Flip(screen);
}

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

  Uint8* keys;

  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();
  DrawIMG(background, 0, 0);
  SDL_SetColorKey(image, SDL_SRCCOLORKEY, SDL_MapRGB(image->format, 0, 0, 0));
  
  bool done=false;

  while(done == false){
    SDL_Event event;
    while(SDL_PollEvent(&event)){
      if(event.type == SDL_QUIT) done = true;
      if(event.type == SDL_KEYUP){
        if(event.key.keysym.sym == SDLK_RETURN) done = true;
      }
    }
    
    keys = SDL_GetKeyState(NULL);
    if(keys[SDLK_RIGHT]) image_x += 1;
    if(keys[SDLK_LEFT]) image_x -= 1;
    if(keys[SDLK_DOWN]) image_y += 1;
    if(keys[SDLK_UP]) image_y -= 1;
    
    DrawScene();
    if(frame++ == 3) frame=0;
  }

}

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

Reklama
Reklama
Obrázek ke článku Nebezpečí ukrytá v USB: z nuly na škvarek za pět sekund

Nebezpečí ukrytá v USB: z nuly na škvarek za pět sekund

Za cenu šesti dolarů lze celkem bez obtíží koupit nový, líbivě vyhlížející flash disk. Přidaná hodnota, které se vám spolu s ním dostane, už tak moc líbivá není. To, co se před pár sekundami tvářilo jako externí disk, se po připojení k počítači změní v důmyslné elektrické křeslo, které vaše zařízení v onen příslovečný škvarek promění za pár sekund. Cílovou skupinou pro koupi takových zařízení by mohli být záškodníci, kteří by tímto způsobem osnovali pomstu třeba vůči záletnému partnerovi. 

Obrázek ke článku Znalosti, dovednosti i prestižní titul MBA: Jde to i moderně a online

Znalosti, dovednosti i prestižní titul MBA: Jde to i moderně a online

Snad nikdy není špatná příležitost na investici do hodnotného vzdělání. Obzvlášť v případě, že absolvent dovede teoretické poznatky přetavit v praktické dovednosti, využitelné při řešení problémů i v komunikaci. Právě na to se specializuje studijní program MBA Řízení informačních technologií, vyučovaný na Business Institutu.

Obrázek ke článku Coding Bootcamp Praha: Obor IT krize nepoznamenala, žádaní jsou weboví vývojáři

Coding Bootcamp Praha: Obor IT krize nepoznamenala, žádaní jsou weboví vývojáři

Pandemie Covid-19 otřásla trhem práce v základech. Dopady krize pocítilo celkově až 45 % zaměstnanců. Není divu, že čím dál větší jistotu přináší obor IT. Ten zůstal krizí téměř nepoznamenán a při nutnosti začít dělat věci na dálku se ještě více ukázalo, jak moc mnohé firmy kvalitní IT potřebují. Do IT nyní přicházejí začátečníci, kteří v něm vidí lukrativní budoucnost a jistotu, ale i freelanceři a zaměstnanci z oborů zasažených krizí

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