我正在尝试在游戏中制作暂停功能,当我按下esc游戏冻结但菜单图像没有显示时,视口渲染有什么问题?
您可以在此处找到代码:
// gcc main.c -o main -lSDL2main -lSDL2 -lSDL_image
#include <SDL2/SDL.h>
#include <stdio.h>
#include <SDL/SDL_image.h>
#define MAX_INIMIGOS 10
typedef struct dados_personagem
{
float x;
float y;
float comp;
float altura;
int vivo;
} entidade;
void PerdeuVida(entidade *inimigo,int *life)
{
*life -= 1;
inimigo -> vivo = 0;
}
int main()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Renderer *renderizador = NULL;
SDL_Renderer *pause_renderizador = NULL;
SDL_Window *janela = NULL;
SDL_Texture *textura = NULL;
SDL_Texture *inimigo_textura = NULL;
SDL_Texture *barra_vida = NULL;
SDL_Texture *menu_pause = NULL;
janela = SDL_CreateWindow("Jogo", 0 , 0 , 800, 640, 0);
renderizador = SDL_CreateRenderer(janela, -1,SDL_RENDERER_ACCELERATED);
pause_renderizador = SDL_CreateRenderer(janela, -1,SDL_RENDERER_ACCELERATED);
SDL_Surface *temporaria = SDL_LoadBMP("mato.bmp");
textura = SDL_CreateTextureFromSurface(renderizador , temporaria);
free(temporaria);
temporaria = SDL_LoadBMP("index.bmp");
inimigo_textura = SDL_CreateTextureFromSurface(renderizador , temporaria);
free(temporaria);
temporaria = SDL_LoadBMP("kokkoro.bmp");
barra_vida = SDL_CreateTextureFromSurface(renderizador , temporaria);
free(temporaria);
temporaria = SDL_LoadBMP("menu.bmp");
menu_pause = SDL_CreateTextureFromSurface(renderizador , temporaria);
free(temporaria);
SDL_SetRenderDrawColor(renderizador,0,0,0,255);
SDL_SetRenderDrawColor(pause_renderizador,0,0,0,255);
SDL_Rect fundo = {
0,
0,
800,
640
};
SDL_Rect MenuVP = {
300,
250,
400,
450
};
SDL_RenderSetViewport( pause_renderizador, &MenuVP);
float velocidade = 1;
int vida = 20;
int executando = 1;
int pause = 0;
entidade inimigo[MAX_INIMIGOS];
for(int i = 0; i < MAX_INIMIGOS; i++)
{
inimigo[i].x = 55 ;
inimigo[i].y = 0 - i * 50;
inimigo[i].altura = 40;
inimigo[i].comp = 40;
inimigo[i].vivo = 1;
}
SDL_Event event;
while(executando)
{
while(SDL_PollEvent(&event))
{
// fechar com o X da janela
if (event.type == SDL_QUIT)
{
executando = 0;
}
// esc
if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE)
{
pause = 1;
}
}
for(int i = 0; i < MAX_INIMIGOS; i++)
{
if(inimigo[i].vivo && (inimigo[i].y <= 192) && inimigo[i].x == 55 )
inimigo[i].y += velocidade;
if(inimigo[i].vivo && inimigo[i].y == 192 && inimigo[i].x <= 360 )
inimigo[i].x += velocidade;
if(inimigo[i].vivo && inimigo[i].y >= 38 && inimigo[i].x == 360 && inimigo[i].y < 398 )
inimigo[i].y -= velocidade;
if(inimigo[i].vivo && inimigo[i].y == 38 && inimigo[i].x <= 665 && inimigo[i].x >= 360 )
inimigo[i].x += velocidade;
if(inimigo[i].vivo && inimigo[i].y >= 38 && inimigo[i].x == 665 && inimigo[i].y <= 398)
inimigo[i].y += velocidade;
if(inimigo[i].vivo && inimigo[i].y == 398 && inimigo[i].x >= 55)
inimigo[i].x -= velocidade;
if(inimigo[i].vivo && inimigo[i].x == 55 && inimigo[i].y >= 398)
inimigo[i].y += velocidade;
printf("%lf - %lf - %d\n", inimigo[i].y,inimigo[i].x, i);
}
for(int i = 0; i < MAX_INIMIGOS; i++)
{
if(inimigo[i].vivo && inimigo[i].y + inimigo[i].altura >= 590 )
PerdeuVida(&inimigo[i], &vida);
}
while(pause)
{
while(SDL_PollEvent(&event))
{
if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE)
{
pause = 0;
}
if (event.type == SDL_QUIT)
{
executando = 0;
pause = 0;
}
}
SDL_RenderClear(pause_renderizador);
SDL_RenderCopy(pause_renderizador, menu_pause, NULL, &MenuVP);
SDL_RenderPresent(pause_renderizador);
}
SDL_RenderClear(renderizador);
SDL_RenderCopy(renderizador, textura, NULL , &fundo);
for(int i = MAX_INIMIGOS; i > 0; i--)
{
if(inimigo[i].vivo)
{
SDL_Rect inimigo_tex = {
inimigo[i].x,
inimigo[i].y,
inimigo[i].comp,
inimigo[i].altura
};
SDL_RenderCopy(renderizador, inimigo_textura, NULL ,&inimigo_tex);
}
}
for(int i = 0; i < vida; i++)
{
SDL_Rect health_bar = {
750,
20 + i * 20,
20,
20
};
SDL_RenderCopy(renderizador,barra_vida, NULL, &health_bar);
}
SDL_RenderPresent(renderizador);
SDL_Delay(1000 / 60);
}
printf("%d", vida);
SDL_Quit();
return 0;
}
对显示暂停菜单很重要的行是:
55,69,141