Уроки по SDL 2: Урок 13 ввод текста и прокрутка экрана

от автора

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

код:

#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();  }

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

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


ссылка на оригинал статьи https://habr.com/ru/articles/581790/