Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL2 / Xcode : Fenetre ne s'affiche pas

Ma première fenêtre ne s'ouvre pas !!

Sujet résolu
15 juillet 2019 à 7:12:21

Bonjour,
Je suis le cours "Apprenez à programmer en C".

J'utilise l'IDE Xcode (10.2.1) et la SDL2.
J'ai bien compris qu'il y avait des différences entre la SDL et la SDL2 et j'ai essayé de les prendre en compte.
Mon code pour afficher une fenêtre ne bug pas en revanche, il n'affiche rien.
3 jours que j'essaie de trouver une solution sans résultat.

Pouvez vous m'aider ?
Voici mon code :)

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

int main(int argc, const char * argv[]) {
    
    SDL_Window *window = NULL;       
    
    SDL_Init(SDL_INIT_VIDEO);              // Initialize SDL2
    
    // Create window
    window = SDL_CreateWindow(
                              "Test",                  // window title
                              SDL_WINDOWPOS_UNDEFINED,           // initial x position
                              SDL_WINDOWPOS_UNDEFINED,           // initial y position
                              640,                               // width, in pixels
                              480,                               // height, in pixels
                              SDL_WINDOW_OPENGL                  // flags
                              );
    
    // Check that the window was successfully created
    if (window == NULL) {
        // In the case that the window could not be made...
        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }
    
    // The window is open
    
    SDL_Delay(3000);  // Pause execution for 3000 milliseconds
    
    // Close the window
    SDL_DestroyWindow(window);
    
    // Clean up
    SDL_Quit();
    return 0;
}



Merci !!!


-
Edité par Farofa 15 juillet 2019 à 7:28:07

  • Partager sur Facebook
  • Partager sur Twitter
15 juillet 2019 à 10:46:19

Bonjour,

Tu ne crée pas de SDL_Renderer* dans ton code. Et quand cela sera fait pense à utiliser la fonction SDL_RenderPresent( ) qui prend en paramètre un pointeur de SDL_Renderer (pour qu'il mette à jour la fenêtre, en fait cette fonction sert à afficher une fois que l'on a tout déssiné, le résultat du rendu). ;)

Plus d'infos sur cette page du wiki SDL2 : https://wiki.libsdl.org/SDL_CreateRenderer?highlight=%28%5CbCategoryRender%5Cb%29%7C%28CategoryEnum%29%7C%28CategoryStruct%29

Sinon, il y a un tutoriel sur la SDL2 sur "zeste de savoir".

-
Edité par Warren79 15 juillet 2019 à 10:48:19

  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

15 juillet 2019 à 12:19:26

Salut,

En fait sur OSX, la fenêtre ne s'affiche pas tant que tu ne fais pas quelque chose (afficher quelque chose dessus, etc.). Regarde ce sujet.

PS : pourquoi utiliser le flag SDL_WINDOW_OPENGL ? Et vérifie aussi le retour de SDL_Init.

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
16 juillet 2019 à 7:23:31

Merci à vous deux !

J'ai utilisé la solution proposée par Yoan qui me parait plus légère et ne renvoie pas d'erreur :

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

int main(int argc, char *argv[]) {
    
    int status =  EXIT_FAILURE;
    SDL_Window *fenetre = NULL;
    SDL_Event event;
    
    // Initialisation + vérification de la SDL : VIDEO.
    if (SDL_Init(SDL_INIT_VIDEO) != 0 ) {
        fprintf(stdout,"Échec de l'initialisation de la SDL : %s\n", SDL_GetError());
        goto quit;
    }
    
    // Création fenêtre.
    fenetre = SDL_CreateWindow("Tuto SDL 2.", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
    if(fenetre == NULL) {
        fprintf(stderr, "Impossible de créer la fenêtre : %s\n", SDL_GetError());
        goto quit;
    }
    
    do {
        SDL_WaitEvent(&event);
    }while(event.type != SDL_QUIT);
    SDL_DestroyWindow(fenetre);
    status = EXIT_SUCCESS;
    
quit:
    // Quitter SDL.
    SDL_Quit();
    
    return status;
}

Cette solution ne fait pas appel à SDL_Renderer.

Du coup, je ne comprends pas bien pourquoi la fenêtre ne s'affiche pas quand on lui demande de rester ouverte 3 secondes alors qu'elle s'ouvre si on lui demande d'attendre un "Event" (en l'occurence que l'utilisateur ferme la fenêtre manuellement).

Tout n'est pas encore limpide pour moi, mais ça fonctionne et ca me permet de continuer le court ;)

Merci et à la prochaine... j'ai pas fini d'avoir besoin de vous :)

  • Partager sur Facebook
  • Partager sur Twitter
16 juillet 2019 à 8:59:02

Bonjour,

La , tu nous montre juste une fonction main (donc pas de fonction à priori) , mais surtout n' hésite pas à découper ton code en fonctions dans tes futurs programmes (chaque fonction ne devrait faire qu'une seule tache, mais le faire bien). En fait on voit souvent des débutants qui postent du code avec un 'int main(int argc, cahr *argv[]' bien trop long. :)

  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

16 juillet 2019 à 12:48:30

Warren79 a écrit:

Bonjour,

La , tu nous montre juste une fonction main (donc pas de fonction à priori) , mais surtout n' hésite pas à découper ton code en fonctions dans tes futurs programmes (chaque fonction ne devrait faire qu'une seule tache, mais le faire bien). En fait on voit souvent des débutants qui postent du code avec un 'int main(int argc, cahr *argv[]' bien trop long. :)


En effet, c'est un reflexe que je dois aussi acquérir. Merci :)

  • Partager sur Facebook
  • Partager sur Twitter
8 avril 2023 à 3:10:41 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


8 avril 2023 à 3:59:55

@KamgaFostsoChristElise Bonsoir, merci de bien vouloir créer votre propre sujet dans le respect des règles du forum. Je vous envoie un message privé.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter