Графика (экран)

Встроенные графические средства хоть и небольшие , но достаточно мощные.  С их  помощью можно легко создать неплохую 2D игру, скринсейвер, да и просто какую то анимацию или рисунок. И это не праздные слова. В разделе ссылки есть  ссылочка на сайт , который содержит большую кучу игр, созданных с помощью встроенных графических средств. Конечно далеко не все из них можно назвать удавшимися, но это ни в коем случае не умаляет возможности графики в FreeBasic. Многое в создании игр зависит от возможностей и качеств человека( рисование, математические и физические знания, терпение и пр.) И если навыки рисования у человека скудны, то наверно не стоит валить вину на операторы языка. Так к примеру я нашел один код из 64 строчек (включая комментарии), который из операторов рисования использует только Pset (рисование точки). И при этом демонстрирует красивый 3D эффект движения. Более того, если уж ваша программа окажется действительно очень требовательной к ресурсам компьютера, вы всегда сможете подключить самые мощные на сегодня библиотеки (DirectX, OpenGL). На данный момент в FreeBasic встроена графическая библиотека GfxLib , единственно не прописаны константы и типы (именно поэтому приходится в таких случаях подключать файлик "fbgfx.bi").
Если в этой статье вам будут непонятны некоторые вещи, например назначение каких-то параметров , флагов , то просто пропускайте. Многое здесь весьма специфично, и написано только для полноты картины. Некоторые флаги и параметры мы рассмотрим в следующих статьях, когда начнем уже рисовать, а здесь просто примите как данность.

 

Что касается графических экранов...

Перед тем, как начинать рисовать, нужно включить графический экран и настроить его в нужном графическом режиме. Делается это с помощью функций Screen или ScreenRes

 

Screen

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

Cинтаксис:

Screen mode [, [ depth ] [, [ num_pages ] [, [ flags ] [, [ refresh_rate ]]]]]

Как можно видеть, если использовать функцию Screen для графики, то в ней один обязательный параметр mode (режим). Ниже в таблице предоставлены все используемые режимы:

Старые режимы, совместимые с Qbasic:

Номер режима Разрешение Эмуляция Кол-во символов в экране Размер одного символа Цвета экрана
1 320x200 CGA 40X25 8x8 16 background, 1 of four sets foreground
2 640x200 CGA 80x25 8x8 16 colors to 2 attributes
7 320x200 EGA 40x25 8x8 16 colors to 16 attributes
8 640x200 EGA 40x25 8x8 16 colors to 16 attributes
9 640x350 EGA 80x25 0r 80x43 8x14 or 8x8 16 colors to 16 attributes
11 640x480 VGA 80x30 or 80x60 8x16 or 8x8 256K colors to 2 attributes
12 640x480 VGA 80x30 or 80x60 8x16 or 8x8 256K colors to 16 attributes
13 320x200 MCGA 40X25 8X8 256K colors to 256 attributes

Новые режимы FreeBasic:

Номер режима Разрешение Эмуляция Кол-во символов в экране Размер одного  символа Цвета экрана
14 320x240 40x30 8x8 256K colors to 256 attributes or direct color
15 400x300 50x37 8x8 256K colors to 256 attributes or direct color
16 512x384 64x24 or 64x48 8x16 or 8x8 256K colors to 256 attributes or direct color
17 640x400 80x25 or 80x50 8x16 or 8x8 256K colors to 256 attributes or direct color
18 640x480 80x30 or 80x60 8x16 or 8x8 256K colors to 256 attributes or direct color
19 800x600 100x37 or 100x75 8x16 or 8x8 256K colors to 256 attributes or direct color
20 1024x768 128x48 or 128x96 8x16 or 8x8 256K colors to 256 attributes or direct color
21 1280x1024 160x64 or 160x128 8x16 or 8x8 256K colors to 256 attributes or direct color

В первой колонке таблиц как раз и есть та цифра, которая используется в параметре mode (РЕЖИМ). В зависимости от этой цифры, как вы понимаете, будут разные возможности экрана: разрешение, кол-во возможных символов, размер этих символов, и кол-во цветов.

Второй параметр depth (глубина цвета кол-во бит на пиксель) уместен только для 2 таблицы режимов. Если используется 1 таблица режимов, то второй параметр функции бесполезен. Допускаются 8 (по умолчанию) , 16 , 32. А так же разрешены 15 и 24 .

Третий параметр num_pages кол-во возможных видеостраниц. Применяется для более качественного вывода графики. Чаще всего используются 2 страницы . Пока на одной рисуется, вторая страница отображается, потом страницы меняются местами. В результате пользователь не видит все технические стороны рисования, а видит только то, что требуется. В ресурсоемких графических программах невозможно обойтись без этого параметра.

Параметр flags   применяется при расширенном использовании библиотеки GfxLib. Этот параметр нужен будет в программах с мощной графикой (например 3D) или же просто для полноэкранного режима. Флаги можно использовать с сочетанием через оператор OR (все цифры в десятичной системе счисления):

  • 0    -  обычный режим окна
  • 1    -  полноэкранный режим окна
  • 2    -  подключение OpenGL
  • 4   -   позволяет менять полноэкранный и обычный режим с помощью Alt+Enter
  • 8   -   окно без рамки
  • 16  -  создание прозрачных регионов, где рисуется цвет RGBA(255, 0, 255, 0)
  • 32  -  окно поверх всех окон
  • 64  -  включение альфаканала
  • 128  - более высокий приоритет для отображения графики
  • 65536  - OpenGl (использовать режим с шаблонным буфером)
  • 131072  - OpenGl (использовать режим с накопительным буфером)
  • 262144  - OpenGL (полноэкранное сглаживание для ARB_MULTISAMPLE EXTENSION)
  • -1   -   режим, позволяющий рисовать совместно с GDI функциями API на обычном Windows окне. При этом экран , установленный с помощью Screen и ScreenRes , не отображается.

И последний параметр refresh_rate функции - это частота обновления экрана. Во многом зависит от драйвера вашего видеоустройства. Если параметр будет по каким то причинам недоступен, FreeBasic автоматически определит частоту.

Пример использования функции:

Screen 8
Sleep

 

ScreenRes

Функция позволяет выставлять графические режимы с нестандартными разрешениями. Ей не нужны выше таблицы. Она запустит экран с любым разрешением.

Cинтаксис:

ScreenRes width, height [, [depth] [, [num_pages] [, [flags] [, refresh_rate ]]]]

У функции два обязательных параметра: ширина и высота экрана. Остальные параметры такие же как у функции Screen.

Пример:

Screenres 640,480
Sleep

 

ScreenList

Я упомянул о полноэкранном режиме, но хотел бы сказать, что не все выставленные разрешения способны трансформироваться в полноэкранный. Для того, чтобы знать какие режимы на вашем компьютере способны это делать, можно воспользоваться функцией ScreenList, которая их перечисляет. Функция имеет 1 параметр:

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

Этот параметр используется только при первой инициализации, далее она будет возвращать разрешения в цикле, пока они не закончатся. Как только это произойдет, функция вернет 0.
Функция возвращает результат в 32 битное число, а получить половинки этого числа (ширину и высоту) можно с помощью Hiword (ширина) и Loword (высота)

Пример(из справки), который выводит для глубины цвета 8 все разрешения , способные трансформироваться в полноэкранные:

Dim As Integer mode, w, h
mode = Screenlist(8)
While (mode)
    w = Hiword(mode)
    h = Loword(mode)
    Print Str(w) + "x" + Str(h)
    mode = Screenlist
Wend
Sleep

 

ScreenInfo

Для получения информации о графическом окне (разрешение, частота обновления и пр.) или просто об окне вашего рабочего стола, можно применить функцию ScreenInfo.

Синтаксис:

ScreenInfo [ w ] [, [ h ] [, [ depth ] [ , [ bpp ] [ , [ pitch ] [ , [ rate ] [, driver ]]]]]


Как видите у нее 7 необязательных параметров. В любой момент можно получить только нужные нам.

  • w       -     ширина
  • h        -    высота
  • depth -    глубина цвета в битах на пиксель
  • bpp    -    bpp (в байтах)
  • pitch  -    размер строки видеобуфера в байтах
  • rate    -     частота обновления экрана
  • driver  -   имя используемого драйвера

Пример_1 (получение информации об окне рабочего стола):

Dim As Integer w,h,depth
Screeninfo w,h,depth
? w & "x" & h & "x" & depth
Sleep


Пример_2 (получение информации о графическом окне):

Dim As Integer w,h,depth
Dim As String driver
Screen 14
Screeninfo w,h,depth,,,,driver
? w & "x" & h & "x" & depth
? "Using driver " & driver
Sleep

 

WindowTitle

Когда мы создаем игру или что-то другое не в полноэкранном режиме, наверняка вам захочется в заголовке окна указать имя программы или любую другую информацию. С этим хорошо справляется функция WindowTitle, имеющая только один параметр: строка с именем.

Пример:

Screenres 640,480
Windowtitle "Заголовок"
Sleep

 

ScreenControl

Это очень многофункциональная процедура, способная устанавливать или получать огромное кол-во настроек. Процедура перегружена.


Синтаксис:

ScreenControl ( Optional , [ param1], [ param2],[param3], [param4] )
ScreenControl ( Optional , [ StringParam] )

В зависимости от параметра Optional , перечисленного в таблице, процедура либо возьмет из параметров и установит настройки, либо возвратит в них значения настроек.

Optional может быть:

Константа Число Назначение Используемые параметры
GET_WINDOW_POS 0 Получает расположение окна param1 x
param2 y
GET_WINDOW_TITLE 1 Возвращает заголовок окна param заголовок
GET_WINDOW_HANDLE 2 Возвращает хендл окна param1 хендл
GET_DESKTOP_SIZE 3 Возвращает размеры рабочего стола в пикселях param1 ширина
param2 высота
GET_SCREEN_SIZE 4 Возвращает размеры текущего экрана param1 ширина
param2 высота
GET_SCREEN_DEPTH 5 Возвращает глубину цвета в битах на пиксель param1 глубина
GET_SCREEN_BPP 6 Возвращает текущий режим графики bpp (байт на пиксел) param1 режим
GET_SCREEN_PITCH 7 Возвращает размер видеостраницы в байтах. param1 размер
GET_SCREEN_REFRESH 8 Возвращает частоту обновления в герцах param1 частота
GET_DRIVER_NAME 9 Возвращает имя используемого драйвера param имя
GET_TRANSPARENT_COLOR 10 Возвращает текущий прозрачный цвет для текущего режима param1 цвет
GET_VIEWPORT 11 Возвращает координаты установленного участка функцией VIEW SCREEN param1 x1
param2 y1
param3 x2
param4 y2
GET_PEN_POS 12 Возвращает последнюю позицию графической кисти param1 x
param2 y
GET_COLOR 13 Возвращает значения цвета param1 основной цвет
param2 цвет фона
GET_ALPHA_PRIMITIVES 14 Возвращает флаг поддержки альфаканала. Если -1 включен, если 0 нет param1 значение
GET_GL_EXTENSIONS 15 Возвращает строку, содержащую все поддерживаемые расширения GL, или пустую строку, если не в режиме OpenGL param расширения
GET_HIGH_PRIORITY 16 Возвращает если флаг gfx_high_priority был указан при установке экрана с помощью Screen или ScreenRes.
1 - был установлен
param1 значение
SET_WINDOW_POS 100 Устанавливает позицию окна param1 x
param2 y
SET_WINDOW_TITLE 101 Установка заголовка окна param заголовок
SET_PEN_POS 102 Установка позиции графической кисти param1 x
param2 y
SET_DRIVER_NAME 103 Устанавливает имя внутреннего графического драйвера, который будет использоваться при последующих вызовах param имя
SET_ALPHA_PRIMITIVES 104 Устанавливает флаг поддержки альфаканала. Если -1 включить param1 значение
SET_GL_COLOR_BITS 105 Устанавливает количество бит для буфера цветов OpenGL param1 кол-во
SET_GL_COLOR_RED_BITS 106 Устанавливает количество бит для красного компонента цвета буфера OpenGL param1 кол-во
SET_GL_COLOR_GREEN_BITS 107 Устанавливает количество бит для зеленого компонента цвета буфера OpenGL param1 кол-во
SET_GL_COLOR_BLUE_BITS 108 Устанавливает количество бит для синего компонента цвета буфера OpenGL param1 кол-во
SET_GL_COLOR_ALPHA_BITS 109 Устанавливает количество бит для прозрачного компонента цвета буфера OpenGL param1 кол-во
SET_GL_DEPTH_BITS 110 Устанавливает количество бит для глубины цвета буфера OpenGL param1 кол-во
SET_GL_STENCIL_BITS 111 Устанавливает количество бит для шаблонного буфера OpenGL param1 кол-во
SET_GL_ACCUM_BITS 112 Устанавливает количество бит для накапливающего буфера OpenGL param1 кол-во
SET_GL_ACCUM_RED_BITS 113 Устанавливает количество бит для красного компонента цвета накапливающего буфера OpenGL param1 кол-во
SET_GL_ACCUM_GREEN_BITS 114 Устанавливает количество бит для зеленого компонента цвета накапливающего буфера OpenGL param1 кол-во
SET_GL_ACCUM_BLUE_BITS 115 Устанавливает количество бит для синего компонента цвета накапливающего буфера OpenGL param1 кол-во
SET_GL_ACCUM_ALPHA_BITS 116 Устанавливает количество бит для прозрачного компонента цвета накапливающего буфера OpenGL param1 кол-во
SET_GL_NUM_SAMPLES 117 Устанавливает кол-во образцов, которые будут использоваться в OpenGL MULTISAMPLING param1 кол-во
POLL_EVENTS 200 Используется для проверки очереди системных событий, в частности, используется для получения события клавиатуры и мыши. Это особенно полезно для OpenGL кода, где функция FLIP не используется.

Пример:

Dim As Integer x,y
Screenres 500, 300
' возвращаем координаты окна в переменные x,y 
Screencontrol 0, x, y 
' устанавливаем окно в координаты 10х10
Screencontrol 100, 10, 10 
? x,y
Sleep

 

ScreenEvent

Функция возвращает адрес на структуру, содержащую последние отлавливаемые сообщения из очереди сообщений (например нажатие клавиш клавиатуры, передвижения или нажатие кнопок мыши и другие).

Сама структура выглядит так:

Type EVENT Field = 1
    Type As Integer
    Union
        Type
            scancode As Integer
            ascii As Integer
        End Type
        Type
            x As Integer
            y As Integer
            dx As Integer
            dy As Integer
        End Type
        button As Integer
        z As Integer
    End Union
End Type


Если подключить файл fbgfx.bi , то структура EVENT в нем уже описана. Для того, чтобы ее использовать достаточно объявить структурированную переменную обычным способом.

Константы возвращаемых событий:

  • EVENT_KEY_PRESS (1)  Была нажата клавиша на клавиатуре. Поле scancode содержит сканкод клавиши. Так же если имеется возможность извлечь ASCII код, то он находится в параметре ASCII, иначе в параметре стоит 0
  • EVENT_KEY_RELEASE (2)  Клавиша была отпущена. Параметры структуры scancode и ascii имеют тот же смысл.
  • EVENT_KEY_REPEAT (3)  Клавиша нажата и зациклена. Параметры структуры scancode и ascii имеют тот же смысл.
  • EVENT_MOUSE_MOVE (4)  Курсор мыши переместился по экрану. Поля x и y  содержат новые  координаты мыши. Поля dx и dy содержат дельту (разница перемещения и направление).
  • EVENT_MOUSE_BUTTON_PRESS (5)  Одна из кнопок мыши была нажата. Поле button содержит значение: 1 левая кнопка , 2 правая кнопка, 4 средняя кнопка
  • EVENT_MOUSE_BUTTON_RELEASE (6)  Кнопка мышы была отпущена. Поле button содержит значение: 1 левая кнопка , 2 правая кнопка, 4 средняя кнопка
  • EVENT_MOUSE_DOUBLE_CLICK (7)  Кнопка мышы была нажата дважды. Поле button содержит значение: 1 левая кнопка , 2 правая кнопка, 4 средняя кнопка
  • EVENT_MOUSE_WHEEL (8)  Используется колесико мыши,  значение пишется в поле Z
  • EVENT_MOUSE_ENTER (9)  Мышь перенесена на окно экрана
  • EVENT_MOUSE_EXIT (10)   Мышь вышла за границы окна экрана
  • EVENT_WINDOW_GOT_FOCUS (11)  Окно экрана программы получило фокус
  • EVENT_WINDOW_LOST_FOCUS (12)  Окно экрана не имеет фокус
  • EVENT_WINDOW_CLOSE (13)  Пользователь пытается закрыть окно

Пример:

'Подключаем файл с объявлениями
#INCLUDE "fbgfx.bi"
'открываем пространство имен FB
Using fb
'Объявляем структуру
Dim e As EVENT
'Запускаем экран
Screenres 640, 480
Do

    If (Screenevent(@e)) Then 'если произошло событие
        Select Case e.type    'тогда узнаем какое
            Case EVENT_KEY_PRESS
                If (e.scancode = SC_ESCAPE) Then 'если ESC тогда выход из программы
                    End
                End If
                Print "scancode pressed key: " & e.scancode ' клавиша нажата
            Case EVENT_KEY_RELEASE
                Print "scancode released key:  " & e.scancode ' клавиша отжата
            Case EVENT_MOUSE_MOVE ' перемещение мыши
                Print "mouse moved to " _
                & e.x & "," & e.y & " (delta " & e.dx & "," & e.dy & ")"
            Case EVENT_WINDOW_CLOSE ' закрытие окна
                End
        End Select
    End If
Loop


Я взял пример из справки и урезал его, чтобы не пугать вас его размером. В принципе для понимания и этого достаточно. Но если проснется желание узнать как работают остальные сообщения, то можете добавить их сами, либо подсмотреть в справке.

 

ScreenGLProc

Функция используется для получения адреса любой из процедур OpenGL для последующего использования в своем коде совместно с Gfxlib.  Писать пример, подобный написанному в справке не буду, все равно ничего кроме недоумения он у вас не вызовет. Просто знайте, что есть такая возможность. Возможно она вам даже и не пригодится.

Мы прошлись по функциям , но это не все. Есть функции работающие с видеостраницами экрана, а так же другие. Объяснить их сейчас будет крайне сложно. Мы к ним вернемся после того, как научимся рисовать. Всего доброго!

содержание | назад | вперед