Графика (экран)
Встроенные графические средства хоть и небольшие , но достаточно
мощные. С их помощью можно легко создать неплохую 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. Писать пример, подобный написанному в справке не буду, все равно ничего кроме недоумения он у вас не вызовет. Просто знайте, что есть такая возможность. Возможно она вам даже и не пригодится.
Мы прошлись по функциям , но это не все. Есть функции работающие с видеостраницами экрана, а так же другие. Объяснить их сейчас будет крайне сложно. Мы к ним вернемся после того, как научимся рисовать. Всего доброго!
содержание | назад | вперед