Форум программистов, компьютерный форум, киберфорум
Наши страницы
Rem_
Войти
Регистрация
Восстановить пароль
Оценить эту запись

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

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

Вольный перевод всеми известного урока от http://lazyfoo.net/tutorials/SDL/01_hello_SDL/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 для завершения программы.
Размещено в Без категории
Просмотров 596 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru