|
Misc Uopilot - GML Прибамбасы к пилоту |
|
|
EL-GReeN |
29.7.2012, 19:58
|
Journeyman
Сообщений: 474
Регистрация: 18.7.2011 Группа: Пользователи Наличность: 0 Из: Россия
Пользователь №: 13.815
Возраст: 32
|
Misc Uopilot ловит из буфера спец ключ misc и то что после него исполняет, функции и синтаксис должны быть на GML (это JS подобный язык в движке Game Maker).
Код set linedelay 20 set clipboard misc window_set_showborder(0) //Границы вокруг окна (0-1). set clipboard misc window_set_rectangle(600,0,400,20) //Позиция и растягивание размера окна (x, y, w, h). set clipboard misc window_set_stayontop(1) //Поверх всего (0-1). set clipboard misc t1x=4; t1y=2; t1t='Хп:' //Обьект текст1 (t1x=x, t1y=y, t1t=text) set clipboard misc t2x=100; t2y=2; t2t='Мп:' //Обьект текст2 set clipboard misc t3x=200; t3y=2; t3t='Стам:' //Обьект текст3 set clipboard misc t4x=300; t4y=2; t4t='Голд:' //Обьект текст4 set #hp 0 :re2 set clipboard misc t1t='Хп: ' + '#hp' //Динамическое изменение текста1 wait 100 set #hp #hp + 5 if #hp < 101 goto re2 end_if end_script Вариант 2: Код set linedelay 2 set #handleWin findwindow (Misc_uopilot) //Получение хендла окна миска set #result setwindowtext (#handleWin, misc window_set_showborder(0)) //Границы вокруг окна (0-1). set #result setwindowtext (#handleWin, misc window_set_rectangle(600,0,400,20)) //Позиция и растягивание размера окна (x, y, w, h). set #result setwindowtext (#handleWin, misc window_set_stayontop(1)) //Поверх всего (0-1). set #result setwindowtext (#handleWin, misc t1x=4; t1y=2; t1t='Хп:') //Обьект текст1 (t1x=x, t1y=y, t1t=text) set #result setwindowtext (#handleWin, misc t2x=100; t2y=2; t2t='Мп:') //Обьект текст2 set #result setwindowtext (#handleWin, misc t3x=200; t3y=2; t3t='Стам:') //Обьект текст3 set #result setwindowtext (#handleWin, misc t4x=300; t4y=2; t4t='Голд:') //Обьект текст4 set #hp 0 :re2 set #result setwindowtext (#handleWin, misc t1t='Хп: ' + '#hp') //Динамическое изменение текста1 wait 100 set #hp #hp + 5 if #hp < 101 goto re2 end_if end_script Выключается нажатием искейпа если активно его окно, либо из скрипта:
Код set clipboard misc game_end() Изменение размера окна:
Код set clipboard misc room_set_width(0,400) //Ширина (0, w). wait 20 set clipboard misc room_set_height(0,20) //Высота (0, h). wait 20 set clipboard misc room_restart()//Перезапуск окна, после этого все настройки сбиваются, поэтому делается в первую очередь. wait 20 end_script
Выполнение кода в миске происходит 1 раз при таком обращении: Код set clipboard misc room_set_height(0,20) или в альтернативном: set #handleWin findwindow (Misc_uopilot) //Получение хендла окна миска set #result setwindowtext (#handleWin, misc e_stp0='draw_rect_screen(1100,0,1150,20)') (Функция room_set_height(0,20) заносится в строковую переменную и выполняется, после чего переменная очищается(это может быть и не функция а большой кусок кода)) Для многократного выполнения есть спец переменные в которых код не очищается и выполняется 1 раз каждый шаг, шаг можно изменить, и пока он по умолчанию 5мс (200 раз в секунду=фпс 200) Обычные функции требующие постоянного выполнения должны быть в событии Step: e_stp0, e_stp1, e_stp2... e_stp10 Функции рисования должны быть в событии Draw:(за исключением функций рисования вне окна, они могут быть в step) e_drw0, e_drw1, e_drw2... e_drw10 Также есть таймерные события отличающиеся от step только тем что выполняются раз в 10, 100, 1000 шагов(IMG: style_emoticons/default/sad.gif)для повышения производительности) e_slow10 e_slow100 e_slow1000 Таким образом можно засунуть свой код в строковую переменную(например e_slow10), обработчик будет постоянно его выполнять до тех пор пока не завершена программа или не будет очищена переменная: Код set clipboard misc e_slow10='room_set_height(0,20)' set clipboard misc e_slow10=''
Отличие лишь в том что при таком обращении код помещается не в буфер а в заголовок окна миска, где он успешно отлавливается и выполняется, затем заголовок возвращается в исходное состояние:(misc_uopilot). Код set linedelay 0 set #handleWin findwindow (Misc_uopilot) //Получение хендла окна миска set #result setwindowtext (#handleWin, misc e_stp0='draw_rect_screen(1100,0,1150,20)') //Установка кода в качестве заголовка, через несколько мс вернется обратно //Обратная связь set $x 100 set #result setwindowtext (#handleWin, misc clipboard_set_text(string(random($x)))// Ответ будет в буфере set #result setwindowtext (#handleWin, misc room_caption=string(random($x))//Ответ будет в заголовке wait 2 set $x2 GetWindowtext (#handleWin) //Получаем ответ из заголовка, можно не успеть забрать или опоздать, до изменения заголовка обратно wait 20 get clipboard $x //Получаем ответ из буфера, намного надежнее msg $x $x2 end_script Графика на экране:
Есть функции рисования которых нет в документации (потому что они из дллки), полезны тем что в отличие от стандартных позволяют рисовать вне окна то есть в любом месте экрана: (линии, текст, прямоугольники) Код set linedelay 20 set clipboard misc set_pen(1,c_red) //Установка ширины линии и цвета(ширина, цвет). set clipboard misc set_brush(c_lime) //Установка цвета прямоугольника(цвет). set clipboard misc e_slow100='draw_rect_screen(1100,0,1150,20)' //Функция рисования прямоугольников на экране(лево, право, верх, низ). set clipboard misc e_drw0='draw_rect_screen(1155,0,1175,20)' set clipboard misc e_slow10='draw_line_screen(10,10,300,10)' //Функция рисования линий на экране(x1, y1, x2, y2). set clipboard misc e_stp0='draw_text_screen(1000,1,"Misc Uopilot",c_aqua)'//Функция рисования текста на экране(x, y, текст, цвет). //еще есть рисование текстуры но по крайней мере у меня оно начинает глючить через несколько минут //set clipboard misc pic = load_bitmap("1test.bmp") //Загрузка текстуры. //set clipboard misc e_stp1='draw_bitmap_screen(pic,400,0)'//Функция рисования текстуры на экране(x, y, текст, цвет). end_script Пример обратной связи:
Код set $x 100 set clipboard misc clipboard_set_text(string(random($x))) wait 20 get clipboard $x set clipboard "" msg $x end_script Скачать Misc Uopilot и документацию:
Дополнительное дополнение добавленное позже:
Дополнительно по миску, это отдельная программка, может взаимодействовать с пилотом, скомпилирована в движке game maker 8.0(или 8.1) . Миск может ВСЕ что есть в этом движке через выполнение кода движка (GML внутренний язык движка для программирования), именно этот код посылается из пилота в миск. Из этого следует, что для того что бы хорошо понять как работать с миском нужно знать этот движок. Если вы не знаете этот двиг, вы все равно можете хорошо понять что к чему если вы программист, по примерам, по приложенной документации движка. Если вы не знаете ни движок ни программирование (нормальное), вы не сможете хорошо понять как использовать миск, если только не потратите много времени на осознание и медитацию над пилотом и GM (время может быть меньше если вы уже знаете пилот, javascript и зашкаливает мотивация). Под "хорошо понять что к чему" имеется ввиду возможность делать действительно сложные вещи, такие как сеть, навороченный интерфейс или сложная игровая графика с логикой. Развивать миск можно но только в направлении уменьшения кода задач пользователей и удобства. http://rutracker.org/forum/viewtopic.php?t=2573603 Game Maker v8.0 Pro
--------------------
|
|
|
|
EL-GReeN |
29.7.2012, 22:32
|
Journeyman
Сообщений: 474
Регистрация: 18.7.2011 Группа: Пользователи Наличность: 0 Из: Россия
Пользователь №: 13.815
Возраст: 32
|
Цитата(DarkMaster @ 29.7.2012, 23:16) А более приземленно можно пояснить что это такое? Возможность выполнить произвольный ява подобный код?
Да, можно много чего придумать полезного, графика, сеть, только есть проблемка с подлагиванием буфера пока ничего не идет в голову чем скоростным его можно заменить для обмена данными. Вырезка из документации по функциям: Функции обработки вещественных чисел:
random(x) Возвращает случайное вещественное число между 0 и x. Число всегда меньше чем x. random_set_seed(seed) Устанавливает начальное число (целое число), который используется для генерации случайного числа. Может использоваться, чтобы повторить некоторую случайную последовательность. random_get_seed() Возвращает текущее начальное число. randomize() Устанавливает начальное число на случайное число. choose(val1,val2,val3,...) Возвращает одно из выбранных аргументов произвольно. Функция может иметь вплоть до 16 аргументов. abs(x) Возвращает абсолютную величину x. sign(x) Возвращает знак числа x. (-1, 0 или 1). round(x) Возвращает x, округлённый до самого близкого целого числа. floor(x) Возвращает пол x, то есть x округлённый до ближайшего целого числа, которое меньше x. ceil(x) Возвращает потолок x, то есть x округлённый до ближайшего целого числа, которое больше x. frac(x) Возвращает дробную часть x, то есть часть, стоящую позади десятичной точки. sqrt(x) Возвращает квадратный корень из x. X должен быть неотрицательным. sqr(x) Возвращает x*x. power(x,n) Возвращает x в степени n. exp(x) Возвращает e в степени x. ln(x) Возвращает натуральный логарифм от x. log2(x) Возвращает логарифм от x по основанию 2. log10(x) Возвращает логарифм от x по основанию 10. logn(n,x) Возвращает логарифм от x по основанию n. sin(x) Возвращает синус x (в радианах). cos(x) Возвращает косинус x (в радианах). tan(x) Возвращает тангенс x (в радианах). arcsin(x) Возвращает арксинус x. arccos(x) Возвращает арккосинус x. arctan(x) Возвращает арктангенс x. arctan2(y,x) Возвращает точное значение арктангенса x/y. degtorad(x) Преобразовывает градусы в радианы. radtodeg(x) Преобразовывает радианы в градусы. min(val1,val2,val3,...) Возвращает минимум величин. Функция может иметь вплоть до 16 аргументов. Они должны или быть всеми реальными величинами или являться всеми строками. max(val1,val2,val3,...) Возвращает максимум величин. Функция может иметь вплоть до 16 аргументов. Они должны или быть всеми реальными величинами или являться всеми строками. mean(val1,val2,val3,...) Возвращает среднее число величин. Функция может иметь вплоть до 16 аргументов. Они должны быть всеми реальными величинами. median(val1,val2,val3,...) Возвращает величины медианы, то есть, среднюю величину. (Когда количество аргументов чётное, то возвращается меньшее значение двух средних величин.) Функция может иметь вплоть до 16 аргументов. Они должны все быть реальными величинами. point_distance(x1,y1,x2,y2) Возвращает расстояние между точкой (x1,y1) и (x2,y2). point_direction(x1,y1,x2,y2) Возвращает угол (в градусах) между осью X и вектором с началом в точке (x1,y1) и окончанием в точке (x2,y2). lengthdir_x(len,dir) Возвращает горизонтальный x-компонент вектора определённый указанной длиной и направлением. lengthdir_y(len,dir) Возвращает горизонтальный y-компонент вектора определённый указанной длиной и направлением. is_real(x) Возвращает, если x реальная величина (по сравнению со строкой). is_string(x) Возвращает, если x является строкой (по сравнению с реальной величиной).
Функции обработки строковых переменных:
chr(val) Возвращает символ с ASCI кодом val. ord(str) Возвращает ASCI код первого символа в строке str. real(str) Если в строковой переменной содержится число, то данная функция переводит его в вещественный тип и возвращает полученную строку. string(val) Переводит значение вещественной переменной в стандартный строковый формат (без чисел после запятой, если число целое; и с двумя числами, если дробное) и возвращает полученное число. string_format(val,tot,dec) Переводит значение val в строку в Ваш собственный формат: tot - указывает общее число мест и dec - указывает количество чисел после запятой. string_length(str) Возвращает количество символов в строке. string_pos(substr,str) Возвращает начальную позицию подстроки substr в строке str или 0, если указанная подстрока не встречается. string_copy(str,index,count) Возвращает подстроку, содержащуюся в строке str, начинающуюся с позиции index, и общей длинной count. string_char_at(str,index) Возвращает символ, находящийся в позиции index строки str. string_delete(str,index,count) Возвращает строку str, из которой удалена подстрока, которая начинается с позиции index и общей длиной count. string_insert(substr,str,index) Возвращает строку str, в которую вставлена подстрока substr, начинается с указанной позиции index. string_replace(str,substr,newstr) Возвращает строку str, в которой первая встречающаяся подстрока substr будет заменена на подстроку newstr. string_replace_all(str,substr,newstr) Возвращает строку str, в которой все встречающиеся подстроки substr заменены подстрокой newstr. string_count(substr,str) Возвращает число, которое показывает, сколько раз подстрока substr встречается в строке str string_lower(str) Возвращает строку str, записанную маленькими буквами. string_upper(str) Возвращает строку str, записанную большими буквами. string_repeat(str,count) Возвращает строку, которая состоит из строки str, повторяющейся count раз. string_letters(str) Возвращает строку str, выбрасывая из неё все числа. string_digits(str) Возвращает строку str, выбрасывая из неё все буквенные символы. string_lettersdigits(str) Возвращает строку str, выбрасывая из неё всё, что не является буквенным символом либо числом.
Следующие функции имеют отношение к буферу обмена для содержания текста.
clipboard_has_text() Возвращает, если текст присутствует в буфере. clipboard_get_text() Возвращает текущий текст в буфер. clipboard_set_text(str) Устанавливает строку str в буфер.
--------------------
|
|
|
|
EL-GReeN |
30.7.2012, 8:40
|
Journeyman
Сообщений: 474
Регистрация: 18.7.2011 Группа: Пользователи Наличность: 0 Из: Россия
Пользователь №: 13.815
Возраст: 32
|
Цитата(DarkMaster @ 30.7.2012, 0:24) Опыт моего программирования полный смех. Все что тут нужно, это повешать хук на процесс.
Аналогично, ушел гуглить "хук"... оно же низкоуровневое, что делает не возможным его создание в гмл если только дллками которые и так доступны в пилоте. Цитата(DarkMaster @ 30.7.2012, 0:59) EL-GReeN, я те в глаз дам. Сейчас сижу смотрю на функции с числами и чую до рассвета буду писать аналоги на пилотовских подпрограммах) Реле сцуко щелкнуло... теперь не успокоюсь...
ИМХО больше строк не значит лучше, например в исходнике миска всего 3 коротких куска кода, а все благодаря скрытию движком возможности ковыряния в атомах: gml
obj0
Create: draw_set_font(font0) t1x=0 t1y=0 t1t='0' t2x=-100 t2y=-100 t2t='0' t3x=-100 t3y=-100 t3t='0' t4x=-100 t4y=-100 t4t='0'
Step: if clipboard_has_text()//если в буфере не пусто { bfr = clipboard_get_text(); if string_pos('misc',bfr) = 1 //если в буфере есть ключ misc { bfr = string_delete(bfr,1,5); clipboard_set_text('') execute_string(bfr) } }
Draw: draw_text(t1x,t1y,t1t) draw_text(t2x,t2y,t2t) draw_text(t3x,t3y,t3t) draw_text(t4x,t4y,t4t)
--------------------
|
|
|
|
EL-GReeN |
2.8.2012, 12:01
|
Journeyman
Сообщений: 474
Регистрация: 18.7.2011 Группа: Пользователи Наличность: 0 Из: Россия
Пользователь №: 13.815
Возраст: 32
|
Предлагаю эту тему оставить как есть найти не проблема, такой оформленный пост пойдет?: GML Прибамбасы к пилоту
Misc Uopilot ловит из буфера спец ключ misc и то что после него исполняет, функции и синтаксис должны быть на GML (это JS подобный язык в движке Game Maker).Все скрипты примеры выполняется при запущенной программе. Окошко с возможностью отображения 4х строк на своей поверхности:Код set linedelay 20 set clipboard misc window_set_showborder(0) //Границы вокруг окна (0-1). set clipboard misc window_set_rectangle(600,0,400,20) //Позиция и растягивание размера окна (x, y, w, h). set clipboard misc window_set_stayontop(1) //Поверх всего (0-1). set clipboard misc t1x=4; t1y=2; t1t='Хп:' //Обьект текст1 (t1x=x, t1y=y, t1t=text) set clipboard misc t2x=100; t2y=2; t2t='Мп:' //Обьект текст2 set clipboard misc t3x=200; t3y=2; t3t='Стам:' //Обьект текст3 set clipboard misc t4x=300; t4y=2; t4t='Голд:' //Обьект текст4 set #hp 0 :re2 set clipboard misc t1t='Хп: ' + '#hp' //Динамическое изменение текста1 wait 100 set #hp #hp + 5 if #hp < 101 goto re2 end_if end_script Вариант 2: Код set linedelay 2 set #handleWin findwindow (Misc_uopilot) //Получение хендла окна миска set #result setwindowtext (#handleWin, misc window_set_showborder(0)) //Границы вокруг окна (0-1). set #result setwindowtext (#handleWin, misc window_set_rectangle(600,0,400,20)) //Позиция и растягивание размера окна (x, y, w, h). set #result setwindowtext (#handleWin, misc window_set_stayontop(1)) //Поверх всего (0-1). set #result setwindowtext (#handleWin, misc t1x=4; t1y=2; t1t='Хп:') //Обьект текст1 (t1x=x, t1y=y, t1t=text) set #result setwindowtext (#handleWin, misc t2x=100; t2y=2; t2t='Мп:') //Обьект текст2 set #result setwindowtext (#handleWin, misc t3x=200; t3y=2; t3t='Стам:') //Обьект текст3 set #result setwindowtext (#handleWin, misc t4x=300; t4y=2; t4t='Голд:') //Обьект текст4 set #hp 0 :re2 set #result setwindowtext (#handleWin, misc t1t='Хп: ' + '#hp') //Динамическое изменение текста1 wait 100 set #hp #hp + 5 if #hp < 101 goto re2 end_if end_script Выключается нажатием искейпа если активно его окно, либо из скрипта:Код set clipboard misc game_end() Изменение размера окна миска:Код set clipboard misc room_set_width(0,400) //Ширина (0, w). wait 20 set clipboard misc room_set_height(0,20) //Высота (0, h). wait 20 set clipboard misc room_restart()//Перезапуск окна, после этого все настройки сбиваются, поэтому делается в первую очередь. wait 20 end_script Выполнение:Выполнение кода в миске происходит 1 раз при таком обращении: Код set clipboard misc room_set_height(0,20) или в альтернативном: set #handleWin findwindow (Misc_uopilot) //Получение хендла окна миска set #result setwindowtext (#handleWin, misc e_stp0='draw_rect_screen(1100,0,1150,20)') (Функция room_set_height(0,20) заносится в строковую переменную и выполняется, после чего переменная очищается(это может быть и не функция а большой кусок кода)) Для многократного выполнения есть спец переменные в которых код не очищается и выполняется 1 раз каждый шаг, шаг можно изменить, и пока он по умолчанию 5мс (200 раз в секунду=фпс 200) Обычные функции требующие постоянного выполнения должны быть в событии Step: e_stp0, e_stp1, e_stp2... e_stp10 Функции рисования должны быть в событии Draw:(за исключением функций рисования вне окна, они могут быть в step) e_drw0, e_drw1, e_drw2... e_drw10 Также есть таймерные события отличающиеся от step только тем что выполняются раз в 10, 100, 1000 шагов(IMG: style_emoticons/default/sad.gif)для повышения производительности) e_slow10 e_slow100 e_slow1000 Таким образом можно засунуть свой код в строковую переменную(например e_slow10), обработчик будет постоянно его выполнять до тех пор пока не завершена программа или не будет очищена переменная: Код set clipboard misc e_slow10='room_set_height(0,20)' set clipboard misc e_slow10='' Выполнение(IMG:style_emoticons/default/sad.gif)способ 2)Отличие лишь в том что при таком обращении код помещается не в буфер а в заголовок окна миска, где он успешно отлавливается и выполняется, затем заголовок возвращается в исходное состояние:(misc_uopilot). Код set linedelay 0 set #handleWin findwindow (Misc_uopilot) //Получение хендла окна миска set #result setwindowtext (#handleWin, misc e_stp0='draw_rect_screen(1100,0,1150,20)') //Установка кода в качестве заголовка, через несколько мс вернется обратно //Обратная связь set $x 100 set #result setwindowtext (#handleWin, misc clipboard_set_text(string(random($x)))// Ответ будет в буфере set #result setwindowtext (#handleWin, misc room_caption=string(random($x))//Ответ будет в заголовке wait 2 set $x2 GetWindowtext (#handleWin) //Получаем ответ из заголовка, можно не успеть забрать или опоздать, до изменения заголовка обратно wait 20 get clipboard $x //Получаем ответ из буфера, намного надежнее msg $x $x2 end_script Графика на экране:Есть функции рисования которых нет в документации (потому что они из дллки), полезны тем что в отличие от стандартных позволяют рисовать вне окна то есть в любом месте экрана: (линии, текст, прямоугольники) Код set linedelay 20 set clipboard misc set_pen(1,c_red) //Установка ширины линии и цвета(ширина, цвет). set clipboard misc set_brush(c_lime) //Установка цвета прямоугольника(цвет). set clipboard misc e_slow100='draw_rect_screen(1100,0,1150,20)' //Функция рисования прямоугольников на экране(лево, право, верх, низ). set clipboard misc e_drw0='draw_rect_screen(1155,0,1175,20)' set clipboard misc e_slow10='draw_line_screen(10,10,300,10)' //Функция рисования линий на экране(x1, y1, x2, y2). set clipboard misc e_stp0='draw_text_screen(1000,1,"Misc Uopilot",c_aqua)'//Функция рисования текста на экране(x, y, текст, цвет). //еще есть рисование текстуры но по крайней мере у меня оно начинает глючить через несколько минут //set clipboard misc pic = load_bitmap("1test.bmp") //Загрузка текстуры. //set clipboard misc e_stp1='draw_bitmap_screen(pic,400,0)'//Функция рисования текстуры на экране(x, y, текст, цвет). end_script Пример обратной связи:Код set $x 100 set clipboard misc clipboard_set_text(string(random($x))) wait 20 get clipboard $x set clipboard "" msg $x end_script Скачать Misc Uopilot и документацию:Misc_uopilot.7z: http://zalil.ru/33626056Game_Maker8_Документация_ru_en.7z: http://zalil.ru/33622973
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|