SDL:视口无法正常显示

时间:2017-06-16 21:05:51

标签: c sdl-2 sdl-image

我正在尝试在游戏中制作暂停功能,当我按下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

0 个答案:

没有答案