В этом уроке мы научимся создавать миникарту, прокручивать экран по ней, и писать текст с клавиатуры на экран.
код:
#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();
}
Druj
Интересный факт, если убрать листинг кода то от статьи останется 8 предложений и картинка.
Попробуйте добавлять больше текста с пояснениями не конкретных участков кода, а алгоритма в целом. Я, например, так и не понял что означает фраза «участка видимости фонового изображения»