Небольшие полезные скрипты для GameMaker: Studio

Скачать в Marketplace (бесплатно)

Список:

  • Одномерные массивы
    • array_create(value, …)
    • array_create_from_string(separator, is_real, string)
    • array_to_string(separator, pure, array)
    • array_sort(array, ascend, change_source)
  • Конвертирование
    • convert_dec_to_hex(value, [digits])
    • convert_hex_to_dec(value)
    • convert_dec_to_bin(value, [digits])
    • convert_bin_to_dec(value)
    • convert_range(from_range, to_range, pos)
    • convert_gm_color_to_hex(color)
  • Отладка / Строки
    • log(val[, val2, val3…])
    • string_build(val[, val2, val3…])
    • string_build_comma(val[, val2, val3…])
  • Разное
    • draw_set_colour_reverse(colour)

 

Одномерные массивы

array_create(value, …)

Создание массива (не более 16 элементов)

res = array_create(10, 20, 30)      -> res[0] = 10, res[1] = 20, res[2] = 30
res = array_create("A", "B", "C")   -> res[0] = "A", res[1] = "B", res[2] = "C"

 

array_create_from_string(separator, is_real, string)

Создание массива из строки

res = array_create_from_string(",", false, "10,20,30")  -> res[0] = "10", res[1] = "20", res[1] = "30"
res = array_create_from_string(",", true, "10,20,30")   -> res[0] = 10, res[1] = 20, res[1] = 30
res = array_create_from_string(";", false, "A;B;C")     -> res[0] = "A", res[1] = "B", res[1] = "C"

 

array_to_string(separator, pure, array)

Преобразование массива в строку

data[0] = "Array";
data[1] = "To";
data[2] = "String";

array_to_string(";", true, data)   -> "Array;To;String"
array_to_string(";", false, data)  -> "{ Array; To; String }"
array_to_string(",", false, data)  -> "{ Array, To, String }"

 

array_sort(array, ascend, change_source)

Сортировка массива

 

Конвертирование

convert_dec_to_hex(value, [digits])

Получение шестнадцатеричного представления числа

 convert_dec_to_hex(123456, 6)   -> "01E240"
 convert_dec_to_hex($ff00ff, 8)  -> "00FF00FF"

 

convert_hex_to_dec(value)

Получение десятичного числа из шестнадцатеричного представления

convert_hex_to_dec("1E240")   -> 123456
convert_hex_to_dec("FF00FF")  -> 16711935

 

convert_dec_to_bin(value, [digits])

Получение двоичного представления числа

convert_dec_to_bin(4504)   -> "1000110011000"
convert_dec_to_bin(65535)  -> "1111111111111111"

 

convert_bin_to_dec(value)

Получение десятичного числа из двоичного представления

convert_bin_to_dec("1000110011000")     -> 4504
convert_bin_to_dec("1111111111111111")  -> 65535

 

convert_range(from_range, to_range, pos)

Преобразование числа из одного диапазона в другой диапазон

convert_range(1000, 1, 500) -> 0.5 (из 0..1000 в 0..1)

 

convert_gm_color_to_hex(color)

Получение шестнадцатеричного представления вида RRGGBB из цвета GMS (BBGGRR)

convert_gm_color_to_hex(c_red)    -> "FF0000"
convert_gm_color_to_hex(c_green)  -> "008000"
convert_gm_color_to_hex(c_blue)   -> "0000FF"
convert_gm_color_to_hex($0000ff)  -> "FF0000"

 

Отладка / строки

log(val[, val2, val3…])

Печать данных в отладочную консоль (то есть, в compile form).

log("Width: ", 10, ", Height: ", 20)                   -> "Width: 10, Height: 20"
log("View x: ", view_xview[0], ", y: ", view_yview[0]) -> "View x: 0, y: 0"

 

string_build(val[, val2, val3…])

Объединение данных в строку

string_build("Count: ", 100)                  -> "Count: 100"
string_build("Count: ", 100, ", index: ", 5)  -> "Count: 100, index: 5"

 

string_build_comma(val[, val2, val3…])

Объединение данных в строку с перечислением их через запятую

string_build_comma(100, 10, 25, 30)                         -> "100, 10, 25, 30"
"View: " + string_build_comma(view_xview[0], view_yview[0]) -> "View: 0, 0"

 

Разное

draw_set_colour_reverse(colour)

Задать цвет рисования, используя нормальное RRGGBB (то есть, не перевёрнутое) значение

draw_set_colour_reverse($ff0000)  -> то же самое, что with draw_set_colour($0000ff) // c_red
draw_set_colour_reverse($00ff00)  -> draw_set_colour($00ff00) // c_lime
draw_set_colour_reverse($0000ff)  -> draw_set_colour($ff0000) // c_blue

 

Полезные скрипты для GMS

Мелкие скрипты, написанные для себя и используемые в проектах.

 

Заполнение разрядов перед числом нулями

Пример:
zero(123, 5) -> 00123

/// zero(value, bits)

var t = string(floor(argument0)); // убрать округление, если необходимы дроби
repeat (argument1 - string_length(t))
{
    t = "0" + t;
}

return t

 

Вывод числа с интерактивным отображением дробной части

Если число меньше 10, то отображается один символ после запятой. Если же число больше или равно 10, то отображается только целая часть.
При отображении дробной части, она округляется корректно, а при отображении целого числа, дробная часть просто отбрасывается, без округления.

5.73 -> “5.7”
5.76 -> “5.8”
10.73 -> “10”

/// rounding_string(val)

if argument0<10
{
    if frac(argument0) == 0
    {
        return string_format(argument0, 1, 0);
    }
    else
    {
        return string_format(argument0, 1, 1);
    }
}
else
{
    return string(floor(argument0));
}

 

Перевод строки в массив.

Тут всё очень просто.
a = string_to_array(“12,10,15,18,19,20,50,51,40,38,32,16,19,3,17,0,11,1,6,31,2”) // и так далее
a[0] -> 12
a[1] -> 10
и так далее…

/// string_to_array(string)

var i, val;

var len = string_length(argument0);
var data = argument0;
var result = 0;

for (i=1; i<100; i++)
{
    val = get_part(data, i, ",");
    if val="" break;
    result[i-1] = real(val);
}

return result;

 

Получение элемента строки.

В предыдущем скрипте используется скрипт get_part, который позволяет взять определённый элемент из строки.
Задаётся строка, номер элемента и разделитель.
Например:
get_part(“Новичок|Бывалый|Мастер|Гуру”, 2, “|”) -> “Бывалый”
При ошибке возвращает пустую строку.

/// get_part(string, section, separator)

var s1, s2, res, _string, _section, _separator;
_string = argument0
_section = max(argument1, 1)
_separator = argument2

_string = _separator+_string+_separator

s1 = find_char(_string, _section, _separator)
s2 = find_char(_string, _section+1, _separator)

if s1<0 or s2<0
{
    return ""
}

res = string_copy(_string, s1+1, s2-s1-1)
return res

 

Поиск символа в строке

Используется предыдущим скриптом.
Задаём строку, номер символа, и сам символ.

Например, в строке нужно найти положение второго символа “a”:
find_char(“abcabcabc”, 2, “a”) -> 4
Возвращает -1 при отсутствии символа.

/// find_char(string,no,symbol)

var sz, n, i;

sz = string_length(argument0) + 1

n=0
for(i=1; i<sz; i++)
{
    if string_char_at(argument0, i)=argument2
    {
        n++
        if n=argument1 return i
    }
}
return -1

 

Сортировка массива

Передаём в скрипт одномерный массив, на выходе получаем его же, но в сортированном виде.

/// array_sort(array)

var lst = ds_list_create()

for (i=0; i<array_length_1d(argument0); i++)
{
    ds_list_add(lst, argument0[i])
}

ds_list_sort(lst, true)

var res;

for (i=0; i<ds_list_size(lst); i++)
{
    res[i] = ds_list_find_value(lst, i)
}

ds_list_destroy(lst)

return res

Принадлежность точки многоугольнику

Скрипт проверки вхождения точки в многоугольник (то есть проверяем, внутри многоугольника точка, или снаружи), с учётом попадания на грани и вершины многоугольника. Здесь реализован метод трассировки луча (учёт числа пересечений) Сама проверка состоит из последовательного вызова скрипта для каждой пары вершин многоугольника. Скрипт проверяет, пересекает ли луч, направленный вправо, отрезок между указанными вершинами. Если пересекает, то возвращается результат -1, если нет, то 1. Если же точка лежит на отрезке, то вернётся 0. В скрипт нужно передать шесть координат – координаты X, Y вершин многоугольника и координаты X, Y проверяемой точки. Все вершины многоугольника должны проверяться последовательно. При этом можно перебирать их как по часовой стрелке, так и против часовой стрелки. Вызов скрипта может происходить, например, так:

r1 = check_point(x1, y1, x2, y2, x0, y0)
r2 = check_point(x2, y2, x3, y3, x0, y0)
r3 = check_point(x3, y3, x4, y4, x0, y0)
r4 = check_point(x4, y4, x1, y1, x0, y0)

res = r1*r2*r3*r4

Собственно, скрипт проверки точки:

s_ax = argument0
s_ay = argument1
s_bx = argument2
s_by = argument3
s_mx = argument4
s_my = argument5

ax = s_ax - s_mx
ay = s_ay - s_my
bx = s_bx - s_mx
by = s_by - s_my

s = sign(ax * by - ay * bx)
if (s == 0 && (ay == 0 || by == 0) && ax * bx <= 0)
    return 0
if ((ay < 0) ^ (by < 0))
{
    if (by < 0)
        return s
    return -s
}      
return 1

Тут пример, показывающий работоспособность (все вершины можно перемещать мышкой). Действие происходит в событии draw контроллера. Использован “китайский” код, но исключительно для того, чтобы не усложнять понимание принципа работы. Например, в Студии можно все вершины передавать массивом – таким образом можно реализовать проверку с динамичным числом вершин. В примере используется многоугольник из 5 вершин, но на практике их может быть любое количество.