
Наиважнейшей частью любой компьютерной игры является графика. В Game Maker
работе с графикой отведено особое внимние и большинство из основных операций
с графикой просты в понимании и доступны даже для неискушенного пользователя.
Например при создании простеньких игр тебе вообще не придется особо
напрягаться, но быть может тебе захочется иметь более полный контроль при
обработке графики. Для решения некоторых задач тебе вполне будет достаточно
имеющихся действий, но используя код ты будешь иметь более полный набор
инструментов для работы с графикой. Данная глава описывает все доступные
переменные и функции, и содержит довольно подробную информацию о их
непосредственном назначении.
Окно и курсор
По умолчанию игра запускается в окне. Игрок может изменить оконный режим на
полноэкранный, нажав клавишу , если это возможность не была заблокирована.
Ты можешь также сделать это перямо из программы, используя следующую
переменную:
full_screen - Значение этой переменной истинно для полно-экранного режима. Ты можешь изменить режим, устанавливая переменную как истинно (true) или ложно (false).
Обрати внимание, что в полно-экранном режиме заголовок и игровой счет
отображаются на экране. (Этого можно избегать, используя игровые опции). В
полно-экранном режиме изображение или центрируется или масштабируется. Ты
можешь управлять этим используя следующую переменнаю:
scale_screen - Эта переменная истинна при масштабируемом режиме. Ты можешь изменять режим, устанавливая для этой переменной истинно или ложно.
Масштабируемый режим может работать медленно на машинах с медленным процессором
или графической картой. По умолчанию каждая игра запускается с видимым курсором.
Для большинства игр тебе это будет не нужно. Чтобы убрать отображение курсора,
используй переменную:
show_cursor - Если установлено значение ложно, курсор будет невидимым внутри игрового пространства, иначе он будет видимым.
Между прочим, обрати внимание, что сделать собственный объект курсора очень легко.
Просто создай объект с отрицательной глубиной (depth) чтобы, в событии шага для него,
он следовал за позицией мыши.
Чтобы выяснить разрешающую способность монитора, ты можешь использовать
следующий две read-only переменных:
monitor_width - Ширина монитора, в пикселах.
monitor_height - Высота монитора, в пикселах.
Спрайты и изображения
Для каждого объекта определяется спрайт его отождествляющий. Это может быть
одиночное изображение, или он может состоять из нескольких изображений.
Для каждого образца объекта программа рисует на экране соответствующее
изображение, с началом его координат (как определено в свойствах спрайта) в
позиции (x, y) образца. В случае если имеется несколько изображений, они
циклически прокручиваются, для получения анимационного эффекта. Существует
несколько переменных, которые используют разные способы, рисования изображений.
Они могут быть использованы, для того чтобы изменять эффекты. Каждый образец
имеет следующие переменные:
visible - Если видимость истинна (1), изображение рисуется, иначе этого не происходит. Невидимые образцы остаются активными и вызывают события столкновения; только при этом ты их не видешь. Установка видимости как ложная полезна например для объектов контроллера (делай их не-твердым телом, чтобы избежать генерации событий столкновения) или скрытых переключателей.
sprite_index - Индекс текущего спрайта для образца. Ты можешь изменять его, чтобы присвоить образцу другой спрайт. Как значение ты можешь использовать названия различных спрайтов, которые ты определил. Изменение спрайта не изменяет индекс в настоящее время видимой части изображения.
sprite_width* - Указывает ширину спрайта. Это значение не может быть изменено, но возможно ты захочешь использовать данную переменную.
sprite_height* - Указывает высоту спрайта. Это значение не может быть изменено, но возможно и оно тебе вдруг понадобится.
sprite_xoffset* - Указывает смещение спрайта по горизонтали определенное в свойствах спрайта. Это значение не может быть изменено.
sprite_yoffset* - Указывает смещение спрайта по вертикали определенное в свойствах спрайта. Это значение не может быть изменено.
image_number* - Количество изображений из которых состоит текущий спрайт для образца (не может быть изменен).
image_index - Когда изображение имеет, несколько циклически прокручиваемых под-изображений. Данная переменная указывает рисуемый в данный момент фрагмент картики (они пронумерованы, начиная с 0). Ты можешь изменить текущее изображение, изменив эту переменную. Программа продолжит циклически прокручивать фрагменты изображения, начиная с указанного вновь индекса.
image_single - Иногда тебе может понадобится, чтобы был отображен только определенный фрагмент изображения, и чтобы циклическая прокрутка всех имеющихся фрагментов не производилась. Это может быть достигнуто, устанавкой для переменной индекса фрагмента изображения, которое ты хочешь увидеть (первый (начальный) фрагмент изображения имеет индекс 0). Укажи для переменной значение -1, чтобы циклически прокручивались все части изображения. Это бывает полезно, когда объект имеет несколько различных видом. Например, предположим что у тебя есть объект, который может вращаться, и ты создаешь спрайт, имеющий фрагменты изображений для различных направлений (движение против часовой стрелки). Тогда, в событии шага данного объекта ты можешь установить
{
image_single = direction * image_number/360;
}
image_speed - Скорость, с которой ты циклически прокручиваешь фрагменты изображения. Значение 1 указывает, что каждый шаг мы получает следующее изображение. Меньшие значения прокручивают фрагменты картинки медленнее, рисуя каждый фрагмент по разу. Большие значения пропускают некоторые фрагменты картинки, чтобы сделать движение более быстрым.
depth - Как правило изображения рисуются в том виде, в котором были созданы образцы. Ты можете изменить это, устанавливая глубину изображения. Значение по умолчанию - 0, если ты не устанавил иное значение в свойствах объекта. Чем выше значение, тем дальше будет находится образец на экране. (Ты также можешь использовать отрицательные значения). Образцы с более высокой глубиной будут расположены позади образцов с более низкой глубиной. Установка глубины гарантирует, что образцы будут нарисованы в том виде, какой тебе нужен (например самолет позади облака). Фоновые изображения должны иметь высокую (положительную) глубину, а картинки переднего плана должны иметь низкую (отрицательную) глубину.
image_scale - Коэффициент масштабирования, делает изображения большие или меньше оригинального. Значение 1 указывает нормальный размер. Изменение масштаба также изменяет значения для ширины и высоты изображения и влияет на события столкновения, как и следовало бы ожидать. Но учти, что масштабированное изображение (в особенности, когда ты делаешь его меньше) затрачивает больше времени, для прорисовки. Изменение масштаба может использоваться, для получения эффекта трехмерности.
bbox_left* - Левая сторона поля ограничения, используемого изображения образца (масштабирование учитывается).
bbox_right* - Правая сторона поля ограничения, используемого изображения образца.
bbox_top* - Верхняя сторона поля ограничения, изображения образца.
bbox_bottom* - Нижняя сторона поля ограничения, изображения образца.
Спрайты используют большое количество памяти. Чтобы рисовать их достаточно
быстро, нужно сохранять их в видеопамяти. Ты можешь указать, какие именно
спрайты должны быть сохранены в видеопамяти. Также ты можешь указать, чтобы
некоторые спрайты загружались только при необходимости. Такие спрайты будут
выгружены из памяти по окончанию уровня. Ты можешь частично управлять данными
процессами используя для этого код. Существуют следующие функции:
sprite_discard(numb) - Освобождает (видео) память, используемую спрайтом. Если спрайт имеет свойство "загрузить на использование" (load-on-use), то он будет полностью удален из памяти. Иначе, его копия останется в обычной памяти (которой как правило всегда не хватает) и спрайт может быть при необходимости восстановлен.
sprite_restore(numb) - Восстановливает спрайт в (видео) памяти. Как правило это происходит автоматически, по мере необходимости спрайта. Но иногда могут возникнуть проблемы, в особенности когда установлена "load-on-use", и спрайт имеет большой рамер. Таким образом ты можешь насильно загрузить его, например в начале уровня, в котором данный спрайт необходим.
discard_all() - Выгружает из памяти все спрайты, фоны и звуки, которые имеют установку "load-on-use".
Фоновые изображения
Каждая комната может иметь до 8 фоновых изображений. Также имеется цвет для
фона. Ты можешь изменить любой из параметров фонов из части кода, используя
следующие переменные (обрати внимание, что некоторые - массивы, которые
располагаются от 0 до 7, указывают на разные фоны):
background_color - Цвет фона для комнаты.
background_showcolor - Очищать ли окно с окрашенным фоном.
background_visible[0..7] - Является ли определенное фоновое изображение видимым.
background_foreground[0..7] - Является ли фон в действительности изображением переднего плана (foreground).
background_index[0..7] - Индекс фонового изображения для фона.
background_x[0..7] - X позиция фонового изображения.
background_y[0...7] - Y позиция фонового изображения.
background_width[0...7]* - Ширина фонового изображения.
background_height[0...7]* - Высота фонового изображения.
background_htiled[0..7] - Горизонтальные ли плитки.
background_vtiled[0..7] - Вертикальные ли плитки.
background_hspeed[0..7] - Скорость горизонтального скролинга фона (пикселей за шаг).
background_vspeed[0..7] - Скорость вертикального скролинга фона (пикселей за шаг).
Фоновые изображения используют большое количество памяти. Чтобы рисовать их,
достаточно быстро, бывает полезно сохранять их в видеопамяти. Ты можешь
указать, какие фоны должны быть сохранены в видеопамяти. Также ты можешь
определить, какие фоны должны быть загружены только по мере необходимости.
Такие фоны будут выгружены из памыти по окончанию уровня. Ты можешь частично
управлять данными процессами используя код. Существуют следующие функции:
background_discard(numb) - Освобождает (видео) память, используемую для фонового изображения. Если фон имеет свойство "load-on-use", то он будет полностью удален из памяти. Иначе, его копия останется в обычной памяти и такой фон может быть восстановлен в любой момент, когда это будет необходимо.
background_restore(numb) - Восстановливает фоновое изображение в (видео) памяти. Обычно это происходит автоматически, когда фон необходим. Но иногда могут возникнуть проблемы, в особенности когда установлена опция "load-on-use", и фон большой. Таким образом ты можешь насильно загрузить его, например в начале уровня, в котором данный фон необходим.
discard_all() - Выгружает из памяти все спрайты, фоны и звуки, которые имеют установку "load-on-use".
Существует одна очень специальная функция. Эта функция делает возможным замену
одного из фоновых ресурсов на изображение (bmp или jpg) из файла. Она удобна по
многим причинам. Например, когда твоя игра использует большое количество
больших по размеру фонов, ты можешь захотеть не сохранять их все в одном
игровом файле. Так как при этом потребуется значительное количество времени на
загрузку игры и увеличит количество используемой внутренней памяти. Вместо
этого ты можешь сохранить фоны в различных файлах и иметь только один фоновый
ресурс. После чего ты можешь заменить его тем изображением, какое тебе
захочется. Другое использование, когда ты хочешь позволить игроку выбирать фон.
Также, ты можешь захотеть сохранить изображение из игры и использовать его
позже в виде фона (например для программы рисования). Наконец, сложные фоны,
сохраненные в виде jpg файлов используют намного меньше памяти. Имеется
функция:
background_replace(ind,fname) - Заменяет изображение, сохраненное в (ind) фоне на изображение из файла с указанным именем. Поддерживаются только изображения в формате bmp и jpg. Фон, который ты заменяешь, должен существовать и должен иметь текущее изображение ненулевого размера. Другие свойства фона, такие как прозрачность и (load-on-use) остаются преждними.
Обрати внимание, что подобных функций не существуют для спрайтов или звуков,
потому как они являются намного более сложными объектами с большим количеством
переменных и различных настраиваемых параметров.
Функции Рисования
Они дают тебе возможность позволить объекту выглядеть несколько иначе, чем они
являются на самом деле. Существует целая коллекция доступных функций позволяющих
рисовать различные формы. Также имеются функции, позволяющие рисовать текст.Ты
можешь использовать их только в событии рисования объекта; эти функции не имеют
смысла в каком нибудь другом коде. Обязательно учитывай, что только графическое
железо компьютера рисует изображения быстро. Таким образом любая другая
подпрограмма рисования будет делать это относительно медленно. Также хочется
отметить что Game Maker оптимизирован для рисования изображений. Но по
возможности избегай других подпрограмм рисования. (Лучше, когда это возможно,
создать точечный рисунок вместо использования рисования). Также пойми, что
столкновения между образцами определяются их спрайтами (или масками) а не тем,
как они фактически рисуются. Существуют следующее функции, связанные с
рисование изображений:
draw_sprite(n,img,x,y) - Рисует фрагмент изображения img (-1 = текущее) спрайта с индексом n, с началом координат в позиции (x, y).
draw_sprite_scaled(n,img,x,y,s) - Рисует спрайт, масштабируемый с коэффициентом s.
draw_sprite_stretched(n,img,x,y,w,h) - Рисует спрайт, растянутый так, что он заполняет область с верхним левым углом (x, y), шириной w и высотой h.
draw_sprite_transparent(n,img,x,y,s,alpha) - Рисует спрайт, масштабируемый с коэффициентом s объединенный с его фоном. alpha указывает коэффициент прозрачности. Значение 0 делает спрайт, полностью прозрачным. Значение 1 делает его полностью твердым. Эта функция может создавать крутой эффект (например частично прозрачные вспышки). Хотя это будет работать довольно медленно, потому что создано программно и следовательно, функцию нужно использовать с осторожностью.
draw_background(n,x,y) - Рисует фон с индексом n в позиции (x, y).
draw_background_scaled(n,x,y,s) - Рисует масштабируемый фон.
draw_background_stretched(n,x,y,w,h) - Рисует фон, растянутый до обозначенной области.
draw_background_transparent(n,x,y,s,alpha) - Рисует масштабированный фон с коэффициентом s и прозрачностью alpha (0-1) (медленно!).
draw_background_tiled(n,x,y) - Рисует плиточный фон, так что он полностью заполняет комнату.
Следующие функции рисунка рисуют основные формы. Они используют множество
свойств, в особенности кисть (brush) и цветное перо (pen color), которые могут
быть установлены, используя некоторые переменные.
draw_pixel(x,y) - Рисует пиксел в (x, y) цветной кистью.
draw_fill(x,y) - Заливка от позиции (x, y) цветной кистью.
draw_line(x1,y1,x2,y2) - Рисует линию от (x1, y1) к (x2, y2).
draw_circle(x,y,r) - Рисует круг в (x, y) с радиусом r.
draw_ellipse(x1,y1,x2,y2) - Рисует эллипс.
draw_rectangle(x1,y1,x2,y2) - Рисует прямоугольник.
draw_roundrect(x1,y1,x2,y2) - Рисует округленный прямоугольник.
draw_trangle(x1,y1,x2,y2,x3,y3) - Рисует треугольник.
draw_arc(x1,y1,x2,y2,x3,y3,x4,y4) - Рисует дугу эллипса.
draw_chord(x1,y1,x2,y2,x3,y3,x4,y4) - Рисует хорду эллипса.
draw_pie(x1,y1,x2,y2,x3,y3,x4,y4) - Рисует круг эллипса.
draw_button(x1,y1,x2,y2,up) - Рисует кнопку, up означает вверх (1), или down - вниз (0).
draw_text(x,y,string) - Рисует строку в позиции (x, y).
Ты можешь изменить множество параметров настроек, таких как цвет линии (перо),
область (кисть) и шрифт, и много других свойств шрифта. Эффект этих переменных
глобален! Так, если ты изменяешь их в подпрограмме рисования для одного объекта,
они также применяются к другим объектам, рисуемым позже. Ты можешь также
использовать эти переменные в других событиях. Например, если они не изменяются,
ты можешь устанавить их однажды в начале игры (что является намного более
эффективным).
brush_color - Цвет используемый для заполнения форм. Доступен целый диапазон встроенных цветов:
c_aqua
c_black
c_blue
c_dkgray
c_fuchsia
c_gray
c_green
c_lime
c_ltgray
c_maroon
c_navy
c_olive
c_purple
c_red
c_silver
c_teal
c_white
c_yellow
Другие цвета могут быть созданы, используя подпрограмму make_color(red,green,blue),
где красный, зеленый и синий должны иметь значения в диапазоне между 0 и 255.
brush_style - Текущий стиль кисти, используемый для наполнения. Доступны следующие стили:
bs_hollow
bs_solid
bs_bdiagonal
bs_fdiagonal
bs_cross
bs_diagcross
bs_horizontal
bs_vertical
pen_color - Цвет пера, для рисования границ.
pen_size - Размер пера в пикселах.
font_color - Цвет используемого шрифта.
font_size - Размер используемого шрифта (в точках).
font_name - Название шрифта (строка).
font_style - Стиль для шрифта. Доступны следующие стили:
fs_normal
fs_bold
fs_italic
fs_bolditalic
font_angle - Угол, с которым вращается шрифт (0-360 градусов). Например, для вертикального текста используется значение 90.
font_align - Выравнивание текста w.r.t. данной позиции. Могут использоваться следующие значения:
fa_left
fa_center
fa_right
Существует несколько разных функций:
string_width(string) - Ширина строки в текущем шрифте. Может использоваться для точно позиционирования графики.
string_height(string) - Высота строки в текущем шрифте.
screen_gamma(r,g,b) - Устанавливает значения гамма коррекции. r,g,b должны находится в диапазоне от -1 до 1. По умолчанию - 0. Когда ты используешь значение меньше чем 0, то определяемый цвет становится более темным. Если ты используешь значение больше чем 0, то цвет становится мягче. В большинстве случаев ты будешь оставлять эти три значения неизменными. Например, чтобы получить эффект молнии (lightning) ты можешь временно приблизить все три значения к 1. Эта функция работает только в исключительном режиме!
screen_save(fname) - Сохраняет bmp изображение экрана в файле с данным именем. Полезно для создания скриншотов.
screen_save_part(fname,left,top,right,bottom) - Сохраняет часть экрана в файле с данным именем.
Виды (Views)
Как ты должно быть знаешь, ты можешь определить до восьми различных видов
(отображений) при проектировании комнат. Таким образом ты можешь показывать
разные части комнаты в различных местах на экране. Также, ты можешь быть
уверен, что специфический объект всегда останется видимым. Ты можешь управлять
видами из кода. Ты можешь сделать представления видимыми или невидимыми, и
изменять место или размер представления относительно экрана или позицию
представлени в комнате (что бывает полезным, в частности, когда ты не
указываешь никакого видимого объекта), ты можешь изменить размер горизонтальной
и вертикальной границы вокруг видимого объекта, и ты можешь указать, какой
объект должен остаться видимым в представлении. Последнее очень важно, когда в
течение игры измененяются основные объекты. Например, ты можешь изменять объект
главного персонажа, основываясь на его текущем состоянии. К сожалению, сее
означает, что объект больше не должен оставаться видимым. Это может быть
исправлено одной строкой кода в событии создания всех возможных основных
объектов (предполагается, что это должно произойти в первом виде):
{
view_object[0] = object_index;
}
Существуют следующие переменные, которые влияют на вид (отображение). Все,
кроме первых двух - массивы с диапозоном от 0 (первый вид) до 7 (последний
вид).
view_enabled - Допускается отображение или нет.
view_current* - Рисуемый в настоящее время вид (0-7). Используй это только в событии рисования. Ты можешь, например, установить эту переменную, чтобы рисовать некоторые вещи только в одном виде. Переменная не может быть изменена.
view_visible[0..7] - Является ли определенное отображение видимым на экране.
view_left[0..7] - Левая позиция отображения в комнате.
view_top[0..7] - Верхняя позиция отображения в комнате.
view_width[0..7] - Ширина отображения (в пикселах).
view_height[0..7] - Высота отображения (в пикселах).
view_x[0..7] - X-позиция отображения на экране.
view_y[0..7] - Y-позиция отображения на экране.
view_hborder[0..7] - Размер горизонтальной границы вокруг видимого объекта (в пикселах).
view_vborder[0..7] - Размер вертикальной границы вокруг видимого объекта (в пикселах).
view_hspeed[0..7] - Максимальная горизонтальная скорость отображения.
view_vspeed[0..7] - Максимальная вертикальная скорость отображения.
view_object[0..7] - Объект, чей образец должен остаться видимым при отображении.
Обрати внимание, что размер изображения на экране определяется на основании
видимых представлениях в начале комнаты. Если ты изменяешь виды в течение игры,
они больше не смогут быть адаптированы на экране. Размер экрана не адаптируется
автоматически. Поэтому, если тебе понадобится это, ты должен будешь сделать сее
самостоятельно, используя следующие переменные:
screen_width - Ширина изображения на экране, то есть та область, в которой мы рисуем. Когда нет никаких видов, она будет тем же самым что и room_width.
screen_height - Высота изображения на экране.
Переходы (Transitions)
Как ты должно быть уже знаешь, когда ты двигаешся из одной комнаты в другую, ты
можешь указать переход. Ты можешь также установить переход для следующего
фрейма, без перехода в другую комнату, используя переменную, называемую
transition_kind. Если ты определишь значение в диапазоне между 1 и 13 для
соответствующего используемого перехода (эти же самые переходы, ты можешь
указать для комнат). Значение 0 указывает на отсутствие перехода.
Это влияет только на следующий рисуемый фрейм. Ты можешь также устанавить
эти переменные перед перемещением в следующую комнату, используя код.
transition_kind - Указывает следующий фрейм перемещения (0-13).
transition_time - Общее время, используемое для перемещения (в миллисекундах).
transition_steps - Число шагов для перемещения.
Перекрашивание экрана
Как правило в конце каждого шага, комната на экране перекрашивается. Но в
редких ситуациях ты должен перекрасить комнату в иные моменты. Это происходит,
когда твоя программа временно не работает. Например, перед ожиданием (sleeping),
перекрашивание некоторое время может не понадобится. Также, когда твой код
отображает сообщение и ожидает когда игрок, нажмет клавишу, перекрашивание
понадобится только между происходящими событиями. Для того чтобы сделать это,
существуют две отдельные подпрограммы.
screen_redraw() - Перерисовывает комнату, вызывая все события рисования.
screen_refresh() - Регенерирует экран, используя текущее изображение комнаты (событие рисования не выполняется).
Для того чтобы понять назначение второй функции, тебе понадобится немного более
подробно ознакомится с внутренней работой рисования. Имеется внутреннее
изображение, над которым производится весь процесс рисования. Это изображение
не видимо на экране. И только в конце шага, после того, как происходит весь
процесс рисования, отображаемая на экране картинка заменяется этим внутренним
изображением. (Это называется двойной буферизацией). Первая функция
перерисовывает внутреннее изображение и затем регенерирует отображаемую
картинку. Вторая функция только регенерирует изображение находящееся на экране.
Далее нужно также понять, почему ты не можешь использовать действия рисования
или функции в других событиях, кроме событий рисования. Дело в том, что другие
события будут рисовать что-либо на внутреннем изображении, но при этом
нарисованое не будет в последствии видимо на экране. И когда события рисования
будет выполнено, сначала будет нарисован фон комнаты, стирая при этом все, что
ты нарисовал на внутреннем изображении. Но когда ты используешь screen_refresh()
после того, как рисование произведено, модифицированное изображение станет
видимым на экране. Так, например, сценарий может нарисовать на экране некоторый
текст, вызвать функцию (refresh) и затем дожидаться когда игрок нажмет клавишу.
Вот пример соответствующей части кода.
{
draw_text(screen_width/2,100,'Нажми любую клавишу для продолжения.');
screen_refresh();
keyboard_wait();
}
Учти, что, когда ты рисуешь в другом событии, а не в событии рисования, ты
рисуешь просто на изображении, а не на виде! Поэтому координаты, которые ты
используешь будут такими же, как будто нет никакого вида.
Будь внимателен при использовании этой методики. Убедись в том, что ты
ты понимаешь что и как, и понимаешь, что регенерация экрана будет затрачивать
некоторое время.
© 2001-2002 Simple Life & World
|