Je suis entrain de suivre un tutoriel sur le site de zesteDuSavoir pour SDL2 mais je suis arrivé à un moment ou il y un problème d'affichage entre mac et windows, il y a clairement un problème sur mac comme les images suivantes :
Mac :
Windows :
Le code est le même :
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
void pausee();
void createWindows(SDL_Window* window,SDL_Surface* screenSurface);
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main(int argc, char *argv[])
{
SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
int statut = EXIT_FAILURE;
SDL_Rect rect = {100, 100, 100, 100}, dst = {0, 0, 0, 0};
SDL_Color rouge = {255, 0, 0, 255}, bleu = {0, 0, 255, 255};
if(0 != SDL_Init(SDL_INIT_VIDEO))
{
fprintf(stderr, "Erreur SDL_Init : %s", SDL_GetError());
goto Quit;
}
if(0 != SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &window, &renderer))
{
fprintf(stderr, "Erreur SDL_CreateWindowAndRenderer : %s", SDL_GetError());
goto Quit;
}
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET, 200, 200);
if(NULL == texture)
{
fprintf(stderr, "Erreur SDL_CreateTexture : %s", SDL_GetError());
goto Quit;
}
SDL_SetRenderTarget(renderer, texture);
/* La texture est la cible de rendu, maintenant, on dessine sur la texture. */
SDL_SetRenderDrawColor(renderer, bleu.r, bleu.g, bleu.b, bleu.a);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, rouge.r, rouge.g, rouge.b, rouge.a);
SDL_RenderFillRect(renderer, &rect); /* On dessine un rectangle rouge sur la texture. */
SDL_SetRenderTarget(renderer, NULL); /* Le renderer est la cible de rendu. */
/* On récupère les dimensions de la texture, on la copie sur le renderer
et on met à jour l’écran. */
SDL_QueryTexture(texture, NULL, NULL, &dst.w, &dst.h);
SDL_RenderCopy(renderer, texture, NULL, &dst);
SDL_RenderPresent(renderer);
statut = EXIT_SUCCESS;
pausee();
Quit:
if(NULL != texture)
SDL_DestroyTexture(texture);
if(NULL != renderer)
SDL_DestroyRenderer(renderer);
if(NULL != window)
SDL_DestroyWindow(window);
SDL_Quit();
return statut;
}
void pausee()
{
int continuer = 1;
SDL_Event event;
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
}
}
}
void createWindows(SDL_Window* window, SDL_Surface* screenSurface){
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
}
else
{
//Create window
window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
if( window == NULL )
{
printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
}
else
{
//Get window surface
screenSurface = SDL_GetWindowSurface( window );
//Fill the surface white
SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );
//Update the surface
SDL_UpdateWindowSurface( window );
}
}
}
// savoir si un point appartient à un rectangle : fonction de collision
SDL_bool test(SDL_Point point, SDL_Rect rect)
{
if(point.x >= rect.x && point.x <= (rect.x + rect.w) &&
point.y >= rect.y && point.y <= (rect.y + rect.h))
return SDL_TRUE;
else
return SDL_FALSE;
}
// SDL_Bool SDL_HasIntersection(const SDL_Rect*, A, const SDL_Rect* B) permet de savoir si 2 rectangle se touche ( return SDL_True ou SDL_False)
```
J'ai ces problèmes quand je compile :
2021-10-06 10:57:14.969545+0200 ProjetC[49498:1770036] Metal API Validation Enabled
2021-10-06 10:57:15.001930+0200 ProjetC[49498:1770036] Errors found! Invalidating cache...
2021-10-06 10:57:15.053610+0200 ProjetC[49498:1770036] +[MTLIOAccelDevice registerDevices]: Zero Metal services found
À noter que Metal API... et Zero Metal... ont toujours été présent.
Tout cela ressemble à une partie qui serait indéfinie au dela de ton blit de texture.
Je note que ta fonction createWindows (qui elle remplit en blanc la fenêtre) n'est pas utilisée : tu utilises SDL_CreateWindowAndRenderer qui elle ne le fait pas. Malgré tout je n'ai pas vu ton erreur pour l'instant.
Tout cela ressemble à une partie qui serait indéfinie au dela de ton blit de texture.
Je note que ta fonction createWindows (qui elle remplit en blanc la fenêtre) n'est pas utilisée : tu utilises SDL_CreateWindowAndRenderer qui elle ne le fait pas. Malgré tout je n'ai pas vu ton erreur pour l'instant.
C'est normal pour createWindows() c'est lors de mes autres tests j'ai fait beaucoup de modifications. Je vais continuer mes recherches merci.
Après de nombreuses recherches, j'ai réinstaller SDL2 via Homebrew et voici ce que ça donne, je sais pas si c'est mieux ou moins bien que l'autre problème :
Problème résolu.
Voici le code si quelqu'un se retrouve dans la même situation que moi.
#include <stdlib.h>
#include <stdio.h>
#include <SDL2/SDL.h>
void pausee();
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int main(int argc, char *argv[])
{
SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
int statut = EXIT_FAILURE;
SDL_Rect rect = {100, 100, 100, 100}, dst = {0, 0, 0, 0};
SDL_Color rouge = {255, 0, 0, 255}, bleu = {0, 0, 255, 255};
int continuer = 1;
// -- Initialisation SDL
if(0 != SDL_Init(SDL_INIT_VIDEO))
{
fprintf(stderr, "Erreur SDL_Init : %s", SDL_GetError());
goto Quit;
}
if(0 != SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &window, &renderer))
{
fprintf(stderr, "Erreur SDL_CreateWindowAndRenderer : %s", SDL_GetError());
goto Quit;
}
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET, 200, 200);
if(NULL == texture)
{
fprintf(stderr, "Erreur SDL_CreateTexture : %s", SDL_GetError());
goto Quit;
}
statut = EXIT_SUCCESS;
// -- Fin Initialisation SDL
// -- Dessine les rectangles
SDL_SetRenderTarget(renderer, texture); // Mettre le texture comme cible de render
SDL_SetRenderDrawColor(renderer, bleu.r, bleu.g, bleu.b, bleu.a); // Changer le couleur au bleu
SDL_RenderClear(renderer); // Utiliser clear pour mettre la totalité texture en couleur bleu
SDL_SetRenderDrawColor(renderer, rouge.r, rouge.g, rouge.b, rouge.a); // Changer le couleur au rouge
SDL_RenderFillRect(renderer, &rect); // Colorer l'espace qui est defini par rect
SDL_QueryTexture(texture, NULL, NULL, &dst.w, &dst.h); // Sauvegarde la taille de texture au dst
// -- Fin dessine les rectangles
SDL_SetRenderTarget(renderer, NULL); // Mettre la fenetre comme cible de render
// -- Game loop simple
while (continuer)
{
// -- Render
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Changer le couleur au noir
SDL_RenderClear(renderer); // Nettoyer la surface de render
SDL_RenderCopy(renderer, texture, NULL, &dst); // Render la texture au fenetre
SDL_RenderPresent(renderer); // Mettre à jour le framebuffer
// -- Fin render
// -- Ecoute events
SDL_Event event;
while (SDL_PollEvent(&event)) // Ecoute jusqu'à la fin de event queue
{
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONDOWN:
if(event.button.button == SDL_BUTTON_LEFT){
printf("clic gauche\n");
}
break;
}
}
// -- Fin ecoute events
}
// -- Fin game loop simple
Quit:
if(NULL != texture)
SDL_DestroyTexture(texture);
if(NULL != renderer)
SDL_DestroyRenderer(renderer);
if(NULL != window)
SDL_DestroyWindow(window);
SDL_Quit();
return statut;
}
void pausee()
{
int continuer = 1;
SDL_Event event;
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
}
}
}
Après de nombreuses recherches, j'ai réinstaller SDL2 via Homebrew et voici ce que ça donne, je sais pas si c'est mieux ou moins bien que l'autre problème :
J'ai envie de dire que c'est un comportement indéfini dans les deux cas, et c'est pas très positif.
Mais je ne vois pas le soucis dans ton code (ou alors ça ne me saute pas aux yeux) et je n'ai pas de mac.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
git is great because Linus did it, mercurial is better because he didn't.
git is great because Linus did it, mercurial is better because he didn't.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html