Autor Wątek: [SDL] problem z rysowaniem.  (Przeczytany 1109 razy)

Offline dazz007

  • Użytkownik

# Grudzień 17, 2010, 17:45:36
Witam. Jestem początkujący jeśli chodzi w ogóle o graficzne programowanie. Do tej pory robiłem wszystko w konsoli. Chciałbym na początek wyświetlić w okienku wylosowaną tablice. Tj. jeśli wylosowało mi 2,3,5,4 to chciałbym aby w okienku te liczby były przedstawione jako odpowiednio wysokie pionowe słupki, które są obok siebie, np. dla liczby 5 wysokość miałaby 5*10 pixeli itp. Słyszałęm, że SDL do tego się nada. Poczytałem trochę kursów, niestety dalej nie mogę się połapać jak najlepiej narysować takie słupki w SDL. Jest jakaś funkcja, która odrysowałaby to w odpowiednim kolorze?
Proszę o pomoc.
« Ostatnia zmiana: Grudzień 17, 2010, 17:47:33 wysłana przez dazz007 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych


Offline Xirdus

  • Redaktor

# Grudzień 17, 2010, 17:57:29
Pobaw się z SDL_FillRect().

Offline Kamma

  • Użytkownik

# Grudzień 17, 2010, 18:01:57
Użyj funkcji SDL_FillRect

Zapoznaj się najpierw z samouczkami:

@Xirdus
Uprzedziłeś mnie :)


Offline Lerhes

  • Użytkownik

# Grudzień 17, 2010, 18:25:55
Napisałem Ci, bo nie chce mi się poprawiać wykresów w mojej aplikacji:

#include <SDL.h>
#include <vector>

using namespace std;

int main(int argc, char *args[])
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface *ekran = NULL;
ekran = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE | SDL_RESIZABLE);
SDL_Rect slup= SDL_Rect();

vector<int> wek;
wek.push_back(3);
wek.push_back(7);
wek.push_back(16);
wek.push_back(4);
wek.push_back(19);
wek.push_back(11);
wek.push_back(3);

for(size_t i = 0; i < wek.size(); i++)
{
slup.x = 100 + i*15;
slup.y = 300 - wek[i] * 10;
slup.h = wek[i]*10;
slup.w = 10;
SDL_FillRect(ekran, &slup, SDL_MapRGB(ekran->format,  10 *(i+1) %255, 50 *(i+1) %255,  80 *(i+1) %255) );
}
SDL_Flip( ekran );
SDL_Delay(2000);
SDL_Quit();
return 0;
}

Lerhes

Offline dazz007

  • Użytkownik

# Grudzień 17, 2010, 19:33:34
Dzięki wielkie.
Osobiście udało mi się napisać na razie coś takiego:
SDL_Surface * ekran = NULL;
SDL_Surface * slupki = NULL;
SDL_Event zdarzenie;
bool wyjscie = false;
Uint32 zielony;
SDL_Rect r;
int main(int argc, char * args[])
{
int * aTab = new int[10];
LosujNormalnie(aTab,10); //funkcja losujaca

ekran = SDL_SetVideoMode(640, 200, 32, SDL_ANYFORMAT);
slupki = SDL_CreateRGBSurface(320, 200, 32, 320*4, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
int x=10;
for(int i = 0; i < 10; i++)
{
zielony = SDL_MapRGB(slupki->format, 0, 255, 0);
r.x = x;
r.y = ekran -> h - aTab[i];
r.w = 20;
r.h = aTab[i];
SDL_FillRect(slupki, &r, zielony); // narysuj zielony prostokąt
x=x+30;
zielony = SDL_MapRGB(ekran->format, 0, 255, 0);
SDL_FillRect(ekran, &r, zielony);
SDL_Flip(ekran);
}
SDL_WM_SetCaption("Zdarzenia",NULL);

  while(!wyjscie)
  {
    while(SDL_PollEvent(&zdarzenie))
    {
      if(zdarzenie.type == SDL_QUIT)
      {
        wyjscie = true;
      }
    }
  }
  SDL_Quit();
  return 0;
}

Działa tak jak chciałem, żeby działało. Teraz mam inny problem. Mianowicie chciałbym, aby np. w momencie sortowania był pokazany każdy krok. Jak mogę spowolnić drukowanie takiej tablicy? Bo mi od razu wybija posortowana tablice, a chciałbym, żeby pokazało powoli każdy krok.

EDIT: Już nie aktualne. Bo widzę, że SDL_Delay działa:)
« Ostatnia zmiana: Grudzień 17, 2010, 20:18:01 wysłana przez dazz007 »