2015-12-29 1 views
0

Je travaille sur un petit jeu pour l'école. J'ai carrelé une image à l'écran, mais chaque fois que mon personnage bouge, je dois le recoller (les tuiles sont derrière le personnage, car c'est une grille et le personnage se déplace dans les cellules). J'ai essayé de tout coller sur une surface différente, puis j'ai fait maculer cette surface sur la surface de mon écran pour éviter d'avoir à la retiler à chaque fois et économiser sur le temps de traitement. Ça n'a pas vraiment fonctionné, c'est comme si la surface sur laquelle je dormais oublie ce qui était carrelé dessus. Il ne l'erreur pas, il n'affiche pas la surface carrelée sur la surface de ma fenêtre.Blitting une surface sur une autre surface (SDL2, C++, VS2015)

Voici mon code (la partie concernée au moins)

void postaviTiles() { 

SDL_BlitSurface(cell, NULL, polje, &offsetcell); //cell 

for (int i = 0; i < 89; i++) { 
    SDL_Delay(5); 
    if (offsetcell.x < 450) { 
     offsetcell.x += 50; 
     SDL_BlitSurface(cell, NULL, polje, &offsetcell); 
    } 

    else { 
     offsetcell.x = 9; 
     offsetcell.y += 50; 
     SDL_BlitSurface(cell, NULL, polje, &offsetcell); 
    } 
    SDL_UpdateWindowSurface(okno); 
} 

poljezrisano = true; 
} 

//--------------------------------------------------------------// 

void tileCells() { 

if (poljezrisano == false) { 
    postaviTiles();} 

SDL_BlitSurface(polje, NULL, oknoSurface, NULL); //cell 
SDL_UpdateWindowSurface(okno); 
} 

//--------------------------------------------------------------// 

Il convient de mentionner que ce carrelage chaque fois fonctionne très bien, mais je veux tuiles une fois, avoir que sur une surface et puis juste bliter cette surface sur ma surface d'écran.

PS: Désolé pour la plupart des variables et des noms de fonction ne pas être en anglais

Répondre

1

Le SDL_BlitSurface prend dans une surface source, un extrait de cette surface source, la surface de destination et une position où vous souhaitez afficher (Blit) votre source.

Le dernier paramètre transmis à SDL_BlitSurface ignore la largeur et la hauteur, il prend juste le x an y.

Voici une citation du documentation:

La largeur et la hauteur dans srcrect déterminer la taille du rectangle copié. Seule la position est utilisée dans le dstrect (la largeur et la hauteur sont ignorées).

Et le prototype de la fonction:

int SDL_BlitSurface(SDL_Surface* src, 
       const SDL_Rect* srcrect, 
       SDL_Surface* dst, 
       SDL_Rect*  dstrect) 

C'est une chose à garder à l'esprit, pas sûr si cela s'applique à votre cas, étant donné que vos noms de variables ne sont pas anglais.

Mais essentiellement avec cette ligne:

SDL_BlitSurface(cell, NULL, polje, &offsetcell); 

Vous dites que vous voulez SDL toutes cellules placées à l'intérieur polje au offsetcell.x de position et offsetcell.y avec la largeur de cell.w et la hauteur de cell.h.

Si vous voulez placer cellule à l'intérieur polje en utilisant la largeur et la hauteur de offsetcell alors vous devez utiliser une autre fonction blit, à savoir SDL_BlitScaled

Voici comment je blit tuiles à l'intérieur d'une grille (carte).

SDL_Surface* grid; // assuming this is the new grid surface that holds the blited tiles 
SDL_Surface* tile; // assuming this is a single tile of width 50, height 50 
SDL_Surface* windowSurface; 
SDL_Window* window; 

int TileWidth = 50; 
int TileHeight = 50; 
int NumTiles = 90; 
int TileColumns = 450/TileWidth; // = 9, so we have a grid of 9X10 

bool isFillGridTiles = false; 

void FillGridTiles() 
{ 
    for (int i = 0;i < NumTiles; i++) 
    { 
     auto y = i/TileColumns; // divide to get the y position and... 
     auto x = i % TileColumns; // the remainder is the x position inside the grid 

     SDL_Rect srcClip; 
     srcClip.x = 0; 
     srcClip.y = 0; 
     srcClip.w = TileWidth; 
     srcClip.h = TileHeight; 

     SDL_Rect dstClip; 
     dstClip.x = x * TileWidth; 
     dstClip.y = y * TileHeight; 
     dstClip.w = TileWidth; 
     dstClip.h = TileHeight; 

     SDL_BlitSurface(tile, &srcClip, grid, &dstClip); //since we have the same width and height, we can use SDL_BlitSurface instead of SDL_BlitScaled 

    } 

    isFillGridTiles = true; 
} 

void BlitOnScreen() 
{ 
    if(!isFillGridTiles) 
    { 
     FillGridTiles(); 
    } 

    SDL_BlitSurface(grid, NULL, windowSurface, NULL); 
    SDL_UpdateWindowSurface(window); 
} 
1

Vous ne savez pas si le code est complet tel qu'il a été publié, mais il semble que vous n'initialisiez pas la cellule offset. Cela correspond au symptôme de n'avoir rien montré. La définition explicite de la cellule offset peut être meilleure que la méthode incrémentielle que vous avez fournie. Par exemple:

for(offsetcell.x = 0; offsetcell.x < 450; offsetcell.x += 50) { 
    for(offsetcell.y = 0; offsetcell.y < 450; offsetcell.y += 50) { 
     ... 
    } 
}