2017-02-21 1 views
-1

J'ai donc trois classes Application, DrawMgr et Cube. Dans Application.cpp est ma boucle principale dans laquelle j'appelle DrawMgr :: DrawCube dans lequel j'appelle Cube :: Draw.Dessin SDL_Surface d'une autre classe

Application.cpp

while (!quit) 
{ 
    //Draw Background 
    gDrawMgr.DrawBackground(); 

    gDrawMgr.DrawCube(); 

    //UpdateScreen 
    gDrawMgr.UpdateScreen(); 

    //Handle events on queue 
    while (SDL_PollEvent(&e) != 0) 
    { 
     //User requests quit 
     if (e.type == SDL_QUIT || e.key.keysym.sym == SDLK_ESCAPE) 
     { 
      quit = true; 
     } 
    } 
} 

DrawMgr.cpp

SDL_Surface* screenSurface; 

void DrawMgr::DrawCube() 
{ 
    gCube.Draw(screenSurface); 
} 

Cube.cpp

void Cube::Draw(SDL_Surface* destination) 
{ 
    SDL_Rect offset; 
    offset.x = 100; 
    offset.y = 100; 

    SDL_FillRect(cube, NULL, SDL_MapRGB(cube->format, 0, 0, 0)); 

    SDL_BlitSurface(cube, NULL, destination, &offset); 
} 

Quand je lance le programme, le cube ne semble pas, que suis-je mal faire?

+0

Donc, vous dites que cela fonctionne aussi longtemps que vous ne divisez pas votre code dans trois catégories distinctes? – Martin

+0

Oui, c'est le cas. Je devrais probablement mentionner que gCube et gDrawMgr sont des objets que j'utilise globalement avec extern. –

+0

Où écrivez-vous réellement à l'écran, 'Cube :: Draw' dessine sur la surface' screenSurface'. 'SDL_Flip' est alors nécessaire pour dessiner dans le tampon d'affichage. –

Répondre

0

Etes-vous sûr d'utiliser SDL2.0? Parce que les choses ont changé, vous avez besoin d'un SDL_Renderer et d'une SDL_Texture. On dirait que vous essayez de le faire dans le SDL 1 chemin.

En SDL2, pour mettre à jour l'écran, nous utilisons ces appels

SDL_RenderClear (sdlRenderer);

SDL_RenderCopy (sdlRenderer, sdlTexture, NULL, NULL);

SDL_RenderPresent (sdlRenderer);

RenderClear pour effacer le contenu de l'écran. RenderCopy pour dessiner de la texture dessus. RenderPresent pour dessiner le résultat final à l'écran.

Allez voir le guide de migration pour plus de détails sur le nouveau flux.

https://wiki.libsdl.org/MigrationGuide

+0

Il est encore possible de faire des blit sur la surface de la fenêtre si l'on veut vraiment. – keltar

+0

@keltar Vous pouvez, mais vous obtiendrez un meilleur FPS avec SDL_Texture et ces appels Render. – jordsti

+0

Cela dépend. Mais de toute façon, mon point était que le code en question pourrait être complètement SDL2 valide, même si pour certaines personnes, il peut sembler "pas assez". – keltar