Autor Wątek: Kolejne problemy z SDL'em. Tym razem tekst.  (Przeczytany 2447 razy)

Offline Arthes

  • Użytkownik
    • Gromaniak

# Kwiecień 30, 2011, 18:14:00
Witam!

Piszę sobie taki prosty silniczek w C++ i SDL'u, który wykorzystałbym do stworzenia kilku gier. Aktualnie mam coś takiego:

main.cpp
#include <SDL.h>
#include <Arthes.h>
//Tutaj inicjalizacja wskaźników na powierzchnię
//-----
 SDL_Surface* image;
//-----

 int main(int argc, char *args[]) {
 SDL_Init(SDL_INIT_EVERYTHING);
 Screen = SDL_SetVideoMode(1360,768,32,SDL_DOUBLEBUF | SDL_FULLSCREEN);
 SDL_WM_SetCaption("Nauka SDL",NULL);

 bool done = true;

 image = LoadImage(0,0,"image.bmp");
 while(done){
 while(SDL_PollEvent(&Event)) {
 if(Event.type == SDL_QUIT) done = false;
 
 //Zdarzenia typu Keydown
 //-----
 if(Event.type == SDL_KEYDOWN) {
 if(Event.key.keysym.sym == SDLK_ESCAPE) done = false;
 }
 //-----
 }}               
 SDL_Flip(Screen);
 SDL_Quit(); 
 return 0;
}

Arthes.h
/*
Framework pod SDL'a napisany przez Arthesa do użytku własnego.
Używanie tylko za zgodą autora.

Spis funkcji:
LoadImage(x,y,src) - wczytuje obrazek do powierzchni, i zwraca go.


*/
SDL_Surface * Screen;
SDL_Event Event;
SDL_Surface * LoadImage(int x,int y, char* src) {
SDL_Surface * image = NULL;
image = SDL_LoadBMP(src);

SDL_Rect  rect;
rect.x = x;
rect.y = y;
SDL_BlitSurface(image, NULL, Screen, &rect);
return image;
}

Wszystko działa super. Tylko mam problem- w jaki sposób pobierać, oraz edytować dane sprite'a? Chodzi mi dokładnie o pobieranie jego pozycji, oraz jej zmienianie, i pobieranie rozmiarów. Prosiłbym o zrozumiałe, przyjazne odpowiedzi dla żółtodzioba, ponieważ z SDL mam styczność dopiero od kilku dni. Pozdrawiam!
« Ostatnia zmiana: Maj 01, 2011, 21:11:48 wysłana przez Arthes »

Offline Mr. Spam

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

Offline Lerhes

  • Użytkownik

# Kwiecień 30, 2011, 18:53:05
Napisz dokładnie o co chodzi?

Z tego co zrozumiałem, chcesz po prostu po użyciu funkcji LoadImage dostać dane o pozycji i ewentualnie je modyfikować?
image = LoadImage(0,0,"image.bmp");
//Zmiana
image.x = 10;
image.y = 20;
Nie wiem czy o to chodziło, więc opisz dokładnie na czym co chcesz zrobić.
Lerhes

Offline Arthes

  • Użytkownik
    • Gromaniak

# Kwiecień 30, 2011, 18:55:07
Tak, właśnie o coś takiego mi chodzi. Abym mógł to wykorzystać do stworzenia np. poruszanie spritem przy pomocy klawiatury.

Offline ANtY

  • With fury and fire
  • Użytkownik
    • ANtY

  • Zbanowany
# Kwiecień 30, 2011, 19:12:54
No to czyli już wiesz, tak?

Offline Arthes

  • Użytkownik
    • Gromaniak

# Kwiecień 30, 2011, 19:32:42
Nie, bo tamto wyżej nie działa ;/

Offline Rokuzo

  • Użytkownik
    • Masz na sprzedaż klucze do cs go?

# Kwiecień 30, 2011, 19:34:40
http://pl.wikibooks.org/wiki/C++/Klasy
lub najlepiej przeczytaj część o C++ z megatutoriala Xiona.

SDL_Surface *Screen;

class Sprite
{
   private:
      SDL_Surface *image;
      SDL_Rect  rect;
   public:
      Sprite(int X, int Y, char *Src);
      void ReDraw();
      void SetX(int X);
      void SetY(int Y);
      int GetX();
      int GetY();
};
Sprite::Sprite(int X, int Y, char *Src)
{
   image = SDL_LoadBMP(Src);
   rect.x = X;
   rect.y = Y;
   SDL_BlitSurface(image, NULL, Screen, &rect);
}
void Sprite::ReDraw()
{
    SDL_BlitSurface(image, NULL, Screen, &rect);
}
void Sprite::SetX(int X)
{
  rect.x = X;
}
void Sprite::SetY(int Y)
{
  rect.y = Y;
}
int Sprite::GetX()
{
   return rect.x;
}
int Sprite::GetY()
{
   return rect.y;
}

Sprite *Hero = new Sprite(10, 20, "image.bmp"); //Na początku maina
Hero->SetX(50); //Ustawiamy pozycje X na 50
Hero->SetY(25); //Ustawiamy pozycje Y na 25
Hero->ReDraw(); //Rysujemy postać
cout << Hero->GetX() << endl; //Pobieramy pozycje X postaci i wyświetlamy
cout << Hero->GetY(); //Pobieramy pozycje Y postaci i wyświetlamy
delete Hero; //Na końcu maina podczas wyłączania programu

Sam nie wiem czy wszystko napisałem ok ;p jakiś czas już nie piszę w C++ ^^ zresztą nie wiem jak jest w SDL z rysowaniem powierzchni :(

@Down
Mój błąd ;p poprawiłem chyba

EDIT :
Mam taką prośbę ... zajrzyj do jakiegoś tutoriala C++ będzie Tobie potem 100x łatwiej znając chociaż podstawy języka ;p
« Ostatnia zmiana: Kwiecień 30, 2011, 20:15:48 wysłana przez Rokuzo »

Offline Arthes

  • Użytkownik
    • Gromaniak

# Kwiecień 30, 2011, 20:03:00
Dzięki wielkie za odpowiedź, jednakże pojawiło się kilka błędów:
new initializer expression list treated as compound expression
 no matching function for call to `Sprite::Sprite(const char[10])'
 candidates are: Sprite::Sprite()
 base operand of `->' has non-pointer type `Sprite'

Próbuję wywalczyć, żeby działało, ale ciągle te same błędy ;/

Edit:
Teraz coś takiego:
`SetX' has not been declared
Czyli już bardzo blisko :)

Edit2: Moja pomyłka, działa!!! :D Dziękuję bardzo, jesteś wielki ;)

Oki, to zajrzę, szczerze mówiąc to w C++ dopiero kilka dni kodzę, wcześniej to był Python i PHP ;)
« Ostatnia zmiana: Kwiecień 30, 2011, 20:17:31 wysłana przez Arthes »

Offline Arthes

  • Użytkownik
    • Gromaniak

# Maj 01, 2011, 21:10:48
Teraz mam inny problem. Na bazie klasy Sprite zrobiłem klasę Text:

class Text{
   private:
      SDL_Surface *text;
  SDL_Rect rect;
   public:
      Text(int x, int y, char *Texts);
      void Draw();
};
Text::Text(int x, int y, char *Texts) {
   rect.x=x;
   rect.y=y;
   TTF_Font* Font = TTF_OpenFont("arial.ttf", 20);
   SDL_Color Color = {255,255,255};
   text = TTF_RenderText_Solid(Font, Texts, Color);
}
void Text::Draw()
{
    SDL_BlitSurface(text, NULL, Screen, &rect);
}

Kompiluje się bez problemu, jednakże nie rysuje tekstu, a dobrze klasę wywołuję, tak jak w przypadku spritów. Wydaje mi się, że to coś z główną funkcją jest nie tak, ale nie wiem co ;/

Offline Xirdus

  • Redaktor

# Maj 01, 2011, 21:25:39
rect.h, rect.w?

Offline Arthes

  • Użytkownik
    • Gromaniak

# Maj 01, 2011, 21:33:12
To one są potrzebne, żeby wyświetlić tekst?

Edit: Dodanie tych wartości nic nie zmieniło, nadal tekst się nie wyświetla.

Offline Rokuzo

  • Użytkownik
    • Masz na sprzedaż klucze do cs go?

# Maj 01, 2011, 22:14:36
class Text
{
   private:
      SDL_Surface *Text;
      TTF_Font *Font;
      SDL_Rect Rect;
      SDL_Color Color;
   public:
      Text(int x, int y, int r, int g, int b, char *FontName, int Size, char *Texts);
      void SetText(char *Texts);
      void SetX(int x);
      void SetY(int y);
      int GetX();
      int GetY();
      void Draw();
};
Text::Text(int x, int y, int r, int g, int b, char *FontName, int Size, char *Texts)
{
   Color = {r, g, b}; 
   Font = TTF_OpenFont(FontName, Size);
   Text = TTF_RenderText_Solid(Font, Texts, Color);
   Rect = {x, y, 0, 0};
}
void Text::SetText(char *Texts)
{
   Text = TTF_RenderText_Solid(Font, Texts, Color);
}
void Text::SetX(int x)
{
   Rect[0] = x;
}
void Text::SetY(int y)
{
   Rect[1] = y;
}
int Text::GetX()
{
   return Rect[0];
}
int Text::GetY()
{
   return Rect[1];
}
void Text::Draw()
{
    SDL_BlitSurface(Text, NULL, Screen, &Rect);
}

Text *Hello = new Text(0, 0, 255, 0, 0, "Arial.ttf", 20, "Hello World");
/*
Tworzy napis Hello World zaczynający się na pozycji 0, 0 ;p o kolorze czerwonym czcionką arial i rozmiarze 20.
*/
Hello->Draw();

Ale pewnie takie coś nie zadziała.. zresztą jak już tworzysz silnik ew. framework to ładowanie czcionki itp. wepchniesz do menadżera zasobów itd.
A samo wyświetlanie tekstu jak dla mnie to powinna być jedna funkcja (np. menadżera Sceny) a nie klasa, do której ładujemy wskaźnik na fonta.
« Ostatnia zmiana: Maj 01, 2011, 22:24:36 wysłana przez Rokuzo »

Offline Arthes

  • Użytkownik
    • Gromaniak

# Maj 01, 2011, 22:26:48
Kurde, nie działa ;/ Będę to chyba musiał zrobić na zasadzie funkcji, bez klasy ;/