[SDL] Mon code ne m'affiche pas mon image ?

Résolu/Fermé
Saylano - Modifié le 6 déc. 2022 à 11:23
mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 - 6 déc. 2022 à 10:59

Bonjour,

Voici un code en C qui ne m'affiche pas mon image. Pourtant, je demande d'afficher un message d'erreur si c'est le cas mais il ne m'affiche rien ?

De l'aide s'il vous plaît ?

#include <SDL.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;
    SDL_Texture *texture = NULL;
    SDL_Surface *surface = NULL;

    int Quit;
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();


    if (SDL_Init(SDL_INIT_VIDEO) != 0)
    {
        SDL_Log("Erreur SDL_Init");
        Quit;
    }

    window = SDL_CreateWindow("Mario", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1066, 600, 0);

    if (!window)
    {
        SDL_Log("Erreur SDL_CreateWindow");
        Quit;
    }

    renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_SOFTWARE);

    if (!renderer)
    {
        SDL_Log("Erreur SDL_CreateRenderer");
    }

    /****************************************/

    surface = SDL_LoadBMP("src/mmario.bmp");

    if (!surface)
    {
        SDL_Log("Erreur SDL_LoadBMP");
        Quit;
    }

    texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_FreeSurface(surface);           /* On libère la surface, on n’en a plus besoin */

    if (!texture)
    {
        SDL_Log("Erreur SDL_CreateTextureFromSurface");
        Quit;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    SDL_Delay(3000);
    return EXIT_FAILURE;
}


Windows / Chrome 108.0.0.0

A voir également:

1 réponse

mamiemando Messages postés 33346 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 7 803
Modifié le 6 déc. 2022 à 11:01

Bonjour,

Alors quelques précisions préalable, il faut utiliser SDL2 pour compiler ce code. Avant d'expliquer comment faire, je me permets de t'indiquer ce qui ne va pas dans le code que tu proposes pour que tu comprennes pourquoi il ne marche pas 

  • Il n'y a pas de boucle d'événements, or toute librairie permettant d'afficher une interface graphique repose sur un tel mécanisme. C'est ce qui permet au programme d'attendre qu'il se passe quelque chose. Si tu sors de ce paradigme, ça ne marchera pas car les fonctions ne sont pas prévues pour.
  • Tu détruis en début de programme des choses que tu n'as même pas encore créé.
  • Tu n'utilises pas renderer pour afficher l'image.

Par ailleurs et même si ça n'a rien à avoir avec ton problème appeler "Quit;" n'a aucun effet. C'est un entier, le programme l'évalue, mais ne fait rien de cette valeur. Si tu supprimais les lignes correspondantes, le programme se comporterait donc exactement pareil. Je pense que tu as voulu déclarer une fonction (dans ce cas il aurait fallu l'appeler plutôt quit pour suivre les conventions du C).

#include <stdio.h>

void quit() {
    printf("quit\n");
}

int main() {
    quit();
    return 0;
}

Pour corriger ton programme, on peut repartir de cet exemple. Afin de rendre la réponse plus concise j'ai enlevé toutes les vérifications que tu prenais le soin de faire sur les créations d'objets SDL, mais idéalement tu peux les remettre c'est plus propre.

#include <stdio.h>
#include <SDL2/SDL.h>

#define WIDTH 800
#define HEIGHT 600

int main (int argc, char *argv[]) {
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        return 1;
    }   
    
    SDL_Window * window = SDL_CreateWindow("Image Loading", 100, 100, WIDTH, HEIGHT, 0);
    SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    SDL_Surface * surface = SDL_LoadBMP("toto.bmp");
    SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_Rect rectangle;
    SDL_QueryTexture(texture, NULL, NULL, &rectangle.w, &rectangle.h);
    rectangle.x = (WIDTH - rectangle.w) / 2;
    rectangle.y = (HEIGHT - rectangle.h) / 2;
    
    while (1) {
        SDL_Event e; 
        if (SDL_WaitEvent(&e)) {
            if (e.type == SDL_QUIT)
                break;
            else if (e.type == SDL_KEYUP && e.key.keysym.sym == SDLK_ESCAPE)
                break;
        }            
        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, texture, NULL, &rectangle);
        SDL_RenderPresent(renderer);
    }                
                     
    SDL_DestroyTexture(texture);
    SDL_FreeSurface(surface);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    return 0;
}

Bonne chance

0