Форум программистов, компьютерный форум, киберфорум
Rem_
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Hello SDL: Ваше первое окно

Запись от Rem_ размещена 24.08.2015 в 02:00
Показов 5209 Комментарии 0

Вольный перевод всеми известного урока от http://lazyfoo.net/tutorials/S... index2.php

После настройки SDL создадим простое окно для будущей программы.
Сейчас все функции находятся внутри main, но в следующих туторах они будут вынесены.
Код сразу пихаю целиком и полностью. Не надо ничего качать. Просто копипастите и пробуйте собирать.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*This source code copyrighted by Lazy Foo' Productions (2004-2015)
and may not be redistributed without written permission.
Спасибо, Лейзи, извини.*/
 
//Using SDL and standard IO
#include <SDL.h>
#include <stdio.h>
 
//Screen dimension constants
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
 
int main( int argc, char* args[] )
{
    //The window we'll be rendering to
    SDL_Window* window = NULL;
 
    //The surface contained by the window
    SDL_Surface* screenSurface = NULL;
 
    //Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
    }
    else
    {
        //Create window
        window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( window == NULL )
        {
            printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
        }
        else
        {
            //Get window surface
            screenSurface = SDL_GetWindowSurface( window );
 
            //Fill the surface white
            SDL_FillRect( screenSurface, NULL, SDL_MapRGB( screenSurface->format, 0xFF, 0xFF, 0xFF ) );
 
            //Update the surface
            SDL_UpdateWindowSurface( window );
 
            //Wait two seconds
            SDL_Delay( 2000 );
        }
    }
 
    //Destroy window
    SDL_DestroyWindow( window );
 
    //Quit SDL subsystems
    SDL_Quit();
 
    return 0;
}

А теперь описание.
В первых строчках мы подключаем сам SDL и стандартную библиотеку ввода вывода. Вдруг будут ошибки, они напечатаются в консоли. Си плюсовики могут использовать iostream.
Глобально объявляем размеры нашего будущего окна. 640*480

Объявлять main нужно строго с аргументами для совместимости платформ - int main( int argc, char* args[] )
Затем мы объявляем окно и поверхность. В SDL_Surface может быть загружено 2d изображение из файла и показано внутри окна.

После объявления переменных инициализируем SDL. Без этого не будет работать ни одна функция. Инициализировать можно несколько подсистем, но сейчас нам нужна только SDL_INIT_VIDEO. (В будущем могут понадобиться системы для аудио, для таймера, для джойстика и геймпада, а можно сразу все системы запустить флагом SDL_INIT_EVERYTHING)
Если произойдёт ошибка, то вернётся значение -1 и в консоль напишется ошибка.
Если вы никогда не использовали printf раньше.... ( В общем это из чистого си. Знак %s обозначает, что должна напечататься какая-то строка, а SDL_GetError() эту самую ошибку возвращает в виде строки). Очень полезная функция. Сразу видно где и какая произошла неполадка.

После инициализации можно создавать окно SDL_CreateWindow. Первый параметр - заголовок окна. Второй и третий - позиция окна. Так как нам без разницы, то пишем SDL_WINDOWPOS_UNDEFINED, хотя можно поставить 50, 50. Следующие два аргумента - ширина и высота окна. Последний флаг SDL_WINDOW_SHOWN отображает окно после создания. Если произойдёт ошибка, она напечатается в консоль.

Когда окно успешно создано, мы должны получить поверхность окна, чтоб рисовать на нём. SDL_GetWindowSurface делает это.
Самое простое что мы можем сделать это залить всё окно белым прямоугольником используя SDL_FillRect.
Важно знать про рендеринг. Пока вы рисуете что-нибудь на поверхности, вы этого не увидите. Только после всех операций рисования вы должны обновить окно, чтоб всё отобразилось. Вызовите SDL_UpdateWindowSurface чтоб сделать это.

Мы создали окно, залили его белым, обновили показали. Всё что мы увидим, это мельком показанное окно и оно сразу закроется. Используем SDL_Delay для задержки. Задержка измеряется в миллисекундах, поэтому SDL_Delay( 2000 ) будет держать окно в течение двух секунд.
Важно. Во время использования SDL_Delay невозможно принимать данные с клавиатуры или с мышки. В этом примере не используются ни клава ни мышь, поэтому пусть так будет.

После задержки мы закрываем окно, высвобождаем его из памяти. Так же оно освободит и поверхность. Затем мы выходим из SDL и возвращаем значение 0 для завершения программы.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru