В этом уроке мы научимся создавать миникарту, прокручивать экран по ней, и писать текст с клавиатуры на экран.

код:

#include<SDL2/SDL.h> 
#include<SDL2/SDL_image.h> 
#include<SDL2/SDL_ttf.h> 
#include<stdlib.h> 
 
int main(void) 
{ 
  SDL_Init(SDL_INIT_VIDEO); 
  TTF_Init(); 
  
  SDL_Window* window = SDL_CreateWindow("Dune_the_best", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,640,490,SDL_WINDOW_SHOWN); 
  SDL_Renderer* gRenderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED); 
  
  SDL_Color textColor = {0,255,0}; 
  TTF_Font* textFont = TTF_OpenFont("v_DigitalStrip_v1.5.ttf",18); 
 
  SDL_Surface* image = SDL_LoadBMP("hw.bmp"); 
  SDL_Surface* textSurface = NULL; 
 
  SDL_Texture* groundTexture = SDL_CreateTextureFromSurface(gRenderer,image); 
  SDL_Texture* textTexture = NULL;

стандартно подключаем библиотеки, инициализируем видео, шрифты, загружаем фоновое изображение и задаем текстуры.

  SDL_Rect cameraPosition = {100,100,300,300};
  SDL_Rect textPosition = {5,450,100,20};
  SDL_Rect minimap = {540,0,100,100};
  SDL_Rect brickVision = { 563,13,45,45}; 

задаем позиции и размеры камеры, текста, миникарты(minimap) и участка видимости фонового изображения(brickVision)

  int quit = 0,x = 330, y = 240; //x и y начальное положение мыши

  char* inputText; inputText=(char*)malloc(40);
   int lengthText = 0;
SDL_Event e;
  while(!quit)
  {

  SDL_StartTextInput();

    while(SDL_PollEvent(&e) != 0)
    {
 			if(e.type == SDL_QUIT) {
        quit = 1;

Запускаем чекер действий(SDL_Event), подключаем чтение текста( SDL_StartTextInput) и цикл для выхода

     }else if(e.type == SDL_KEYDOWN) {

      switch(e.key.keysym.sym)
      {
        case SDLK_UP:
        if (cameraPosition.y > 0)cameraPosition.y = cameraPosition.y -5;
            brickVision.y = brickVision.y -1;
       break;

       case SDLK_DOWN:
       if (cameraPosition.y < 200) cameraPosition.y = cameraPosition.y +5;
            brickVision.y = brickVision.y +1;
       break;

       case SDLK_LEFT:
       if (cameraPosition.x >= 0)cameraPosition.x = cameraPosition.x -5;
            brickVision.x = brickVision.x -1;
       break;

       case SDLK_RIGHT:

       if (cameraPosition.x < 340) cameraPosition.x = cameraPosition.x +5;
            brickVision.x = brickVision.x +1;
       break;

Двигаем камеру по миникарте стрелочками

      case SDLK_RETURN:
       if(lengthText>0) {
         *inputText = '\0';
          inputText -=lengthText;
          textSurface = TTF_RenderText_Solid(textFont,inputText,textColor);
          textPosition.w = textSurface->w;
          textPosition.h = textSurface->h;
          textTexture = SDL_CreateTextureFromSurface(gRenderer,textSurface);
          lengthText = 0;

       }
          break;
      }
      }else if (e.type == SDL_TEXTINPUT) {
      *inputText = *e.text.text;
            inputText++;
            lengthText++;

если нажата клавиша Enter(SDLK_RETURN), то Выводим буфер на экран, и очищаем буфер, если же нажата какая то буква(SDL_TEXTINPUT), сохраняем ее в буфер(inputText).

      } else if(e.type == SDL_MOUSEMOTION) {
          SDL_GetMouseState(&x,&y);
      }
         }

 if (x < 105 && cameraPosition.x >= 0) {
            cameraPosition.x = cameraPosition.x -5;
            brickVision.x = brickVision.x -1;

            SDL_Delay(10);
      }
        if (x > 505 && cameraPosition.x <  340) {
            cameraPosition.x = cameraPosition.x + 5;
            brickVision.x = brickVision.x +1;

            SDL_Delay(10);
      }
          if (y < 100 && cameraPosition.y >= 0) {
             brickVision.y = brickVision.y -1;
             cameraPosition.y = cameraPosition.y -5;
            SDL_Delay(10);
          }
          if ( y > 360 && cameraPosition.y <  210) {
            brickVision.y = brickVision.y +1;
            cameraPosition.y = cameraPosition.y + 5;
            SDL_Delay(10);
          }

двигаем экран мышкой, по краю экрана.

    SDL_RenderClear(gRenderer);
    
    SDL_RenderCopy(gRenderer,groundTexture,&cameraPosition,NULL);

    SDL_RenderCopy(gRenderer,groundTexture,NULL,&minimap);
    SDL_SetRenderDrawColor(gRenderer,0x00,0xFF,0x00,0xFF);
    SDL_RenderDrawRect(gRenderer,&brickVision);
    SDL_RenderCopy(gRenderer,textTexture,NULL,&textPosition);
    SDL_RenderPresent(gRenderer);

Очищаем экран и выводим все элементы на экран.

    SDL_StopTextInput();
  }
 SDL_DestroyWindow(window);
 TTF_Quit();
 SDL_Quit();

}

Ссылка на файлы

<< предыдущий урок

Комментарии (1)


  1. Druj
    06.10.2021 10:25

    Интересный факт, если убрать листинг кода то от статьи останется 8 предложений и картинка.
    Попробуйте добавлять больше текста с пояснениями не конкретных участков кода, а алгоритма в целом. Я, например, так и не понял что означает фраза «участка видимости фонового изображения»