Bonjour/bonsoir a tous je suis entrain d'essayer de cree un Jeu Snake a l'aide de la SDL
Je rencontre actuellement un problème. 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
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
}
× 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.
Bonhomme !! | Jeu de plateforme : Prototype.