Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu Snake en C avec SDL 2

    7 décembre 2019 à 19:18:10

    Bonjour/bonsoir a tous je suis entrain d'essayer de cree un Jeu Snake a l'aide de la SDL :p

    Je rencontre actuellement un problème. :euh:
    J'ai crée un menu avec une image de fond qui contient déjà les fonction Start, Info, et Quitter. Mais je suis arriver a un petit problème. Je dois donc crée une zone dans laquelle je peux cliquer en utilisant les coordonnée de celle-ci et ainsi obtenir le résultat demander 


    Et ça va faire maintenant 1 semaines que je suis confronté à un problème, j'ai trouver quelque solution par ci, par la, mais n'arrive pas a bien les intégrer a mon code.

    Voici le Menu que je vais utiliser 

    https://imgur.com/e7qpvF5

    Et voici mon code le problème ce trouve au niveau des switch event :

    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL.h>
    #include <SDL_image.h>
    
    #define WINDOW_WIDTH 1280
    #define WINDOW_HEIGHT 720
    
    
    void SDL_ExitWithError(const char* message);
    
    int main(int argc, char* argv[])
    {
    	SDL_Window* window = NULL;
    	SDL_Renderer* renderer = NULL;
    
    	//Lancement SDL
    	if (SDL_Init(SDL_INIT_VIDEO) != 0)
    		SDL_ExitWithError("Initialisation SDL");
    
    	//Création fenêtre et du rendu 
    	if (SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer) != 0)
    		SDL_ExitWithError("Impossible de creer la fenetre et le rendu");
    
    	/*.............................................................*/
    	SDL_bool program_launched = SDL_TRUE;
    	while (program_launched)
    	{
    		SDL_Event event;
    
    
    		while (SDL_PollEvent(&event))
    		{
    
    
    			SDL_Surface* image = NULL;
    			SDL_Texture* texture = NULL;
    			
    			image = SDL_LoadBMP("Menu de jeu.bmp");
    
    			if (image == NULL)
    			{
    				SDL_DestroyRenderer(renderer);
    				SDL_DestroyWindow(window);
    				SDL_ExitWithError("Impossible de charger l'image");
    			}
    			texture = SDL_CreateTextureFromSurface(renderer, image);
    			SDL_FreeSurface(image);
    
    			if (texture == NULL)
    			{
    				SDL_DestroyRenderer(renderer);
    				SDL_DestroyWindow(window);
    				SDL_ExitWithError("Impossible de creer la texture");
    			}
    
    			SDL_Rect rectangle;
    
    			if (SDL_QueryTexture(texture, NULL, NULL, &rectangle.w, &rectangle.h) != 0)
    			{
    				SDL_DestroyRenderer(renderer);
    				SDL_DestroyWindow(window);
    				SDL_ExitWithError("Impossible de charger la texture");
    			}
    
    			rectangle.x = (WINDOW_WIDTH - rectangle.w) / 2;
    			rectangle.y = (WINDOW_HEIGHT - rectangle.h) / 2;
    
    			if (SDL_RenderCopy(renderer, texture, NULL, &rectangle) != 0)
    			{
    				SDL_DestroyRenderer(renderer);
    				SDL_DestroyWindow(window);
    				SDL_ExitWithError("Impossible d'afficher la texture");
    			}
    
    			SDL_RenderPresent(renderer);
    
    			SDL_Rect positionPlay;
    
    			SDL_Rect positionInfo;
    
    			SDL_Rect positionQuitter;
    			positionQuitter.x = 360;
    			positionQuitter.y = 250;
    			positionQuitter.h = 100;
    			positionQuitter.w = 520;
    			
    
    			switch (event.type)
    			{
    			case SDL_MOUSEBUTTONDOWN:
    				if (event.button.button == SDL_BUTTON_LEFT && positionQuitter.x <  event.button.x ->w &&
    					positionQuitter.y < event.button.y ->h)/* On arrête le programme si on a fait un clic gauche */
    					program_launched = SDL_FALSE;
    				break;
    
    			case SDL_QUIT:
    				program_launched = SDL_FALSE;
    				break;
    
    			default:
    				break;
    			}
    		}
    	}
    	/*................................................................*/
    
    	SDL_DestroyRenderer(renderer);
    	SDL_DestroyWindow(window);
    	SDL_Quit();
    
    	return EXIT_SUCCESS;
    }
    
    void SDL_ExitWithError(const char* message)
    {
    	SDL_Log("ERREUR : %s > %s\n", message, SDL_GetError());
    	SDL_Quit();
    	exit(EXIT_FAILURE);
    }

    Un grand merci au personnes qui me répondront et qui m'aiderons a progresser dans l'apprentissage a la programmation

    -
    Edité par AbcAbc6 7 décembre 2019 à 20:42:13

    • Partager sur Facebook
    • Partager sur Twitter
      7 décembre 2019 à 20:44:09

      Bonjour, j'ai modifié le titre de votre sujet, j'ai remplacé "projet" par "Jeu Snake" pour que ce soit plus descriptif.

      • Partager sur Facebook
      • Partager sur Twitter
        8 décembre 2019 à 0:56:39

        Salut,

        il faut faire des fonctions.

        Je te propose de commencer par énumérer tes boutons, mettons comme ça {QUIT, START, INFO}.

        Ensuite, tu as 3 boutons qui sont 3 rectangles, une table de 3 SDL_Rect devrait donc faire l'affaire.

        Quand on clic sur la souris, tu envoies la position de clic à une fonction avec ta table. Celle-ci pourrait te retourner l'enum du rectangle dans lequel est situé le clic ou -1 si le clic n'est dans aucun rectangle.

        ça pourrait ressembler à ça :

        enum {QUIT, START, INFO};//0, 1, et 2 par défaut
        
        ...
        
        SDL_Rect boutons[3] = ...;
        
        ...
        
        case SDL_MOUSEBUTTONDOWN:
        
             SDL_Point clic = {event.button.x, event.button.y};     
        
             switch( quelBouton(clic, boutons))
             { 
                case QUIT : // quitter
                break;
        
                case START : //lancer jeu
                break;
        
                case INFO : //montrer info
                break;
        
                default : //on n'a pas cliqué sur un des boutons
                break;
              }
        break;
        
        ----------------
        int quelBouton(SDL_Point clic, SDL_Rect *boutons )
        {
           for (int i=0; i<3; i++)
           {
              if (SDL_PointInRect(&clic, boutons + i))
                  return i; //on retourne l'index pour lequel le clic est dans le rectangle
           }
        
           return -1;//par défaut on est dans aucun rectangle
        }


        Bonne continuation.

        • Partager sur Facebook
        • Partager sur Twitter

        Bonhomme !! | Jeu de plateforme : Prototype.

        Jeu Snake en C avec SDL 2

        × 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.
        • Editeur
        • Markdown