文本和背景未在C中显示(sdl2和sdl2_ttf)

时间:2018-12-28 17:53:36

标签: c sdl sdl-2 sdl-ttf

我正在游戏中创建一个菜单(当我按下键盘上的逃逸键时可用)

但是用SDL_Rect创建的黑色背景和文本没有显示,我也不明白为什么。

当我运行程序时,可以通过按箭头(上,下,左,右)来更改背景图像,当我按下esc时,我什么也要做不了,直到我再次按下esc,然后我可以继续使用键盘上的箭头更改背景颜色。

有人可以帮我吗?

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

#define CHOICEMENU 2

void errorMessage(const char *message);
void errorMessageImg(const char *message);
void errorMessageTtf(const char *message);
int printTextTtf(SDL_Surface* window, TTF_Font* mainFont, const char* text);
int displayMenu(SDL_Surface* window, TTF_Font* font);


int main( int argc, char **argv)
{

//Pointeurs de la SDL :
SDL_Window *window = NULL;
SDL_Surface *windowSurface = NULL;
SDL_Surface *image1,*image2, *image3, *image4 = NULL;
SDL_Surface *currentImage = NULL;
SDL_Surface *icon = NULL;
SDL_Renderer *renderer = NULL;

int menu;
int running;


TTF_Init(); //initialisation des textes

TTF_Font *mainFont = NULL;

mainFont = TTF_OpenFont("couriernew.ttf",30);

icon = IMG_Load("img/flask.png");
SDL_SetWindowIcon(window,icon);


if(SDL_Init(SDL_INIT_VIDEO) != 0){ //retourne 0 si Ok
    errorMessage("Erreur lors de la creation de la fenêtre et du rendu");
}

window = SDL_CreateWindow("Jeu Antoine et Robin", SDL_WINDOWPOS_CENTERED, 
SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
windowSurface = SDL_GetWindowSurface(window);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | 
SDL_RENDERER_PRESENTVSYNC);

//texture = SDL_LoadBMP("ici.bmp");

image1 = SDL_LoadBMP("img/image1.bmp");
if(image1 == NULL){
    SDL_DestroyWindow(window);
    errorMessage("Impossible de charger l'image 1");
}

image2 = SDL_LoadBMP("img/image2.bmp");
if(image2 == NULL){
    SDL_DestroyWindow(window);
    errorMessage("Impossible de charger l'image 2");
}

image3 = SDL_LoadBMP("img/image3.bmp");
if(image3 == NULL){
    SDL_DestroyWindow(window);
    errorMessage("Impossible de charger l'image 3");
}

image4 = SDL_LoadBMP("img/image4.bmp");
if(image4 == NULL){
    SDL_DestroyWindow(window);
    errorMessage("Impossible de charger l'image 4");
}

currentImage = image1;

int isRunning = 1;
SDL_Event ev;

while(isRunning == 1){
    while(SDL_PollEvent(&ev) != 0 ){
        if(ev.type == SDL_QUIT){
            isRunning = false;
        }else if(ev.type == SDL_KEYDOWN){

            switch(ev.key.keysym.sym){
            case SDLK_UP:
                currentImage = image1;
                break;
            case SDLK_RIGHT:
                currentImage = image2;
                break;
            case SDLK_LEFT:
                currentImage = image3;
                break;
            case SDLK_DOWN:
                currentImage = image4;
                break;
            case SDL_QUIT:
                isRunning = 0;
                break;
            case SDLK_ESCAPE:
                menu = displayMenu(windowSurface,mainFont);
                if(menu == 1){
                    isRunning = false;
                }
                break;

            }

        }
    }

    SDL_BlitSurface(currentImage, NULL, windowSurface, NULL);
    SDL_UpdateWindowSurface(window);
}


TTF_CloseFont(mainFont);

SDL_FreeSurface(image1);
SDL_FreeSurface(image2);
SDL_FreeSurface(image3);
SDL_FreeSurface(image4);
SDL_DestroyWindow(window);
SDL_FreeSurface(icon);
SDL_DestroyRenderer(renderer);

currentImage = image1 = image2 = image3 = NULL;
window = NULL;

SDL_Quit();

return 0;
}

int displayMenu(SDL_Surface* window, TTF_Font* font){

int x,y; // coordonées de la souris
int i;
int nMenu = CHOICEMENU; //nb de choix
const char* choice[CHOICEMENU] = {"Continuer","Quitter"};
SDL_Surface* menus[CHOICEMENU]; // surface des menus
int selected[CHOICEMENU]={0,0}; // 0 car aucun selectionné pour le moment
SDL_Color colorMenu[2]={{127,122,204},{49,100,226}};

menus[0] = TTF_RenderText_Solid(font, choice[0], colorMenu[0]);
menus[1] = TTF_RenderText_Solid(font, choice[1], colorMenu[1]);

SDL_Rect pos[CHOICEMENU];
pos[0].x = window->clip_rect.w/2 /*= centre */ - menus[0]->clip_rect.w/2;
pos[0].y = window->clip_rect.h/2 - menus[0]->clip_rect.h;
pos[1].x = window->clip_rect.w/2 - menus[0]->clip_rect.w/2;
pos[1].y = window->clip_rect.h/2 + menus[0]->clip_rect.h;

SDL_FillRect(window,&window->clip_rect,SDL_MapRGB(window- 
>format,0x00,0x00,0x00));

SDL_Event ev;
while(1){
    while(SDL_PollEvent(&ev)){
        switch(ev.type){
        case SDL_QUIT:

            for(i = 0; i < CHOICEMENU ; i++){
                SDL_FreeSurface(menus[i]);
            }
            return 1;
        case SDL_MOUSEMOTION: // coordonée souris
            x = ev.motion.x;
            y = ev.motion.y;

            for(i = 0; i < CHOICEMENU; i++){
                if(x >= pos[i].x && x<= pos[i].x+pos[i].w && y>=pos[i].y && 
y<=pos[i].y+pos[i].h){

                    if(!selected[i]){
                        selected[i] = 1;
                        SDL_FreeSurface(menus[i]); // on suppr l'ancienne 
surface
                        menus[i] = TTF_RenderText_Solid(font, choice[i], 
colorMenu[1]);
                    } else {
                        if(selected[i]){
                            selected[i] = 0;
                            SDL_FreeSurface(menus[i]); // on suppr 
l'ancienne surface
                            menus[i] = TTF_RenderText_Solid(font, choice[i], 
colorMenu[0]);

                        }

                    }
                }
        case SDL_MOUSEBUTTONDOWN: //si qqn a cliquer sur la souris :
            x = ev.button.x;
            y = ev.button.y;

            for (i = 0; i < CHOICEMENU; i+=1){
                if(x >= pos[i].x && x<= pos[i].x+pos[i].w && y>=pos[i].y && 
y<=pos[i].y+pos[i].h){
                    for(i = 0 ;i < CHOICEMENU; i++){
                        SDL_FreeSurface(menus[i]);
                    }
                    return i; // On retourne la valeur actuelle : ex : si je 
clique sur "continue" ça return 1

                }
            }
        break;
        case SDL_KEYDOWN:
            if(ev.key.keysym.sym == SDLK_ESCAPE){
                for(i = 0 ;i < CHOICEMENU; i++){
                    SDL_FreeSurface(menus[i]);
                }
                return 0;
            }

            }
        }

        for(i = 0; i < CHOICEMENU; i+=1){
            SDL_BlitSurface(menus[i],NULL,window,&pos[i]);
        }



    }
    }
}

0 个答案:

没有答案