Skocz do zawartości

[SDL|C++]Rysowanie tła w grze


ShadowTeam

Polecane posty

Przesiadłem się z DDraw na SDL(brak alphablendingu i rotacji bitmap :<) i mam parę problemów...

 

1.Czy można w SDL dodać kolorowy kursor? Udało mi się do tej pory tylko czarno-biały...

2.Jak utworzyć powierzchnię w SDL(sic!)? Chodzi o to, że do tej pory wskaźnik na powierzchnie działa tylko po np. załadowaniu do niej bitmapy funkcją SDL_LoadBMP, a chodzi mi o np. zadeklarowanie powierzchni "background" i kopiowanie jej na screen, a uzupełnianie z "elements" (aktualnie blituje elements na screen)...

3.Przygotowałem sobie do układania tła takie funkcję jak poniżej, jednak powodują one powstanie artefaktów(części obrazka położonego na prawo i dół na prawej i dolnej krawędzi ekranu), w DDraw do usuwania tego służył clipper... Jak to jest rozwiązanie w SDL? Zamieszczam kod mojej klasy:

 #define MAP_SIZE_Y 12
#define MAP_SIZE_X 16
#define TILE_SIZE_X 48
#define TILE_SIZE_Y 48
class Map
{
// Map() {sufrace_source = NULL, sufrace = NULL; };
// ~Map();
public:         
  void SetArea(int row, int col, int value);
  void SetArea(unsigned short int table[MAP_SIZE_X][MAP_SIZE_Y]);
  unsigned short int GetArea(int row, int col);
  void DrawMap(SDL_Surface *sufrace, SDL_Surface *sufrace_source);
  SDL_Surface *sufrace_source;
  SDL_Surface *sufrace;
private:      
  unsigned short int Area[MAP_SIZE_Y][MAP_SIZE_X]; 
  inline void DrawTile(int Pos_x, int Pos_y, int x, int y, SDL_Surface *sufrace, SDL_Surface *sufrace_source);
};

void Map::SetArea(int row, int col, int value)
{
Area[row][col] = value;                  
};

void Map::SetArea(unsigned short int table[MAP_SIZE_X][MAP_SIZE_Y])
{
 for(int y=0;(y < MAP_SIZE_Y);y++){
  for(int x=0;(x < MAP_SIZE_X);x++){          
   Area[x][y] = table[x][y];
  }      
 }               
};

unsigned short int Map::GetArea(int row, int col)
{
 return Area[row][col];               
};

void Map::DrawMap(SDL_Surface *sufrace, SDL_Surface *sufrace_source)
{
 for (int y=0;(y < SCREEN_RESOLUTION_Y / TILE_SIZE_X);y++) { 
   for (int x=0;(x < SCREEN_RESOLUTION_X / TILE_SIZE_Y);x++) { 
     DrawTile(x*TILE_SIZE_X,y*TILE_SIZE_Y,x,y, sufrace, sufrace_source); 
   }  
 }
};

inline void Map::DrawTile(int Pos_x, int Pos_y, int x, int y, SDL_Surface *sufrace, SDL_Surface *sufrace_source)
{ 
 int i = Area[x][y];
 int bitmap_elements_rows;
 bitmap_elements_rows = sufrace_source->w/TILE_SIZE_X;
 int src_x = i%bitmap_elements_rows, src_y = i/bitmap_elements_rows;
 SDL_Rect Source = {src_x*TILE_SIZE_X,src_y*TILE_SIZE_Y,src_x*TILE_SIZE_X+TILE_SIZE_X,src_y*TILE_SIZE_Y+TILE_SIZE_Y};
 apply_surface(Pos_x, Pos_y, sufrace_source, sufrace, Source);

}

Link do komentarza
Udostępnij na innych stronach

CYTAT(ShadowTeam @ śro, 20 maj 2009 - 19:20)

1.Czy można w SDL dodać kolorowy kursor? Udało mi się do tej pory tylko czarno-biały...

 

Kursor jako kursor może być zdaje się tylko czarno-biały, ale można to obejść rysując co się chce w pozycji kursora, a sam kursor ukryć.

2.Jak utworzyć powierzchnię w SDL(sic!)? Chodzi o to, że do tej pory wskaźnik na powierzchnie działa tylko po np. załadowaniu do niej bitmapy funkcją SDL_LoadBMP, a chodzi mi o np. zadeklarowanie powierzchni "background" i kopiowanie jej na screen, a uzupełnianie z "elements" (aktualnie blituje elements na screen)...

Po przeczytaniu tutoriala powinno być jasne jak zrobić powierzchnię: http://lazyfoo.net/SDL_tutorials/index.php

Link do komentarza
Udostępnij na innych stronach

Kursor jako kursor może być zdaje się tylko czarno-biały, ale można to obejść rysując co się chce w pozycji kursora, a sam kursor ukryć.

 

Po przeczytaniu tutoriala powinno być jasne jak zrobić powierzchnię: http://lazyfoo.net/SDL_tutorials/index.php

 

Wywala

 

'struct SDL_PixelFormat' has no member named 'rMask'  

 

próbowałem tego wcześniej... A co z pytaniem nr.3?

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...