2016-06-26 1 views
1

J'essaie de changer la couleur d'arrière-plan de ma fenêtre en SDL avec un accès au niveau des pixels (je fais une explosion de particules), mais l'arrière-plan reste blanc.SDL ne restitue pas les pixels

D'abord, j'essayé d'utiliser memset pour régler la mémoire des pixels à 0x00 pour changer la couleur au noir (je memset parce que je suis suivais un tutoriel qui a utilisé)

memset(buffer, 0x00, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(Uint32));

Depuis didn « t travail que je levais les yeux comment changer la couleur de tirage du moteur de rendu et est venu avec:

SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 255);

Voici ma texture, renderer, et le code tampon et comment configurer le w indow (SCREEN_WIDTH et SCREEN_HEIGHT sont const ints fixées à 800 et 600 respectivement):

SDL_Window* window = SDL_CreateWindow("Fire Particle Explosion", 
    SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
    SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC); 
SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, SCREEN_WIDTH, SCREEN_HEIGHT); 
Uint32* buffer = new Uint32[SCREEN_WIDTH * SCREEN_HEIGHT]; 

SDL_UpdateTexture(texture, NULL, buffer, SCREEN_WIDTH * sizeof(Uint32)); 
SDL_RenderClear(renderer); 
SDL_RenderCopy(renderer, texture, NULL, NULL); 
SDL_RenderPresent(renderer); 

Comment pourrais-je changer correctement le pixel d'arrière-plan par pixel, et pourquoi aucun des moyens que j'essayé le travail?

Répondre

1

Vous n'avez pas besoin de manipuler un tampon en mémoire pour y parvenir, et vous n'aurez peut-être pas besoin de texture. La méthode recommandée consiste à utiliser les fonctions "2D Accelerated Rendering" dans SDL2. Commencez tout d'abord sans le paramètre "SDL_RENDERER_PRESENTVSYNC" et utilisez "0" à la place. Sous Linux, certains anciens pilotes graphiques produisent des scintillements avec ce drapeau.

Cela devrait effacer l'écran en noir:

SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 255); 
SDL_RenderClear(renderer); 

Je vous conseille fortement d'utiliser SDL_RenderDrawPoint() afin de mettre à jour le pixel de l'écran par pixel. Il est accéléré par le matériel.

En gros, voici ce qui se passe dans votre boucle de jeu:

- set the color to black, then erase the screen with SDL_RenderClear() 
- for each point to draw, first set the draw color, then draw the point 
- use SDL_RenderPresent() 

J'ai écrit un petit exemple de code de SDL2 en C pour faire des explosions de particules: drawpoints

+0

Même en commentant toutes les tampon et code de texture, et en commutant 'SDL_RENDERER_PRESENTVSYNC' à '0', 'SDL_SetRenderDrawColor (renderer, 0x00, 0x00, 0x00, 255); SDL_RenderClear (moteur de rendu); ' ne change pas la couleur de l'arrière-plan en noir. J'ai essayé de regarder votre exemple mais je suis nouveau en C++ et je ne comprends pas beaucoup des choses que vous utilisez (ex: #define au lieu de const statique, kbs, typedef struct, etc.). Une idée de pourquoi il ne rend pas l'écran noir avec ces deux lignes (toujours pas d'erreurs ou d'avertissements) –

+0

Je pense que vous essayez d'aller trop vite. Vous devriez commencer par apprendre la programmation C avant de sauter dans la programmation SDL. Une fois que vous vous sentez prêt, faites les tutoriels sur http://lazyfoo.net/tutorials/SDL/. –

+0

Je veux apprendre le C++ pas C, je sens que si j'apprends le C d'abord je vais obtenir les deux confus plus tard. Je connais une petite quantité de C++ (voir https://www.udemy.com/free-learn-c-tutorial-beginners/, je suis au tutoriel d'effets de particules). Enfin, je n'ai pas l'intention d'utiliser SDL, il est simplement utilisé comme support pour apprendre à créer un projet en utilisant ce qui a été appris dans le reste du tutoriel. –