|
Название: Полезные скрипты Отправлено: RevolverOcelot от Ноябрь 22, 2010, 05:51:29 v v v v v Предлагаю темку, в которой будут выкладываться полезные скрипты (сделанные вами, увиденные вами - неважно), который упрощают работу, создают полезные свойства, эффекты. Никакого обсуждения - скрипт и его описание. Вот пример (скрипт не мой, увидел в каком то РПГ движке, хорошая вещь) - рисует обведенный текст. Код: draw_set_color(argument3) draw_text(argument0+1,argument1,argument4) draw_text(argument0-1,argument1,argument4) draw_text(argument0,argument1+1,argument4) draw_text(argument0,argument1-1,argument4) draw_set_color(argument2) draw_text(argument0,argument1,argument4) //argument0 = x позиция текста //argument1 = y позиция текста //argument2 = основной цвет текста //argument3 = цвет обводки текста //argument4 = 'текст' Название: Re: Полезные скрипты. Объемный звук. Отправлено: Fantom от Ноябрь 22, 2010, 21:53:21 Автор скрипта: FanTom
Простой скрипт для создания объемного звука: Код: sound_3d_set_sound_position(argument0,(x - view_xview - (view_wview div 2)) / 130, Определяет расположение звука относительно центра вида (камеры).(y - view_yview - (view_hview div 2)) / 100,4); //argument0 - название звука, расположение которого изменяется Делители (130 и 100) определяют глубину объемности. Чем больше делитель, тем качественнее изменяется расположение звука, но в то же время медленнее перелетает в "другое ухо" :) Поэтому нужно найти баланс, и для разных игр эти числа могут отличаться. Выполняя этот скрипт в каком-либо объекте, звук, записанный в нулевом аргументе, "перепрыгивает" в координаты этого объекта. Название: Re: Полезные скрипты. Работа с текстом. Отправлено: Fantom от Декабрь 17, 2010, 22:07:50 Пара скриптов по работе с текстом. 1. Автор скрипта: FanTomЗапись числа, у которого пустые разряды заполнены нулями. То есть, вместо 0 пишется 000000; вместо 25 пишется 000025. Код: (Рисование числа) scr1=string(scr); scr2=''; if string_length(scr1) < 6 {scr2+='0'} if string_length(scr1) < 5 {scr2+='0'} if string_length(scr1) < 4 {scr2+='0'} if string_length(scr1) < 3 {scr2+='0'} if string_length(scr1) < 2 {scr2+='0'} scr2+=scr1; draw_text(10,10,scr2); //scr - текущие очки, количество денег и др. 2. Автор скрипта: FanTom Разбиение сплошного текста на массив строк. Пригодится для диалогов. Код: maxphrase = string_count(chr(13),text) + 1; istart = 1; iend = 1000000; j = 0; for (i=1; i<=string_length(text); i+=1;) { if ord(string_char_at(text,i)) = 13 {iend = i; mess[j] = string_copy(text,istart,iend-istart+1); istart=i+2; j+=1; } if i=string_length(text) {iend = i; mess[j] = string_copy(text,istart,iend-istart+1); } } //text - исходный сплошной текст //mess[] - массив строк, получающийся в результате //maxphrase - количество строк в тексте Название: Re: Полезные скрипты. Отправлено: Dva_Kota от Декабрь 18, 2010, 20:24:29 Движение персонажа по 8 направлениям. Можно использовать для изометрии или TDS.
Код: if (keyboard_check(vk_right)) {//нажата кнопка вправо sprite_index=spr_character_E image_speed=0.35 motion_set(0,5) if (keyboard_check(vk_down)) {//нажаты кнопки вправо и вниз sprite_index=spr_character_SE; image_speed=0.35; motion_set(315,5); } else { if (keyboard_check(vk_up)) {//нажаты кнопки вправо и вверх sprite_index=spr_character_NE; image_speed=0.35; motion_set(45,5); } } } else { if (keyboard_check(vk_down)) {//нажата кнопка вниз sprite_index=spr_character_S; image_speed=0.35; motion_set(270,5); if (keyboard_check(vk_left)) {//нажаты кнопки вниз и влево sprite_index=spr_character_SW; image_speed=0.35; motion_set(225,5); } } else { if (keyboard_check(vk_left)) {//нажата кнопка влево sprite_index=spr_character_W; image_speed=0.35; motion_set(180,5); if (keyboard_check(vk_up)) {//нажаты кнопки влево и вверх sprite_index=spr_character_NW; image_speed=0.35; motion_set(135,5); } } else { if (keyboard_check(vk_up)) {//нажата кнопка вверх sprite_index=spr_character_N; image_speed=0.35; motion_set(90,5); } else {//ничего не нажато motion_set(direction,0); image_speed=0; } } } } Название: Re: Полезные скрипты. Отправлено: UncleDec от Январь 01, 2011, 14:11:28 Скрипт des
Недавно создал скрипт, простейший, но с ним очень удобно работать. Наверное, всех уже начинает бесить код уничтожения других объектов. Итак, создаём скрипт des: И пишем: Код: with argument0 { instance_destroy() } И, уже можно им пользоваться, теперь можно писать просто des(название_объекта). Очень удобно! sm:) Название: Re: Полезные скрипты. Отправлено: TUjh от Январь 04, 2011, 12:00:49 Простой скрипт тени для объекта:
Код: draw_sprite_ext(sprite_index,image_index,x+6,y+6,1,1,image_angle,c_black,0.3) draw_sprite_ext(sprite_index,image_index,x,y,1,1,image_angle,image_blend,1) x+6,y+6 - Положение тени c_black,0.3 - цвет и прозрачность тени Название: Re: Полезные скрипты. Отправлено: Hummer от Январь 06, 2011, 18:43:30 Во время разработки ЭВМ я написал 18 скриптов, и сейчас представлю самые полезные
Код: (Скрипт NOT) if(argument0=1) Скрипт может понадобиться в изменениях булевых функций, например показывать-не показывать окно (инвентарь, консоль и т д){ return 0;//=false } else { return 1;//=true } Код: (Скрипт AND) if(argument0=1)&&(argument1=1) Нужен для соблюдения двух условий{ return 1;//=true } else { return 0;//=false } Код: (Скрипт OR) if(argument0=1)||(argument1=1) Когда нужно соблюсти хотябы одно условие{ return 1; } else { return 0; } Прикрепляю .gml этих и других логических функций Название: Re: Полезные скрипты. Отправлено: Romixal от Январь 06, 2011, 19:35:39 Цитата: Код // Скрипт следующего вида // x = sc_wobble(x, target_x, slowness, wobble, array_index) // - wobble может быть между 1.05 и 2. // - slowness может быть от 16 до 100. // - array_index отражает id операции. // Для этого скрипта необходимо инициализировать spd[array_index] = 0 // //Скрипт плавного изменения переменной от x до target_x. // // Написан Mordi (2006 год.) var dis, xx, tar, fric; xx=argument0; tar=argument1; fric=argument2; sp=argument3; dis=point_distance(xx,xx,tar,tar)/2; if xx<tar { spd[argument4]+=dis/fric; } if xx>tar { spd[argument4]-=dis/fric; } spd[argument4]=spd[argument4]/sp; xx+=spd[argument4]; return xx; Название: Re: Полезные скрипты. Отправлено: Hummer от Январь 07, 2011, 16:41:11 вот ещё хочу предложить скрипт file_text_save(fname) sm_milo
Код: file_text_close(argument0) Помоему логично ;)file_text_open_append(argument0) Название: Полезные скрипты Отправлено: MyDreamForever от Январь 08, 2011, 10:39:44 Движение за объектом
Код: x=название объекта за котором ты следуешь.x y=название объекта за котором ты следуешь.y Объект летит за мышкой. Код: x=mouse_x y=mouse_y Объект следит за мышкой Код: image_angle=point_direction(x,y,mouse_x,mouse_y) Объект поворачивается за объектом Код: image_angle=point_direction(x,y,Player.x,Player.y) Событие Draw, смена цвета объекта на выбор игрока. Код: image_blend=get_color(c_red) Сохранения и загрузка Действие сохранения. Код: save_x = get_save_filename('Game Save|*.save','') game_save(save_x+string('.save')) Действие загрузки. Код: load_x = get_open_filename('Game Save|*.save','') game_load(load_x) Объект постепенно летит за мышкой Код: direction=point_direction(x,y,mouse_x,mouse_y) speed=8 Код: instance_change(название объекта,1) // превращение в объект Hummer: Такая тема уже есть. Тема перенесена Название: Re: Полезные скрипты. Отправлено: Hummer от Январь 10, 2011, 10:08:32 Предлагаю такой скрипт рисования четырёхугольника (не квадрата или прямоугольника)
Код: //Скрипт рисующий четырёхугольник //argument8 - истина если не закрашивать, ложь если закрашивать x1=argument0 y1=argument1 x2=argument2 y2=argument3 x3=argument4 y3=argument5 x4=argument6 y4=argument7 out=argument8 if(out=1) { draw_line(x1, y1, x2, y2) draw_line(x2, y2, x3, y3) draw_line(x3, y3, x4, y4) draw_line(x4, y4, x1, y1) } else { draw_triangle(x1, y1, x2, y2, x4, y4, 0) draw_triangle(x2, y2, x3, y3, x4, y4, 0) } Название: Re: Полезные скрипты. Отправлено: S_Kleer от Январь 19, 2011, 19:21:14 С помощью этого скрипта ваш игрок сможет проходить снизу блока, а сверху нет. (В платформере)
В create у блока (он не должен быть твёрдым) пишем: Код: solid = 1 В step пишем это:Код: with Player Player - Игрок{ if vspeed > 0 { if !place_meeting(x,y,Block) { with Block { solid = 1 } } } } with Player { if vspeed < 0 { if !place_meeting(x,y,Block) { with Block { solid = 0 } } } } Block - Наш блок В столкновении игрока с блоком пишем это: Код: if Block.solid = 1 Готово! Вы получили, что так долго хотели! ;){ vspeed = 0 } Чтобы враг с гравитацией не проходил сквозь платформы, делаем в step так: Код: if !place_meeting(x,y,Block) В столкновении с этим блоком, делаем так:{ if place_free(x,y+1) { gravity = 1 gravity_direction = 270 } else { gravity = 0 } if vspeed >= 6 { vspeed = 6 } } Код: move_contact_all(270,0) Конечно враг будет немного дёргатся если игрок подпрыгнет, но это лучше чем ничего. ;)if Block.solid = 1 { vspeed = 0 } if Block.solid = 0 { gravity = 0 vspeed = -1 } Авторы скрипта: S'Kleer и HARRISON Название: Re: Полезные скрипты. Отправлено: Haks от Январь 26, 2011, 00:29:38 Вот полезный скрит для создания ии в тдс для солдатов стреляющих пулями, взял со своей игры Operation F.O.X. 2
В событии Create скрипт называется: fxg_ai_create Код: noalert=false alert=true time_move = 0 status = noalert dir = image_angle image_angle = 0 shoot = false rana = false time = 0 В событиии Step скрипты назвается: fxg_ai_step Код: if status = noalert{ time_move += 1 image_speed = 0.3 if time_move = 20{image_angle = random(360)} if time_move > 20{move_contact_solid(image_angle,argument0) sprite_index = argument1;image_angle += 1} if time_move > 60{sprite_index = argument2;time_move = 0}} if status = alert{mp_potential_step(argument3.x,argument3.y,argument0,false);shoot = true;image_angle = point_direction(x,y,argument3.x,argument3.y)} if distance_to_object(argument3) < argument5{status = alert; time_move = 0;rana = true} if distance_to_object(argument3) > argument5 and rana = false{status = noalert;shoot = false;move_towards_point(0,0,0)} if distance_to_object(argument3) < 32{move_towards_point(0,0,0)} if status = alert sprite_index = argument1 if shoot = true{time += 1} if time = argument8{sound_play(argument7);instance_create(x,y,argument6);time = 0} if shoot = false{time = 0} //argument0 = speed //argument1 = sprite run //argument2 = sprite idle //argument3 = player object //argument4 = speed wanted //argument5 = radius look //argument6 = bullet enemy //argument7 = sound shoot //argument8=time shoot //fxg_ai_step(speed,sprite_run,sprite_idle,player_object,speed_wanded,raius,bullet_enemy,shoot_sound,time_shoot) И в событии попадание пули в врага скрипт называется:fxg_ai_contact_object Код: rana = true status = alert Добавлено: Январь 26, 2011, 00:38:50 Эффекты частиц ядерного взрыва смотреть в разрешении комнаты 1280x1024: Код: //Ядерный Взрыв by H2x ps =part_system_create() part_system_depth(ps,depth) //Radius Ring ring = part_type_create() part_type_shape(ring,pt_shape_ring) part_type_blend(ring,true) part_type_size(ring,2,25,1,0) part_type_color1(ring,c_white) part_type_alpha2(ring,1,0) part_type_life(ring,60,60) //Radius Ring2 ring2 = part_type_create() part_type_shape(ring2,pt_shape_ring) part_type_blend(ring2,true) part_type_size(ring2,0.2,20,0,1) part_type_color2(ring2,c_orange,c_white) part_type_alpha2(ring2,1,0) part_type_life(ring2,120,120) //Explosion expl = part_type_create() part_type_shape(expl,pt_shape_explosion) part_type_blend(expl,true) part_type_size(expl,0.2,2,1,0) part_type_color2(expl,c_orange,c_white) part_type_alpha2(expl,1,0) part_type_life(expl,120,120) //Explosion 2 expl2 = part_type_create() part_type_shape(expl2,pt_shape_explosion) part_type_blend(expl2,true) part_type_size(expl2,0.2,8,0,1) part_type_color2(expl2,c_orange,c_white) part_type_alpha2(expl2,1,0) part_type_life(expl2,60,120) //Explosion 3 expl3 = part_type_create() part_type_shape(expl3,pt_shape_explosion) part_type_blend(expl3,true) part_type_size(expl3,1,5,0,0) part_type_color1(expl3,c_silver) part_type_alpha2(expl3,1,0) part_type_speed(expl3,8,15,0,0) part_type_direction(expl3,0,360,0,0) part_type_life(expl3,120,120) //Emittent Create em=part_emitter_create(ps) part_emitter_region(ps,em,x,x,y,y,ps_shape_ellipse,ps_distr_gaussian) part_emitter_burst(ps,em,ring,4) part_emitter_burst(ps,em,ring2,3) em2=part_emitter_create(ps) part_emitter_region(ps,em2,x,x,y,y,ps_shape_ellipse,ps_distr_linear) part_emitter_burst(ps,em2,expl2,10) part_emitter_burst(ps,em2,expl,2) part_emitter_burst(ps,em2,expl,8) part_emitter_burst(ps,em2,expl3,100) Название: Re: Полезные скрипты. Отправлено: Sashok_one от Январь 29, 2011, 15:43:04 Вот еше один из вариантов тени для объектов... (мой)
Код: _spr = argument0; // имя спрайта _smb = argument1; // индекс спрайта _x = argument2; // х координата _y = argument3; // у координата draw_sprite_ext(_spr,_smb,_x+1,_y+1,1,1,0,c_black,0.5); draw_sprite_ext(_spr,_smb,_x+3,_y+1,1,1,0,c_black,0.3); draw_sprite_ext(_spr,_smb,_x+1,_y+3,1,1,0,c_black,0.3); draw_sprite_ext(_spr,_smb,_x-1,_y+1,1,1,0,c_black,0.3); draw_sprite_ext(_spr,_smb,_x+1,_y-1,1,1,0,c_black,0.3); Добавлено: Январь 29, 2011, 16:08:48 Так жэ и с текстом! ;D Код: _text = argument3 // текст _x = argument0 // х координата _y = argument1 // у координата draw_text_color(_x+1,_y+1,_text,c_black,c_black,c_black,c_black,0.5) draw_text_color(_x+3,_y+1,_text,c_black,c_black,c_black,c_black,0.3) draw_text_color(_x+1,_y+3,_text,c_black,c_black,c_black,c_black,0.3) draw_text_color(_x-1,_y+1,_text,c_black,c_black,c_black,c_black,0.3) draw_text_color(_x+3,_y-1,_text,c_black,c_black,c_black,c_black,0.3) Название: Re: Полезные скрипты. Отправлено: Hummer от Март 07, 2011, 14:59:38 Может скрипт не полезный, но попробовать его советую. такая красота получается.
Код: effect_create_above(ef_cloud, random(room_width), random(room_height), irandom(2), choose(c_red, c_yellow, c_blue, c_orange, c_fuchsia)) ;)Только поставьте фон в комнате белый Название: Re: Полезные скрипты. Отправлено: SilentPhil от Март 07, 2011, 15:56:26 Мой вариант обводки текста (кстати, у sashok_one скрипт не правильный)
Код: var _x, _y, _text, _color1, _color2, _alpha; _x = argument0; // х координата _y = argument1; // у координата _text = argument2; // Текст _color1 = argument3; // Цвет обводки _color2 = argument4; // Цвет текста _alpha = argument5; // Прозрачность обводки draw_set_color(_color1); draw_set_alpha(_alpha); draw_text(_x + 1, _y, _text); draw_text(_x - 1, _y, _text); draw_text(_x, _y + 1, _text); draw_text(_x, _y - 1, _text); draw_set_color(_color2); draw_set_alpha(1); draw_text(_x, _y, _text); Название: Re: Полезные скрипты. Отправлено: S_Kleer от Март 09, 2011, 12:23:28 Случайно наткнулся на код паузы в примере про Соника и сразу его запомнил.
Создадим скрипт с названием pause. В него впишем это: Код: screen_refresh() Далее создадим объект trigger.keyboard_wait() if keyboard_lastkey = vk_enter // Если последняя клавиша была enter { io_clear() // Отключаем паузу } else // Иначе { pause() // Возобновляем паузу } При нажатии на клавишу enter выполняем скрипт: Код: pause() Для наглядности поместите в комнату подвижные объекты. Пауза будет сниматся только клавишей enter. Название: Re: Полезные скрипты. Отправлено: Hummer от Март 29, 2011, 07:28:13 Хочу сказать о предыдущем скрипте. Такая штука, когда функция вызывается в самой себе называется рекурсия. И многие программеры стараются её избежать, поэтому и в данном случае её можно избежать.
Код: (Скрипт pause) screen_refresh() keyboard_wait()//пауза while(keyboard_lastkey != vk_enter) // пока последняя клавиша не будет Enter { keyboard_wait()//включаем паузу } io_clear() // Дошли сюда? Значит последняя клавиша была Enter Название: Re: Полезные скрипты. string_lower, string_upper по-русски. Random без повторов Отправлено: Fantom от Май 12, 2011, 16:23:50 string_lower и string_upper с поддержкой русских символов Автор скрипта: FanTomКак оказалось, string_lower и string_upper не действуют на русские буквы, поэтому предлагаю альтернативу. Вызывать следующие скрипты можно точно так же, как и вышеназванные функции, указывая обрабатываемую строку в скобках в качестве аргумента. Код: (string_lower1) var i,c,st; st=''; for (i=1; i<string_length(argument0)+1; i+=1) {c=ord(string_char_at(argument0,i)); //номер символа, чтобы 4 раза не обращаться к такому количеству функций if c>191 {if c<224 {c+=32;}} //русские буквы if c>64 {if c<91 {c+=32;}} //латинские буквы st+=chr(c);} //прибавить нужный символ return st; Код: (string_upper1) var i,c,st; st=''; for (i=1; i<string_length(argument0)+1; i+=1) {c=ord(string_char_at(argument0,i)); if c>223 {if c<255 {c-=32;}} if c>96 {if c<123 {c-=32;}} st+=chr(c);} return st; Добавлено: Май 12, 2011, 17:00:00 Скрипт выбора случайного значения переменной без повторов. Автор скрипта: FanTomДля тех, кто не умеет пользоваться списками, но умеет пользоваться массивами. Используется массив значений (по определению точнее сказать множество). Сначала он определяется: Код: (Определение элементов массива) mas_x[0]=1; mas_x[1]=2; mas_x[2]=3; mas_x[3]=4; mas_x[4]=5; mas_x[5]=6; mas_x[6]=7; mas_x[7]=8; mas_x[8]=9; mas_x[9]=10; mas_x[10]=11; mas_x[11]=0; //последний+1 элемент должен быть пустым //то есть содержать ненужное значение mas_l = 10; //количество элементов массива Далее скрипт, получающий случайный элемент из этого массива: Код: (Получение значения) var mas1,mas_n,buf; if mas_l=0 {return 0;} //если закончились элементы, возвращать что-нибудь mas_n=irandom(mas_l); //случайный индекс элемента. выбирается из имеющегося количества mas1=mas_x[mas_n]; //получили элемент for (j=mas_n; j<mas_l; j+=1) //переместить полученный элемент в конец массива {buf=mas_x[j+1]; mas_x[j+1]=mas_x[j]; mas_x[j]=buf;} mas_l-=1; //уменьшить количество элементов на 1 return mas1; //получили элемент Вместо return 0 строке if mas_l=0 {return 0;} можно снова выполнить первый скрипт, чтобы заново начать выбирать случайные неповторяющиеся значения. Примечание: с помощью ds_list это делается намного проще. Название: Re: Полезные скрипты. Отправлено: S_Kleer от Май 28, 2011, 18:38:28 Довольно простой метод для переноса текста на другую строчку. sm:)
В draw объекта, пишем это: Код: draw_text(0,0,'Обязательно проверьте этот код, ведь же им так просто пользоватся! Можно даже пере- носить слова! ))') Обязательно соблюдайте такой порядок печати, иначе ничего не подействует. Думаю он вам понадобится. Название: Re: Полезные скрипты. Отправлено: Romixal от Май 29, 2011, 00:50:11 Простой скрипт замены некоторых символов на другие в текстовой переменной.
Код: (код) var t, t1, t2; t=argument0; while !(string_pos(argument1,t)=0) { len=string_pos(argument1,t); t1=string_copy(t,0,len-1); t2=string_copy(t,len+1,string_length(t)-len+1); t=string(t1)+string(argument2)+string(t2); } return t; Название: Re: Полезные скрипты. Отправлено: SilentPhil от Июнь 11, 2011, 16:18:50 Сокращение текста до определенной длинны.
sc_short_text(текст, макс. длина); Код: text = argument0; short = argument1; if (string_length(text) > short) { text = string_delete(text, short + 1, string_length(text) - short + 1) + '...'; } return text; Название: Re: Полезные скрипты. Отправлено: S.D.A. от Июнь 11, 2011, 16:31:27 Цветок может кому понадобится
Код: Sname=part_system_create(); particle1 = part_type_create(); part_type_shape(particle1,pt_shape_line); part_type_size(particle1,0.10,0.10,0,0); part_type_scale(particle1,1,1); part_type_color1(particle1,16711680); part_type_alpha1(particle1,1); part_type_speed(particle1,1,1,0,0); part_type_direction(particle1,0,359,0,0); part_type_gravity(particle1,0,270); part_type_orientation(particle1,0,0,0,0,1); part_type_blend(particle1,1); part_type_life(particle1,60,160); emitter1 = part_emitter_create(Sname); part_emitter_region(Sname,emitter1,x,x,y,y,0,0); part_emitter_stream(Sname,emitter1,particle1,5); attract1 = part_attractor_create(Sname); part_attractor_position(Sname,attract1,340,241.50); part_attractor_force(Sname,attract1,0.50,100,1,1); Название: Re: Полезные скрипты. instance_nearest своими руками Отправлено: Fantom от Июнь 12, 2011, 20:16:11 Автор скрипта: FanTom
Есть функция instance_nearest, которая возвращает индекс (id) ближайшего экземпляра объекта. Всё бы хорошо, но иногда нужно пропустить некоторые экземпляры, например те, что находятся за стеной, и нужно выбрать ближайшего "видимого". Тогда нужно находить ближайший объект вручную. Делается это так: Код: var min1; Помимо проверки "невидимости" объекта за стеной через collision_line, можно добавлять свои условия с действием continue.min1=1000000; //расстояние до ближайшего экземпляра. взято большое число, чтобы реальное найденное расстояние было меньше targ=0; //текущая цель. нужно обнулить перед выбором новой with (Object1) //проверяемый объект {if collision_line(x,y,other.x,other.y,Wall,0,0) {continue} //не рассматривать тех, кто за стеной if id=other.id {continue} //не рассматривать самого себя, если with используется на таком же объекте // еще условия, кого нужно пропускать... if distance_to_object(other) < min1 //если расстояние меньше минимума, значит этот экземпляр ближе {other.targ=id; //установка цели min1=distance_to_object(other); //присвоение нового минимального расстояния до ближайшего объекта } } Код предполагается использовать не слишком часто (не выполнять в шаге) во избежание потери производительности. Название: Re: Полезные скрипты. Отправлено: Hummer от Июль 12, 2011, 11:59:18 Скрипт goto
Позволяет медленно подтягивать value_1 к value_2 value_1=goto(value_1, value_2, antispeed)//antispeed - чем меньше, тем быстрее идёт значение Код: var q1, q2, aspeed; q1=argument0 q2=argument1 if(q2>q1) q1+=point_distance(q1, q1, q2, q2)/aspeed else q1-=point_distance(q1, q1, q2, q2)/aspeed return q1; Название: Re: Полезные скрипты. Отправлено: Dmi7ry от Июль 20, 2011, 12:23:32 Довольно простой метод для переноса текста на другую строчку. sm:) А можно внимательнее читать справку и сделать такВ draw объекта, пишем это: Код: draw_text(0,0,'Обязательно проверьте этот код, ведь же им так просто пользоватся! Можно даже пере- носить слова! ))') Код: draw_text(0,0,'Обязательно проверьте#этот код, ведь же им так просто#пользоваться! Можно даже пере-#носить слова!') :)Название: Re: Полезные скрипты. Отправлено: S_Kleer от Июль 24, 2011, 21:08:57 Название: Re: Полезные скрипты. Отправлено: Dmi7ry от Июль 24, 2011, 21:49:51 В том-то и дело, что этот способ без # И в чём его ценность?Название: Re: Полезные скрипты. Отправлено: UncleDec от Июль 24, 2011, 22:00:39 да, скрипт бесполезный, но S_Kleer показал непосвящённым, что можно так переносить текст.
Название: Re: Полезные скрипты. Отправлено: Fantom от Июль 24, 2011, 22:01:35 Название: Re: Полезные скрипты. Отправлено: Dmi7ry от Июль 24, 2011, 22:35:04 В ширине получаемой строки кода. Разница особенно заметна для больших текстов, если все переносы будут заменены на # Набивать большие тексты в GM - сомнительное удовольствие. Впрочем, как и вывод на экран одного сплошного большого стринга, который занимает кучу строк.Название: Re: Полезные скрипты. Отправлено: VladTheCat от Июль 25, 2011, 16:12:23 Скрипт для написания чисел как в калькуляторе
Код: //Ставить в событии шага //А в событии создания надо задать переменную num0=0 if keyboard_check_pressed(49) or keyboard_check_pressed(97)num0=num0*10+1; if keyboard_check_pressed(50) or keyboard_check_pressed(98)num0=num0*10+2; if keyboard_check_pressed(51) or keyboard_check_pressed(99)num0=num0*10+3; if keyboard_check_pressed(52) or keyboard_check_pressed(100)num0=num0*10+4; if keyboard_check_pressed(53) or keyboard_check_pressed(101)num0=num0*10+5; if keyboard_check_pressed(54) or keyboard_check_pressed(102)num0=num0*10+6; if keyboard_check_pressed(55) or keyboard_check_pressed(103)num0=num0*10+7; if keyboard_check_pressed(56) or keyboard_check_pressed(104)num0=num0*10+8; if keyboard_check_pressed(57) or keyboard_check_pressed(105)num0=num0*10+9; if keyboard_check_pressed(48) or keyboard_check_pressed(96)num0=num0*10; А это в событии рисования: Код: draw_set_halign(fa_right); draw_text(x+16,0,num0); Этот код я писал для своего калькулятора Добавлено: Июль 25, 2011, 16:13:10 ЗЫ: координаты рисования и переменную можно поставить свои Название: Re: Полезные скрипты. Отправлено: Лер да Рим от Июль 27, 2011, 21:39:40 Скрипт автоподбора пропорций экрана. Автор Xged.
Код: if display_get_width()/4 > display_get_height()/3 { view_wport = display_get_height()/3*4 view_hport = display_get_height() view_xport = display_get_width()/2-view_wport/2 } if display_get_width()/4 < display_get_height()/3 { view_wport = display_get_width() view_hport = display_get_width()/4*3 view_yport = display_get_height()/2-view_hport/2 } if display_get_width()/4 = display_get_height()/3 { view_wport = display_get_width() view_hport = display_get_height() } Название: Re: Полезные скрипты. Отправлено: VladTheCat от Август 06, 2011, 22:11:24 Скрипт для ИИ как в Pacman'e
вот сам скрипт (adapt_direction): Код: { и код в событии шага игрока/врага:if (hspeed == 0) { if (random(3)<1 && place_free(x-4,y)) { hspeed = -4; vspeed = 0;} if (random(3)<1 && place_free(x+4,y)) { hspeed = 4; vspeed = 0;} } else { if (random(3)<1 && place_free(x,y-4)) { hspeed = 0; vspeed = -4;} if (random(3)<1 && place_free(x,y+4)) { hspeed = 0; vspeed = 4;} } } Код: { if (place_snapped(32,32) adapt_direction() } Название: Re: Полезные скрипты. Отправлено: Dmi7ry от Август 06, 2011, 22:39:52 О, на самом деле, в Pacman'е ИИ несколько сложнее :)
Здесь (http://habrahabr.ru/blogs/algorithm/109406/) можно почитать подробнее. Название: Re: Полезные скрипты. Отправлено: VladTheCat от Август 07, 2011, 00:17:56 Я взял этот скрипт из стандартного примера. Они там просто бегают по карте.
Название: Re: Полезные скрипты. real скрипт с проверкой Отправлено: Fantom от Август 11, 2011, 13:00:23 Автор скрипта: FanTom
Стандартная функция real переводит строку в число, однако если встретится неправильный символ, то возникнет ошибка. И если ошибка в игре никак не приемлема, то выполняйте следующий скрипт точно так же, как выполняли бы стандартную real функцию. Способности у скрипта такие же, как у стандартной функции (строка может содержать минус, точку и экспоненциальную часть), кроме того все запятые переводятся в точки, и, разумеется, ошибок никаких не возникает. Один недостаток - работает медленнее, поэтому не вызывать слишком часто (например, в Draw). Код: (real2) var i,t,d,e,c,st,l; t=1; //возможно перевести d=0; //количество точек e=0; //количество Е st=string_replace_all(argument0,',','.'); //перевести запятые в точки st=string_replace_all(st,'e','E'); //перевести маленькие Е в большие (сокращает проверки в цикле) l=string_length(st); //длина строки for (i=1; i<=l; i+=1) {c=ord(string_char_at(st,i)); //номер текущего символа if c=46 {d+=1; //подсчет точек if i=1 || i=l {t=0;}} //не переводить, если точка в начале или конце if c=69 {e+=1; //подсчет E if i=1 || i=l {t=0;}} //не переводить, если Е в начале или конце if (c<45 || c>57 || c=47 || (c=45 && i>1)) && c!=69 {t=0;} //отменить перевод, если символ неправильный } //45 - минус //46 - точка //48-57 - цифры //69 - E if d>1 {return '\#error';} //если точек больше одной if e>1 {return '\#error';} //если Е больше одной if t {return real(st);} else {return '\#error';} Название: Re: Полезные скрипты. Отправлено: Fire Run от Сентябрь 12, 2011, 23:17:55 Может скрипт не полезный, но попробовать его советую. такая красота получается. вау классноооо :_grin_:Код: effect_create_above(ef_cloud, random(room_width), random(room_height), irandom(2), choose(c_red, c_yellow, c_blue, c_orange, c_fuchsia)) ;)Только поставьте фон в комнате белый Добавлено: Сентябрь 12, 2011, 23:19:56 меню в стиле windows Код: vmenu=show_menu('&Display &Message|&Close &Menu|&Exit &Game',3); Название: Re: Полезные скрипты. Отправлено: Shredder от Октябрь 28, 2011, 14:12:32 Разделение сплошного текста без переносов на массив строк, на основе количества символов:
Автор я =) Код: var istart, iend, stroka; text='Здесь куча сплошного текста, который всполедствии будет разделяться на строчки лалалал лалалал лалала не знаю что еще написать, чтобы просто занять место'; for(t=1; t<=4; t+=1) textik[t]=''; // 4 строчки istart=1; // начало строчки iend=50; // конец строчки, максимальное количество символов в ней stroka=0; repeat(4) // 4 потому что 4 строчки { stroka += 1; // переход на следующую строчку for (i=iend; i>=istart; i-=1) // идем от конца к началу { if ord(string_char_at(text,i)) == 32 // если текущий символ "пробел" или || ord(string_char_at(text,i)) == 33 // ! || ord(string_char_at(text,i)) == 41 // ) || ord(string_char_at(text,i)) == 46 // . || ord(string_char_at(text,i)) == 58 // : || ord(string_char_at(text,i)) == 63 // ? || ord(string_char_at(text,i)) == 173 // - if textik[stroka] == '' // если в строке пусто { iend = i+1; // берем часть текста, включая пробел и тп. textik[stroka] = string_copy(text,istart,iend-istart); istart = i+1; iend = i+50; } } } Код: (Draw) draw_text(20,20, textik[1]+'#'+textik[2]+'#'+textik[3]+'#'+textik[4]); И еще один полезный: перевод двумерного массива(5 на 5) в одномерный(0-24) Код: for(yy=0; yy<5; yy+=1) { for(xx=0; xx<5; xx+=1) { aa = xx + ( yy * 2 ) - ( yy mod 2 ); mass[aa] = mass[xx,yy]; } } Название: Re: Полезные скрипты. Отправлено: Haks от Ноябрь 10, 2011, 09:37:29 Простой пример использования цикла for для создания сетки любых размеров
Автор я =) Скрипт можете прозвать как хотите я например назвал draw_grid) Код: var size; size=argument0 for(i=0;i<room_width;i+=1){ draw_line(x+size*i,0,x+size*i,room_height) draw_line(0,y+size*i,room_width,y+size*i) } //argument0 = размер сетки (arg0 x arg0) это будет выглядеть таким образом: Код: draw_grid(16) Можно добавить цвет сетки: Код: var size, color; size=argument0 color=argument1 draw_set_color(color) for(i=0;i<room_width;i+=1){ draw_line(x+size*i,0,x+size*i,room_height) draw_line(0,y+size*i,room_width,y+size*i) } draw_set_color(c_black) //argument0 = размер сетки (arg0 x arg0) Будет выглядить таким образом: Код: draw_grid(16,c_red) это будет выглядеть таким образом: Код: draw_grid(16) Можно сделать сетку разной длины по оси x или y Код: var sizex , sizey; sizex=argument0 sizey=argument1 for(i=0;i<room_width;i+=1){ draw_line(x+sizex*i,0,x+sizex*i,room_height) draw_line(0,y+sizey*i,room_width,y+sizey*i) } Вот так будет выглядеть: Код: draw_grid(16,32) Название: Re: Полезные скрипты. Отправлено: Fantom от Ноябрь 10, 2011, 10:10:00 Название: Re: Полезные скрипты. Отправлено: rick1 от Ноябрь 10, 2011, 19:34:29 Скрипт create_bullet:
Код: global.Bull1Y3 = instance_create(argument0,argument1,argument2); Теперь можете использовать функцию create_bullet() в игре:global.Bull1Y3.speed = argument3; global.Bull1Y3.direction = argument4; global.Bull1Y3.gravity = argument5; if argument5 != 0 gravity_direction = argument6 Код: Dir = point_direction(x,y,mouse_x,mouse_y); // направление выстрела create_bullet(x,y,o_bullet,8,Dir,0,270); // используем функцию /* Arguments: 0 - координата создания пули по оси X 1 - координата создания пули по оси Y 2 - объект пули 3 - скорость пули 4 - направление выстрела 5 - гравитация (0 - нет гравитации) 6 - направление гравитации (если гравитации у пули нет, то можно не писать) */ Автор - я. Название: Re: Полезные скрипты. Отправлено: Krib от Ноябрь 10, 2011, 19:54:07 Название: Re: Полезные скрипты. Отправлено: rick1 от Ноябрь 10, 2011, 20:01:52 Krib, гениальный скрипт! :D
Название: Re: Полезные скрипты. Отправлено: Hamster099 от Ноябрь 10, 2011, 20:20:59 Код: (Draw) draw_text(20,20, textik[1]+'#'+textik[2]+'#'+textik[3]+'#'+textik[4]); Код: (Draw) var j; sm_goodfor(j=1;j<=4;j+=1) { draw_text(20,j*20,textik[j]); } Название: Re: Полезные скрипты. Отправлено: VladTheCat от Ноябрь 29, 2011, 14:16:04 Автор скрипта: FanTom Простой скрипт для создания объемного звука: Код: sound_3d_set_sound_position(argument0,(x - view_xview - (view_wview div 2)) / 130, Определяет расположение звука относительно центра вида (камеры).(y - view_yview - (view_hview div 2)) / 100,4); //argument0 - название звука, расположение которого изменяется Делители (130 и 100) определяют глубину объемности. Чем больше делитель, тем качественнее изменяется расположение звука, но в то же время медленнее перелетает в "другое ухо" :) Поэтому нужно найти баланс, и для разных игр эти числа могут отличаться. Выполняя этот скрипт в каком-либо объекте, звук, записанный в нулевом аргументе, "перепрыгивает" в координаты этого объекта. А как звук сделать объемным в 3d игре? Какие значения надо поменять? Название: Re: Полезные скрипты. Отправлено: Krib от Декабрь 03, 2011, 21:39:18 В 3D все намного проще.
Вот цитата из справки: Цитировать sound_3d_set_sound_position(snd,x,y,z) Устанавливает позицию указанного звука с отношением к слушателю в указанную позицию пространства. Значения в оси x увеличиваются слева направо, в оси y снизу вверх и в оси z от близкого расстояния до дальнего расстояния. Эти значения измеряются в метрах. Громкость, с которой звук будет услышан, будет зависеть от этого измерения так же, как и в реальном мире. Название: Re: Полезные скрипты. Отправлено: qwerty123w от Декабрь 29, 2011, 13:46:11 Вот остановка объекта в 3d играх:
код: { x = xprevious; y = yprevious; if (abs(hspeed) >= abs(vspeed) && not place_meeting(x+hspeed,y,<стена>)) { x += hspeed; exit;} if (abs(vspeed) >= abs(hspeed) && not place_meeting(x,y+vspeed,<стена>)) { y += vspeed; exit;} speed = 0; } Добавлено: Декабрь 29, 2011, 14:00:36 Движение объекта к мыши (в step): Код: move_towards_point(mouse_x,mouse_y,<скоростьglobal.dir=point_direction(x,y,mouse_x,mouse_y); image_angle=global.dir; Название: Re: Полезные скрипты. Отправлено: Tourist от Декабрь 29, 2011, 14:06:17 Движение объекта к мыши (в step): ИлиКод: move_towards_point(mouse_x,mouse_y,<скорость global.dir=point_direction(x,y,mouse_x,mouse_y); image_angle=global.dir; Код: direction=point_direction(x,y,mouse_x,mouse_y) speed=speed Название: Re: Полезные скрипты. Отправлено: lucheus от Декабрь 29, 2011, 15:46:44 Может быть то, что я сейчас скажу немножко не по теме
но я знаю, что много людей пользуется Punto Switcher' ом так забейте команды, что бы не мучиться, например "kill" пусть меняет на "instance_destroy()" "Create" пусть меняетна "instance_create(x,y,obj)" Название: Re: Полезные скрипты. Отправлено: Fantom от Декабрь 29, 2011, 17:38:42 Для этого есть snippets.txt в папке GM. Туда записываются команды, и потом вызываются в коде клавишей F2
Название: Re: Полезные скрипты. Отправлено: lucheus от Декабрь 31, 2011, 18:21:15 да знаю я
но так дольше намного, и в файл если не ошибаюсь можно написать только 9 команд Название: Re: Полезные скрипты. Отправлено: Krib от Декабрь 31, 2011, 18:26:26 Как же только девять? Изначально там уже десять ;D И после можно сколько угодно добавлять...
Название: Re: Полезные скрипты. Отправлено: lucheus от Декабрь 31, 2011, 18:36:34 ну все равно пока напишешь, я вообще от клавы не отрываюсь, и так удобнее
напечатал is нажал на энтер и все, instance_destroy() а я долго к F буду тянуться Название: Re: Полезные скрипты. Отправлено: .doc от Январь 03, 2012, 11:45:21 Перевод числа из двоичной системы счисления в десятичную:
Название: Re: Полезные скрипты. Отправлено: Krib от Январь 03, 2012, 11:59:22 Название: Re: Полезные скрипты. Отправлено: Dva_Kota от Январь 05, 2012, 21:59:05 Создание объектов в определенном радиусе:
Код: with (instance_create(x,y,obj)) { r = random(100);//максимльное расстояние 100 direction = random(360); x=x+lengthdir_x(r,direction); y=y+lengthdir_y(r,direction); } Название: Re: Полезные скрипты. Отправлено: Krib от Январь 07, 2012, 22:39:04 Функция вычисления факториала из числа a
fact(a) Код: if(argument0 <= 1){return 1} return fact(argument0-1)*argument0 Название: Re: Полезные скрипты. Чтение всех файлов из папки. round с указанием разряда Отправлено: Fantom от Январь 21, 2012, 00:13:15 Автор скрипта: FanTom.
Компактный код чтения всех файлов определенного типа из указанной папки. Код: var name; name=file_find_first(program_directory+'\Text\*.txt',0); if name!='' { // - - коммент заменить на функцию чтения (читать этот первый файл) do {name=file_find_next(); if name!='' { // - - коммент заменить на функцию чтения (читать следующие файлы) } } until name=''; //пока не закончатся файлы } file_find_close(); Примечание: функции поиска файлов не возвращают полный путь к файлу, а только его имя, поэтому при чтении (загрузке) файла добавлять путь еще раз: Код: функция_чтения_файла(program_directory+'\Text\'+name); Добавлено: Январь 24, 2012, 13:00:00 Автор скрипта: FanTom Маленький скрипт расширенного округления. Код: (round_ext) //argument0 - число //argument1 - количество разрядов после запятой. Если равен 0, то функция аналогична round //если меньше нуля, то округление целых (-1 до десятков, -2 до сотен и т.д.) var pow; pow=power(10,argument1); return round(argument0*pow)/pow; Код: (Вызов) number=round_ext(pi,3); //вернет число 3,142 number=round_ext(54321,-3); //вернет число 54000 Название: Re: Полезные скрипты. Отправлено: Dva_Kota от Февраль 03, 2012, 13:55:47 Нахождение к какому диапазону относится число s с помощью Switch.
Код: switch(true) { case s<0: <код1>; break;//меньше 0 case s<10: <код2>; break;//от 0 до 10 case s<100: <код3>; break;//от 10 до 100 case s>100: <код4>; break;//больше 100 } Название: Re: Полезные скрипты. Отправлено: Sanec от Февраль 06, 2012, 10:35:32 Код: if player.x>x{ if player.x<x{ if player.y>y{ if player.y<y{ step=true }else{step=false} }else{step=false} }else{step=false} }else{step=false} Можно проверять любые условия, но чтоб каждый раз не писать else можно сделать так Код: step = false Если все условия выполнятся, то step будет true иначе step будет falseif player.x>x{ if player.x<x{ if player.y>y{ if player.y<y{ step=true}}}} Добавлено: Февраль 06, 2012, 10:36:05 Возможно это кто то и до меня придумал, но я такого кода здесь не видел! Название: Re: Полезные скрипты. Отправлено: Krib от Февраль 06, 2012, 10:46:43 Название: Re: Полезные скрипты. Отправлено: Sanec от Февраль 06, 2012, 11:15:34 sanec в таких случаях удобнее использовать switch Можешь продемонстрировать как именно?Название: Re: Полезные скрипты. Отправлено: Krib от Февраль 06, 2012, 11:21:26 Ошибся, не так прочитал код...
Код: if player.x>x{ Обычно в таком виде код проще читается..if player.x<x{ if player.y>y{ if player.y<y{ step=true }else{step=false} }else{step=false} }else{step=false} }else{step=false} Название: Re: Полезные скрипты. Отправлено: Sky Rider от Февраль 12, 2012, 19:48:56 sanec в таких случаях удобнее использовать switch Можешь продемонстрировать как именно?Код: switch(true) Не проверял, но если пятью постами ранее Dva_Kota не соврал, то должно работать :){ case player.x>x: case player.x<x: case player.y<y: case player.y<y: step=true; break; default: step=false } Добавлено: Февраль 12, 2012, 19:59:49 Нет, работает только сравнение переменной с числом. Сравнение двух переменных не пашет :( Название: Re: Полезные скрипты. Отправлено: VladTheCat от Февраль 23, 2012, 23:59:42 Обычный move_contact_... не позволяет выбирать для проверки отдельные объекты, а мне как-раз это и нужно. И я решил написать свой вид move_contact. Думаю, подстроить его под себя не составит труда
Код: (Move_contact) repeat(spd/4) ставится в степ объекта{ x += lengthdir_x(4,direction); y += lengthdir_y(4,direction); obj = collision_circle(x,y,1,all,1,1); if obj != noone { obi = obj.object_index; opr = object_get_parent(obi); if opr = obj_wall { instance_destroy(); break; } } } По скорости работы, наверное, уступает обычному move_contact..., но в него можно прописать любые объекты или их родителей obj - экземпляр, с которым мы столкнулись obi - объект, к которому этот экземпляр принадлежит opr - объект-родитель obi Название: Re: Полезные скрипты. Отправлено: Dva_Kota от Февраль 24, 2012, 17:05:56 Sky Rider, твой код не верный, по тому что step=true будет выполнено при выполнении хотя бы одного условия выше (т.е. НЕ выполнится только если все условия будут возвращать false)
Название: Re: Полезные скрипты. Отправлено: GhosT от Февраль 24, 2012, 17:29:19 вот ещё один скрипт
(Пожалуйста прокомментируйте его правильно ли всё написано :sideways:) Код: window_set_fullscreen(true) ww=display_get_width() hh=display_get_height() ff=display_get_frequency() cc=display_get_colordepth() display_set_all(ww,hh,ff,cc) view_enabled=true view_visible[0]=true view_xview[0]=0 view_yview[0]=0 view_wview[0]=ww view_hview[0]=hh view_xport[0]=0 view_yport[0]=0 view_wport[0]=ww view_hport[0]=hh Название: Re: Полезные скрипты. Отправлено: S_Kleer от Март 03, 2012, 17:50:45 В Game Maker 8.1 я столкнулся с ужасной проблемой загрузки текста из файлов. Он превращался в загогулины (если это русские буквы и кодировка UTF-8), но я с умел написать простой скрипт, чтобы это избежать!
Код: var f; map=get_open_filename('файлы|*.txt','') // Открываем окно для открытия файлов for (f = file_text_open_read(map) !file_text_eof(f) file_text_readln(f)) // Открываем файл для чтения и читаем все строки { str = file_text_read_string(f) // Читаем строку file=string_copy(str,0,string_length(str)) // Копируем строку execute_string(file) // Выполняем строку } file_text_close(f) // Закрываем файл, который читали В самом файле, всё должно выглядеть примерно так: Код: text='Этот текст мы загрузили из файла.' P.S. Помог YellowAfterlife с тем, чтобы читались все строки. P.S.S. Если не поймёте зачем это, то могу сделать пример. Название: Re: Полезные скрипты. Отправлено: MusNik от Март 03, 2012, 19:34:32 Автор: MusNik
Простой код генерации случайных целых чисел от a до b Код: random (b-a)+a P.S. Спасибо, точно не помню кому, за то, что я вспомнил этот код Название: Re: Полезные скрипты. Отправлено: Krib от Март 03, 2012, 19:44:34 MusNik твой алгоритм неверен
a=-3;b=3;результат принадлежит множеству [-3..4) а должен быть от -3 до 3 a=1;b=2;результат принадлежит множеству [1..3) Думаю стоит убрать +1. Вроде не ошибся в расчетах. Название: Re: Полезные скрипты. Отправлено: MusNik от Март 03, 2012, 19:48:39 Точно, спасибо. Сейчас исправлю
Название: Re: Полезные скрипты. Отправлено: S_Kleer от Март 03, 2012, 20:54:27 А чем не угодила irandom_range() ?
Название: Re: Полезные скрипты. Отправлено: MusNik от Март 03, 2012, 21:04:43 Не знаю. Я его на Flash использовал. И тут недавно, он кому-то на ГМ потребовалась
Название: Re: Полезные скрипты. Отправлено: Cuper479 от Март 30, 2012, 11:08:31 Полезная штука, тем кто хочет делать в виде изометрии это скрипт рисования изометрического пола.
Код: draw_set_color(argument0); var tex; tex=sprite_get_texture(argument1,argument2); draw_primitive_begin_texture(pr_trianglestrip,tex) draw_vertex_texture(x+16,y,0,0); draw_vertex_texture(x,y+8,0,1); draw_vertex_texture(x+16,y+16,1,1); draw_vertex_texture(x+32,y+8,1,0); draw_vertex_texture(x+16,y,0,0); draw_primitive_end(); Название: Re: Полезные скрипты. Отправлено: Neo от Апрель 23, 2012, 20:18:50 Вырезание спрайта по маске с помощью сюрфейса.
Немного улучшенный скрипт до "внешнего" (http://forum.hellroom.ru/index.php?topic=9590.0) Скрипт можно смело вставлять в событие :gm131: Draw Код: /* script(sprite,sprite_mask,mask_x,mask_y,sprite_x,sprite_y) где sprite=Спрайт изображения sprite_mask=Спрайт маски изображения mask_x=Координаты маски по х mask_y=Координаты маски по у sprite_x=Координаты вырезаемого изображения по х sprite_y=Координаты вырезаемого изображения по у */ s=surface_create(sprite_get_width(argument1),sprite_get_height(argument1)); surface_set_target(s); draw_clear_alpha(0,0); draw_sprite(argument0,0,x+argument4,y+argument5); draw_set_blend_mode_ext(bm_zero,bm_src_color); draw_sprite(argument1,0,x,y); draw_set_blend_mode(bm_normal); surface_reset_target(); draw_surface(s,argument2,argument3); P.S. Для спрайтов и масок указать центрировку 0 по X и Y P.S.S. Не для мыши, но для нее тоже работает, только криво P.S.S.S. Маска должна быть белого цвета Название: Re: Полезные скрипты. Отправлено: gedeon от Май 11, 2012, 23:18:55 Всем привет! Вот я и вернулся, после долгого перерыва на работу :) Пожалуй, тоже добавлю парочку, на мой взгляд, полезных скриптов.
Вот первый: я его назвал iso_grid из названия думаю понятно для чего он нужен :) но для тех у кого с английским не важно, рисует изометрическую сетку с заданными параметрами ячейки Код: inc1=argument0 inc2=argument1 for(i=0;i<=room_width;i+=inc1){ for(n=0;n<=room_height;n+=inc2){ draw_set_alpha(argument2) draw_line(i,n,i+inc1,n+inc2) draw_line(i,n+inc2,i+inc1,n) } } draw_set_alpha(1) вызывается при рисовании такой командой: iso_grid(ширина ячейки,высота ячейки,альфа прозрачность от 0 до 1) Название: Re: Полезные скрипты. Отправлено: Romixal от Май 14, 2012, 01:24:49 Определение максимального общего кратного, как в школе его неправильно называли 'минимальным общим множетелем'.
Код: var i,m; m=min(argument0,argument1); if m=0 { return -1; } for (i=m; i>0; i-=1) { if frac(argument0/i)=0 and frac(argument1/i)=0 { return i; } } return 1; Название: Re: Полезные скрипты. Отправлено: Gamer2012 от Май 14, 2012, 15:55:11 Определение максимального общего кратного, как в школе его неправильно называли 'минимальным общим множетелем'. может ты ошибся: не максимальное, а наименьшее общее кратное? (НОК и НОД)Код: var i,m; m=min(argument0,argument1); if m=0 { return -1; } for (i=m; i>0; i-=1) { if frac(argument0/i)=0 and frac(argument1/i)=0 { return i; } } return 1; Название: Re: Полезные скрипты. Отправлено: S_Kleer от Май 21, 2012, 18:06:24 Небольшой код для хорошего столкновения объекта при движении влево и вправо. (можно ещё вверх и вниз, если это тдс)
Код: repeat 7 // Повторяем код ниже 7 раз, соответственно, объект передвинется влево на 7 пикселов Аналогично для клавиши "вправо"if place_free(x-1,y) // Если слева свободен 1 пиксель { x-=1 // Движемся влево } Код: repeat 7 // Повторяем код ниже 7 раз, соответственно, объект передвинется вправо на 7 пикселов Может это и не рационально, но работает хорошо )if place_free(x+1,y) // Если справа свободен 1 пиксель { x+=1 // Движемся вправо } Название: Re: Полезные скрипты. Отправлено: Dmi7ry от Май 21, 2012, 18:43:03 А что мешает использовать move_contact_all(0,7)?
Название: Re: Полезные скрипты. Отправлено: S_Kleer от Май 21, 2012, 19:22:59 Название: Re: Полезные скрипты. Отправлено: VladTheCat от Май 21, 2012, 22:17:12 Название: Re: Полезные скрипты. Отправлено: Qidi Games от Июль 05, 2012, 15:23:57 АИ интелект (проще говоря
бот) Код: gravity_direction = 270 if place_free(x,y+1) gravity = 2 else gravity = 0 if instance_exists(o_man) >0 { if distance_to_object(o_man) <400 if !collision_line (x,y,o_man.x,o_man.y,o_block,false,false) { zametil = true } else { zametil = false } if zametil = true { if o_man.x < x if distance_to_object(o_man) > 64 { if place_free(x-3,y) { x-=3; image_speed = 0.2; image_xscale = 1 } if not place_free(x-3,y) { vspeed = -20 } } if o_man.x > x if distance_to_object(o_man) > 64 { if place_free(x+3,y) { x+=3; image_speed = 0.2; image_xscale = -1 } if not place_free(x+3,y) { vspeed = -20 } } } if zametil = false //А если ГГ незамечен { image_speed = 0 //То скорость анимации 0 } if hp <=0 //Если здоровье меньше или равно нулю { instance_create(x,y,argument0) //То создать аргумент0 instance_create(x,y,argument1) //То создать аргумент1 instance_destroy() //Уничтожиться } } Название: Re: Полезные скрипты. Отправлено: Haks от Июль 06, 2012, 17:32:50 Полезный скрипт lengthdir_z(len,dir)
Код: return tan(argument1*pi/-180)*argument0 Название: Re: Полезные скрипты. Отправлено: Izaron от Июль 06, 2012, 20:59:19 Короче, внизу написано решение такой проблемы как нахождение индекса максимального элемента массива, как-то так. Пишем в :gm123: Код: (Нахождение индекса максимального элемента массива) mass=4 // Объявляем кол-во индексов массивов. Всего их 5 (от 0 до 4) for (m=0;m<mass;m+=1) { line[m]=irandom(100) } // 5 значений массива, от 0 до 100 imax=0 // imax - переменная, показывающая индекс максимального значения массива for (i=0;i<mass;i+=1) { if line[imax] < line[i] {imax=i}} // Если значение элемента индекса i больше значения элемента индекса imax, то переменной imax присваивается значение переменной i. show_message('Индекс максимального элемента '+string(imax)+'#, его значение '+string(line[imax])) show_message('line[0]='+string(line[0])) show_message('line[1]='+string(line[1])) show_message('line[2]='+string(line[2])) show_message('line[3]='+string(line[3])) // Последние 5 строчек кода нужны для того, чтобы вы удостоверились в том, что код работает правильно. Без всех фигни и комментириев код выглядит так: Код: (Укоротил. Может, даже слишком.) for (m=0;m<4;m+=1) (http://forums.gamemag.ru/public/style_emoticons/default/megusta.gif){ line[m]=irandom(100) } imax=0 for (m=0;m<4;m+=1) { if line[imax] < line[m] {imax=i}} // imax - нужное число Лично мне помогло. Название: Re: Полезные скрипты. Отправлено: depict от Июль 06, 2012, 21:12:34 Название: Re: Полезные скрипты. Отправлено: Izaron от Июль 06, 2012, 21:15:30 Название: Re: Полезные скрипты. Отправлено: Hamster099 от Июль 06, 2012, 21:40:56 Код: (Укоротил. Может, даже слишком.) for (m=0;m<4;m+=1) (http://forums.gamemag.ru/public/style_emoticons/default/megusta.gif){ line[m]=irandom(100) } imax=0 for (m=0;m<4;m+=1) { if line[imax] < line[m] {imax=i}} // imax - нужное число Лично мне помогло. Название: Re: Полезные скрипты. Отправлено: RPRTR258 от Июль 07, 2012, 07:59:26 i=0
while(1) { if mass=0 break else i+=1 } :errm: Только остановится на первом нуле Название: Re: Полезные скрипты. Отправлено: S_Kleer от Август 01, 2012, 18:02:46 Долго думал как написать скрипт, чтобы изометрические объекты правильно ставились в комнате.
Сегодня я понял как решить проблему. sm_milo Создаём объект и пишем в create код. Код: yy = 0 P.S. Объекты создаются снизу вверх.xx = 0 repeat 10 { for (i=0 i<10 i+=1) { instance_create(32*i+xx,16*i+256+yy,your_object) if i = 9 { yy -=16 xx += 32 } } } Название: Re: Полезные скрипты. Отправлено: ETUN4 от Сентябрь 19, 2012, 17:43:20 Код: return round(frac(argument0/100)*1000); Мой скрипт, возвращает две последние цифры от argument0.Название: Re: Полезные скрипты. Отправлено: Izaron от Октябрь 30, 2012, 09:53:58 Однажды копался в примере (чего уже не делал полгода) и нашел короткий код для преобразования обычного числа в число с нулями, к примеру, число 142 преобразовать в 0142 или в 00142, т.е. то же самое, что у FanTom'a на 1 странице темы, только короче.
Код: (real_time(integer, rank)) //real_time(integer, rank) //integеr - нужное число, которое надо написать с нолями //rank - кол-во разрядов, при которых пишется 0, т.е. если rank=4, а integer=142, то функция возращает '0142' tm=string(argument0); // Сначала делается переменная, которая берет число из первого аргумента и преобразовывает его в тип string, т.е. если argument0=123, то tm='123' tm=(argument1-string_length(tm))*'0'+tm; // Потом берут второй аргумент, вынимают от него длину tm, потом полученный результат умножают на '0', т.е. если argument1=4 (разряды тысячей), argument0='12', то длина строки argument0=2, 4-2=2. Теперь 2 умножаем на '0', получаем '00', прибавляем '00' к '12' и гоп! - получаем '0012' return tm; // Возвращаем полученную строку Вот укороченный вариант кода без объяснений: Код: tm=string(argument0); tm=(argument1-string_length(tm))*'0'+tm; return tm Теперь в Draw какого-нибудь объекта пишем: Код: draw_text(100,100,real_time(integer, rank)) Где integer - число обычное (кол-во здоровья, монет и т.д.), а rank - кол-во разрядов. Все. hlopaet_: Название: Скрипт линейной интерполяции Отправлено: Hamster099 от Март 06, 2013, 20:16:33 Для любителей рпг-маст хэв sm_good
Даёт возможность делать прокачку без знания математики. Код: /*************************************************** Скрипт линейной интерполяции не перепутать пределы, последними идут мин-макс пределы того значения, которое надо вычислить! scr_linear_interpolation(x0,x1,x2,y1,y2) ***************************************************/ var x0,x1,x2,y0,y1,y2; x0=argument0; //известная переменная x x1=argument1; //минимальный предел x1 x2=argument2; //максимальный предел x2 y1=argument3; //мин. y1 y2=argument4; //макс. y2 y0=((y2-y1)/(x2-x1))*(x0-x1)+y1; return y0; //неизвестная требуемая переменная Название: Re: Полезные скрипты. "Событие" выхода из столкновения Отправлено: Fantom от Апрель 29, 2013, 22:15:16 Простой фокус со столкновениями, но противоположного действия - "событие выхода из столкновения".
Отсутствие столкновения можно проверять кодом !place_meeting(...), но код будет выполняться каждый шаг неоднократно, что в ряде случаев нежелательно и добавляет багов. В данном приёме используется свойство стандартных событий столкновения - выполняться каждый шаг, пока происходит столкновение. Код: (Столкновение) alarm[0]=2; //минимум 2 //сигнал каждый шаг заводится на 2 и не успевает выполниться, пока есть столкновение Код: (Alarm 0) //событие выхода из столкновения Таким образом действия выхода из столкновения выполнятся один раз практически сразу после выхода.При дефиците сигналов используйте дополнительные переменные. То же самое можно сделать и с событиями, связанными с переходами за границу вида. Событие ухода есть, но нет события входа в поле зрения. Данный приём с alarmом подойдет и в этом случае. Иными словами, это применимо к любым событиям, которые происходят каждый шаг - создается "событие" прекращения события. Название: Re: Полезные скрипты. Отправлено: ETUN4 от Май 01, 2013, 12:29:36 Скрипт устанавливает видимость для объекта, если объект в приделах вида, то его видимость true, а если за приделами вида, то его видимость false. Такой скрипт полезный для игр, в которых много объектов. Использовать в событии шага.
Код: if x>view_xview[0]-(sprite_get_width(sprite_index)-sprite_get_xoffset(sprite_index))-10 && y>view_yview[0]-(sprite_get_height(sprite_index)-sprite_get_yoffset(sprite_index))-10 && x<view_xview[0]+view_wview[0]+sprite_get_xoffset(sprite_index)+10 && y<view_yview[0]+view_hview[0]+sprite_get_height(sprite_index)+10 { visible = true } else { visible = false } Название: Re: Полезные скрипты. Отправлено: VladTheCat от Май 01, 2013, 13:48:44 Не легче использовать bbox_left/right/top/bottom?
Название: Re: Полезные скрипты. Отправлено: Neo от Май 01, 2013, 16:18:36 Отрисовка таймера в виде 00:00:00
Код: /* scr_draw_time(x,y,time) Time var example for step: time += 1000 / room_speed; */ var min_string,sec_string,ssec_string,z_min_string,z_sec_string,z_ssec_string; min_string = string(( argument2 div 60000 ) mod 60) ; sec_string = string(( argument2 div 1000 ) mod 60) ; ssec_string = string(( argument2 div 10 ) mod 100); z_min_string = "" ; z_sec_string = "" ; z_ssec_string = ""; for (a=0;a<(2-string_length(min_string));a+=1) z_min_string=z_min_string+"0"; for (b=0;b<(2-string_length(sec_string));b+=1) z_sec_string=z_sec_string+"0"; for (c=0;c<(2-string_length(ssec_string));c+=1) z_ssec_string=z_ssec_string+"0"; draw_set_alpha(1); draw_text(argument0,argument1, (z_min_string+min_string) +string(':') +(z_sec_string+sec_string) +string(':') +(z_ssec_string+ssec_string)); Название: Re: Полезные скрипты. Отправлено: NeoSeuc от Май 02, 2013, 14:20:41 Я не знаю, может вы такое и знаете, но вот этот маленький код будет показывать координаты мыши, это будет полезно в том случае если вам надо рисовать объекты в нужном вам месте
Код: (Draw) draw_text(15,15,string(mouse_x) + ', ' + string(mouse_y)) Название: Re: Полезные скрипты. Отправлено: ETUN4 от Май 03, 2013, 19:01:12 Делал чат к игре и понадобилось сделать скрипт, который возвращает первое слово в строке, то есть возвращает подстроку до первого символа, что находится в переменной "d", в данном случае это пробел.
Код: (Скрипт) var a,c; a=argument0; d=" "; c=""; while (1) { if string_length(a)=0 { return c; break; } b=string_char_at(a,1) if b=d then { return c; break; } else { c+=b a=string_delete(a,1,1) } }; Название: Re: Полезные скрипты. Отправлено: Fantom от Май 03, 2013, 19:08:46 Не проще ли так:
Код: if string_pos(' ',str)>0 //если вообще есть больше одного слова {word=string_copy(str,1,string_pos(' ',str)-1);} else {word=str;} "Возвращает первое слово из строки" Название: Re: Полезные скрипты. Отправлено: ETUN4 от Май 03, 2013, 19:24:01 Проще.
Название: Полезные скрипты. Вывод текста по проивольной кривой Отправлено: Dmi7ry от Май 09, 2013, 06:38:33 Вывод текста по произвольной кривой. В качестве кривой выступает path.
Код: // Text on curve. By Dmi7ry. Usage: // DrawTextOnPath( path, text ) text = argument1 step=1/(string_length(text)+1) len = string_length(text) for (i=1; i<len; i+=1) { posx = path_get_x(argument0, i*step) posy = path_get_y(argument0, i*step) prevx = path_get_x(argument0, (i-1)*step) prevy = path_get_y(argument0, (i-1)*step) angle=point_direction(prevx, prevy, posx, posy) draw_text_transformed(posx, posy, string_char_at(text, i), 1, 1, angle) } Название: Re: Полезные скрипты. Отправлено: AndrewVideoGames от Июнь 16, 2013, 21:00:04 Простой скрипт для движения одного объекта к другому(можно использовать для ИИ):
Название: Re: Полезные скрипты. Отправлено: Fantom от Июнь 16, 2013, 21:31:19 Название: Re: Полезные скрипты. Отправлено: GrinRad от Июнь 16, 2013, 21:42:57 зрение врагу
Код: в стэп врагу allar=false //этап 1: попадает ли враг в поле зрения. if abs(sc_see(o_player.x,o_player.y))<(поле_зрения/2) { //этап 2 проверяем на сколько далеко игрок if point_distance(x,y,o_player.x,o_player.y)< расстояние_на_которое_видит_бот { //этап 3: проверяем не мешает ли стена. if !collision_line(x,y,o_player.x,o_player.y,o_wall,false,false) { allar=true } } } Код: //sc_see(x,y) var n2; n2=point_direction(x,y,argument0,argument1)-direction;//вместо direction может быть image_angle если бот смотрит не туда куда идет if (n2<0) {n2+=360;} if n2>180 {n2-=360;} return n2 Название: Re: Полезные скрипты. Отправлено: life Jumb от Август 10, 2013, 19:44:31 Написал скрипт может кому-то будет полезным sm:)
Код: //utf8(str) возвращает ANSI строку UTF-8 строки str var i; i=argument0 i=string_replace_all(i,"п»їР‚","Ђ") i=string_replace_all(i,"Рѓ","Ѓ") i=string_replace_all(i,"‚","‚") i=string_replace_all(i,"С“","ѓ") i=string_replace_all(i,"„","„") i=string_replace_all(i,"…","…") i=string_replace_all(i,"†","†") i=string_replace_all(i,"‡","‡") i=string_replace_all(i,"€","€") i=string_replace_all(i,"‰","‰") i=string_replace_all(i,"Р‰","Љ") i=string_replace_all(i,"‹","‹") i=string_replace_all(i,"РЉ","Њ") i=string_replace_all(i,"РЊ","Ќ") i=string_replace_all(i,"Р‹","Ћ") i=string_replace_all(i,"РЏ","Џ") i=string_replace_all(i,"С’","ђ") i=string_replace_all(i,"вЂ?","‘") i=string_replace_all(i,"’","’") i=string_replace_all(i,"“","“") i=string_replace_all(i,"”","”") i=string_replace_all(i,"•","•") i=string_replace_all(i,"–","–") i=string_replace_all(i,"—","—") i=string_replace_all(i,"В?","?") i=string_replace_all(i,"в„ў","™") i=string_replace_all(i,"С™","љ") i=string_replace_all(i,"›","›") i=string_replace_all(i,"Сљ","њ") i=string_replace_all(i,"Сњ","ќ") i=string_replace_all(i,"С›","ћ") i=string_replace_all(i,"Сџ","џ") i=string_replace_all(i,"В "," ") i=string_replace_all(i,"РЋ","Ў") i=string_replace_all(i,"Сћ","ў") i=string_replace_all(i,"Р€","Ј") i=string_replace_all(i,"В¤","¤") i=string_replace_all(i,"Тђ","Ґ") i=string_replace_all(i,"В¦","¦") i=string_replace_all(i,"В§","§") i=string_replace_all(i,"РЃ","Ё") i=string_replace_all(i,"В©","©") i=string_replace_all(i,"Р„","Є") i=string_replace_all(i,"В«","«") i=string_replace_all(i,"В¬","¬") i=string_replace_all(i,"В","") i=string_replace_all(i,"В®","®") i=string_replace_all(i,"Р‡","Ї") i=string_replace_all(i,"В°","°") i=string_replace_all(i,"В±","±") i=string_replace_all(i,"Р†","І") i=string_replace_all(i,"С–","і") i=string_replace_all(i,"Т‘","ґ") i=string_replace_all(i,"Вµ","µ") i=string_replace_all(i,"В¶","¶") i=string_replace_all(i,"В·","·") i=string_replace_all(i,"С‘","ё") i=string_replace_all(i,"в„–","№") i=string_replace_all(i,"С”","є") i=string_replace_all(i,"В»","»") i=string_replace_all(i,"С?","ј") i=string_replace_all(i,"Р…","Ѕ") i=string_replace_all(i,"С•","ѕ") i=string_replace_all(i,"С—","ї") i=string_replace_all(i,"Рђ","А") i=string_replace_all(i,"Р‘","Б") i=string_replace_all(i,"Р’","В") i=string_replace_all(i,"Р“","Г") i=string_replace_all(i,"Р”","Д") i=string_replace_all(i,"Р•","Е") i=string_replace_all(i,"Р–","Ж") i=string_replace_all(i,"Р—","З") i=string_replace_all(i,"Р?","И") i=string_replace_all(i,"Р™","Й") i=string_replace_all(i,"Рљ","К") i=string_replace_all(i,"Р›","Л") i=string_replace_all(i,"Рњ","М") i=string_replace_all(i,"Рќ","Н") i=string_replace_all(i,"Рћ","О") i=string_replace_all(i,"Рџ","П") i=string_replace_all(i,"Р ","Р") i=string_replace_all(i,"РЎ","С") i=string_replace_all(i,"Рў","Т") i=string_replace_all(i,"РЈ","У") i=string_replace_all(i,"Р¤","Ф") i=string_replace_all(i,"РҐ","Х") i=string_replace_all(i,"Р¦","Ц") i=string_replace_all(i,"Р§","Ч") i=string_replace_all(i,"РЁ","Ш") i=string_replace_all(i,"Р©","Щ") i=string_replace_all(i,"РЄ","Ъ") i=string_replace_all(i,"Р«","Ы") i=string_replace_all(i,"Р¬","Ь") i=string_replace_all(i,"Р","Э") i=string_replace_all(i,"Р®","Ю") i=string_replace_all(i,"РЇ","Я") i=string_replace_all(i,"Р°","а") i=string_replace_all(i,"Р±","б") i=string_replace_all(i,"РІ","в") i=string_replace_all(i,"Рі","г") i=string_replace_all(i,"Рґ","д") i=string_replace_all(i,"Рµ","е") i=string_replace_all(i,"Р¶","ж") i=string_replace_all(i,"Р·","з") i=string_replace_all(i,"Рё","и") i=string_replace_all(i,"Р№","й") i=string_replace_all(i,"Рє","к") i=string_replace_all(i,"Р»","л") i=string_replace_all(i,"Рј","м") i=string_replace_all(i,"РЅ","н") i=string_replace_all(i,"Рѕ","о") i=string_replace_all(i,"Рї","п") i=string_replace_all(i,"СЂ","р") i=string_replace_all(i,"СЃ","с") i=string_replace_all(i,"С‚","т") i=string_replace_all(i,"Сѓ","у") i=string_replace_all(i,"С„","ф") i=string_replace_all(i,"С…","х") i=string_replace_all(i,"С†","ц") i=string_replace_all(i,"С‡","ч") i=string_replace_all(i,"С€","ш") i=string_replace_all(i,"С‰","щ") i=string_replace_all(i,"СЉ","ъ") i=string_replace_all(i,"С‹","ы") i=string_replace_all(i,"СЊ","ь") i=string_replace_all(i,"СЌ","э") i=string_replace_all(i,"СЋ","ю") i=string_replace_all(i,"СЏ","я") return (i) Название: Re: Полезные скрипты. Отправлено: Dmi7ry от Август 10, 2013, 19:48:29 Написал скрипт может кому-то будет полезным sm:) http://forum.hellroom.ru/index.php?topic=15240.msg186225#msg186225Название: Re: Полезные скрипты. Отправлено: life Jumb от Август 11, 2013, 01:52:01 http://forum.hellroom.ru/index.php?topic=15240.msg186225#msg186225 на гм 8 скрипт не работаетНазвание: Re: Полезные скрипты. Отправлено: Dmi7ry от Август 11, 2013, 05:36:20 Да, что-то не подумал про GM8.
Ок, тогда вот немного магии: Код: // utf-8 to win-1251 by Dmi7ry ntext="" for(i=1;i<=len;i+=1) { a = ord(string_char_at(argument0,i)) if a<$d0 { ntext += chr(a); continue } b = ord(string_char_at(argument0,i+1)); i+=1 code = ((a & $1f) << 6) | (b & $3f) ntext += chr(code-$350) } return ntext Конечно, это не совсем на 100% корректное преобразование - например, буква "ё" не учитывается, однако чаще всего она и не используется. Если же нужно, то можно поставить отдельную проверку на неё. Всё же и размер и, думаю, скорость работы существенно выигрывают. Название: Re: Полезные скрипты. Отправлено: Error of Matrix от Август 11, 2013, 08:45:52 Скрипт рисования сетки (Не знаю, было или не было, но вот...)
Код: /* argument0-Ширина ячейки argument1-Высота ячейки argument2-Отступ от верхнего левого угла argument3-Прозрачность argument4-Цвет */ var wid,hei,z,lastcol,lastalph; lastcol=draw_get_color() lastalph=draw_get_alpha() draw_set_color(argument4) draw_set_alpha(argument3) wid=argument0 hei=argument1 z=argument2 repeat(room_width/wid){ draw_line(z,0,z,room_height) z+=wid } z=argument2 repeat(room_width/hei){ draw_line(0,z,room_width,z) z+=hei } draw_set_color(lastcol) draw_set_alpha(lastalph) Название: Re: Полезные скрипты. Отправлено: Dmi7ry от Август 11, 2013, 11:02:00 Скрипт рисования сетки (Не знаю, было или не было, но вот...) Я у себя в проекте использую рисование сетки в редакторе, но рисую исключительно часть, которая попадает в вид, что более оптимально.Код: // Рисование сетки с ячейкой, размер которой кратен степени двойки (2, 4, 8, 16, 32, 64, 128, 256 и т.д). By Dmi7ry // argument0 - cell width // argument1 - cell height w = view_wview[0] div argument0 h = view_hview[0] div argument1 for (i=1; i<=w; i+=1) draw_line((view_xview[0]+i*argument0)&($FFFFFFFF-argument0+1) , view_yview[0], (view_xview[0]+i*argument0)&($FFFFFFFF-argument0+1), view_yview[0]+view_hview[0]) for (i=1; i<h; i+=1) draw_line(view_xview[0], (view_yview[0]+i*argument1)&($FFFFFFFF-argument1+1), view_xview[0]+view_wview[0], (view_yview[0]+i*argument1)&($FFFFFFFF-argument1+1)) Название: Re: Полезные скрипты. Отправлено: Error of Matrix от Август 11, 2013, 15:14:23 Скрипт рисования сетки (Не знаю, было или не было, но вот...) Я у себя в проекте использую рисование сетки в редакторе, но рисую исключительно часть, которая попадает в вид, что более оптимально.Код: // Рисование сетки с ячейкой, размер которой кратен степени двойки (2, 4, 8, 16, 32, 64, 128, 256 и т.д). By Dmi7ry // argument0 - cell width // argument1 - cell height w = view_wview[0] div argument0 h = view_hview[0] div argument1 for (i=1; i<=w; i+=1) draw_line((view_xview[0]+i*argument0)&($FFFFFFFF-argument0+1) , view_yview[0], (view_xview[0]+i*argument0)&($FFFFFFFF-argument0+1), view_yview[0]+view_hview[0]) for (i=1; i<h; i+=1) draw_line(view_xview[0], (view_yview[0]+i*argument1)&($FFFFFFFF-argument1+1), view_xview[0]+view_wview[0], (view_yview[0]+i*argument1)&($FFFFFFFF-argument1+1)) Но если только в пределах вида- тогда можно немного переделать мой (Заменить вторые аргументы на view_xview[0] view_yview[0], а room_width/height заменить на view_w/hview[0]), и он будет работать также sm:) Название: Re: Полезные скрипты. Отправлено: Dmi7ry от Август 11, 2013, 15:24:00 Но если только в пределах вида- тогда можно немного переделать мой (Заменить вторые аргументы на view_xview[0] view_yview[0], а room_width/height заменить на view_w/hview[0]), и он будет работать также sm:) Нет. В том и фишка. У меня отображает так, что за угол отсчёта берётся левый верхний угол комнаты.Если у вас взять за угол отсчета координаты вида, то смещение относительно угла комнаты отступ будет нарушено (то есть координаты сетки будут некорректными). Название: Re: Полезные скрипты. Отправлено: Error of Matrix от Август 12, 2013, 03:00:23 Но если только в пределах вида- тогда можно немного переделать мой (Заменить вторые аргументы на view_xview[0] view_yview[0], а room_width/height заменить на view_w/hview[0]), и он будет работать также sm:) Нет. В том и фишка. У меня отображает так, что за угол отсчёта берётся левый верхний угол комнаты.Если у вас взять за угол отсчета координаты вида, то смещение относительно угла комнаты отступ будет нарушено (то есть координаты сетки будут некорректными). Название: Re: Полезные скрипты. Отправлено: ETUN4 от Сентябрь 26, 2013, 17:44:02 Два скрипта, которые считывают все текстовые файлы рядом с игрой и выполняют код, который в них написан.
Код: str = ""; str = file_find_first(working_directory + "\*.txt",fa_directory); execute_file(str); while(!str = "") { str = file_find_next(); if !str = "" { execute_file(str); } } Код: for (i=0; i<999; i+=1) { str[i]=""; }; str[0] = file_find_first(working_directory + "\*.txt",fa_directory); for (i=1; i<999; i+=1) { str[i]=file_find_next(); if !str[i]="" { execute_file(str[i]); } else { break; } }; Название: Re: Полезные скрипты. Отправлено: Fantom от Сентябрь 26, 2013, 17:45:34 такие вещи удобнее (и даже проще) делать списками Название: Re: Полезные скрипты. Отправлено: ETUN4 от Сентябрь 27, 2013, 22:32:27 такие вещи удобнее (и даже проще) делать списками Название: Re: Полезные скрипты. Отправлено: genius от Январь 09, 2014, 01:07:59 Код: /* Автор genius. * Скрипт рисует 3д текст. * арг[0] = x * арг[1] = y * арг[2] = Направление заднего слоя * арг[3] = Длина * арг[4] = Цвет заднего слоя * арг[5] = Цвет переднего слоя * арг[6] = Шрифт * арг[7] = Текст */ draw_set_color(argument4) draw_set_font(argument6) var i; for (i = 1; i <= argument3; i += 1) // Рисуем смещая координаты столько раз, сколько = длина. { // Рисование заднего слоя draw_text(argument0+lengthdir_x(i, argument2), argument1+lengthdir_y(i, argument2), argument7 ) // Рисование переднего слоя if ( i = argument3 ) { draw_set_color(argument5) draw_text(argument0, argument1, argument7 ) } } Пример : Код: scr_3Dtext(20, 16, 225, 6, c_black, c_blue, fnt1b, 'Сегодня был отличный день.') Название: Re: Полезные скрипты. Отправлено: AndrewVideoGames от Январь 09, 2014, 10:50:15 Ну как, 3д, это по другому называется, рисовать текст в 3д - это с помощью d3d функций или подгрузки моделей-шрифтов _gg_:
Название: Re: Полезные скрипты Отправлено: Error of Matrix от Январь 12, 2014, 07:55:51 Вот, простенький скрипт, извлечение расширения файла:
Код: str=argument0 i=1 swch=false res='' while(i<=string_length(str)){ if(swch){ res=res+string_char_at(str,i) } if(string_char_at(str,i)='.'){ swch=true dot_pos=i//Позиция точки, может пригодиться, когда надо обрезать расширение res="" } i+=1 } return res Название: Re: Полезные скрипты Отправлено: Dmi7ry от Январь 12, 2014, 08:21:43 Вот, простенький скрипт, извлечение расширения файла: угадайте, что делает функция filename_ext?Название: Re: Полезные скрипты Отправлено: Error of Matrix от Январь 12, 2014, 12:20:14 Вот, простенький скрипт, извлечение расширения файла: угадайте, что делает функция filename_ext?Название: Re: Полезные скрипты Отправлено: Fur от Январь 20, 2014, 17:08:37 Не знаю, будет ли скрипт кому-то полезен и писали ли его до меня. Я просто оставлю это здесь.
Код: //move_contact_object(obj,dir,maxdist) for (i=1 i<argument2 i+=1) { Xx=x+lengthdir_x(i,argument1) Yy=y+lengthdir_y(i,argument1) if place_meeting(Xx,Yy,argument0) { x+=lengthdir_x(i-1,argument1) y+=lengthdir_y(i-1,argument1) break } } Название: Re: Полезные скрипты Отправлено: genius от Январь 20, 2014, 17:46:29 Не знаю, будет ли скрипт кому-то полезен и писали ли его до меня. Я просто оставлю это здесь. Ему уже несколько лет.Код: //move_contact_object(obj,dir,maxdist) for (i=1 i<argument2 i+=1) { Xx=x+lengthdir_x(i,argument1) Yy=y+lengthdir_y(i,argument1) if place_meeting(Xx,Yy,argument0) { x+=lengthdir_x(i-1,argument1) y+=lengthdir_y(i-1,argument1) break } } Название: Re: Полезные скрипты Отправлено: Fur от Январь 20, 2014, 19:12:47 Тогда я изобрел велосипед _gg_:
Название: Re: Полезные скрипты Отправлено: Error of Matrix от Январь 21, 2014, 09:23:04 Таки да, я его узнал уже давным-давно, где-то на форуме был аналог.
Название: Re: Полезные скрипты Отправлено: VladTheCat от Январь 21, 2014, 14:29:59 Таки да, я его узнал уже давным-давно, где-то на форуме был аналог. Например, вот. (http://forum.hellroom.ru/index.php?topic=10081.msg111600#msg111600) Были ещё реализации от других людей, но я не знаю, где искать эти темы.Название: Re: Полезные скрипты Отправлено: ETUN4 от Февраль 01, 2014, 16:19:42 Набор скриптов что бы создать лог убийств для многопользовательской игры(будет как в counter strike).
Автор: Я Код: (sc_log_kill_init(num)) global.log_kill_killer = ds_list_create(); global.log_kill_weapon = ds_list_create(); global.log_kill_crushed = ds_list_create(); global.log_kill_num = argument0; for(i = 0; i < global.log_kill_num; i += 1) { ds_list_insert(global.log_kill_killer, i, ""); ds_list_insert(global.log_kill_weapon, i, -1); ds_list_insert(global.log_kill_crushed, i, ""); } Код: (sc_log_kill_add(killer, weapon, crushed)) for(i = 1; i < global.log_kill_num; i += 1) { ds_list_insert(global.log_kill_killer, i-1, ds_list_find_value(global.log_kill_killer, i)) ds_list_insert(global.log_kill_weapon, i-1, ds_list_find_value(global.log_kill_weapon, i)) ds_list_insert(global.log_kill_crushed, i-1, ds_list_find_value(global.log_kill_crushed, i)) } ds_list_insert(global.log_kill_killer,global.log_kill_num - 1, argument0); ds_list_insert(global.log_kill_weapon,global.log_kill_num - 1, argument1); ds_list_insert(global.log_kill_crushed,global.log_kill_num - 1, argument2); Код: ( sc_log_kill_free()) ds_list_destroy(global.log_kill_killer); ds_list_destroy(global.log_kill_weapon); ds_list_destroy(global.log_kill_crushed); Код: ( sc_log_kill_clear()) ds_list_clear(global.log_kill_killer); ds_list_clear(global.log_kill_weapon); ds_list_clear(global.log_kill_crushed); Код: ( sc_log_kill_draw(x, y)) var xx, yy; xx = argument0; yy = argument1; draw_set_halign(fa_right); for(i = 0; i < global.log_kill_num; i += 1) { draw_text( xx - ((string_width(ds_list_find_value(global.log_kill_crushed, i)) + sprite_get_width(ds_list_find_value(global.log_kill_weapon, i))/2 + 40)), yy + (i*20) + (30), ds_list_find_value(global.log_kill_killer, i)); draw_sprite_ext(ds_list_find_value(global.log_kill_weapon, i), 1, xx - (((sprite_get_width(ds_list_find_value(global.log_kill_weapon, i)) - sprite_get_xoffset(ds_list_find_value(global.log_kill_weapon, i)))/2 + 35 + string_width(ds_list_find_value(global.log_kill_crushed, i)))), yy + (i*20) + (30), 0.5, 0.5, 0, c_white, 1); draw_text( xx - (30), yy + (i*20) + (30), ds_list_find_value(global.log_kill_crushed, i)); } Всё вроде понятно. Название: Re: Полезные скрипты Отправлено: genius от Февраль 01, 2014, 16:23:42 Цитировать Были ещё реализации от других людей, но я не знаю, где искать эти темы. Можно так:ETUN4, я это делал несколько месяцев назад. Название: Re: Полезные скрипты Отправлено: ETUN4 от Февраль 01, 2014, 20:32:47 ETUN4, я это делал несколько месяцев назад. У меня уже всё готовое. Название: Re: Полезные скрипты Отправлено: Error of Matrix от Февраль 10, 2014, 09:11:21 Вот, может если кому будет интересно, скрипты склеивания файлов.
Код: //Суть этого участка кода в том, чтобы добавить несколько названий файлов в список tail. Вы можете его заменить, если не хотите использовать расширение мультизагрузки файлов tail=ds_list_create() files=tr_get_files('All files|*.*') if(files!='13' and tr_files_amnt()!=1){ repeat(tr_files_amnt()){ plus=string_copy(files,0,string_pos(chr(13),files)-1) ds_list_add(tail,plus) files=string_delete(files,1,string_pos(chr(13),files)) } } i=1 packname=string(current_day)+'.'+string(current_month)+'.'+string(current_year)+'.'+string(current_hour)+'.'+string(current_minute)+'.'+string(current_second)+'.npack' res_cont=file_bin_open(filename_dir(ds_list_find_value(tail,0))+'\'+packname,1) repeat(string_length(string(ds_list_size(tail)))){ file_bin_write_byte(res_cont,real(string_char_at(string(ds_list_size(tail)),i))) i+=1 } file_bin_write_byte(res_cont,11) i=0 repeat(ds_list_size(tail)){ cur_bin=file_bin_open(ds_list_find_value(tail,i),0) ii=1 repeat(string_length(string(file_bin_size(cur_bin)))){ file_bin_write_byte(res_cont,real(string_char_at(string(file_bin_size(cur_bin)),ii))) ii+=1 } ii=1 file_bin_write_byte(res_cont,11) repeat(string_length(filename_name(ds_list_find_value(tail,i)))){ file_bin_write_byte(res_cont,ord(string_char_at(filename_name(ds_list_find_value(tail,i)),ii))) ii+=1 } ii=1 file_bin_write_byte(res_cont,7) repeat(file_bin_size(cur_bin)){ file_bin_write_byte(res_cont,file_bin_read_byte(cur_bin)) } file_bin_close(cur_bin) i+=1 } file_bin_close(res_cont) Код: cont=tr_get_file('NeonPacks|*.npack') bin_cont=file_bin_open(cont,0) redbyte=file_bin_read_byte(bin_cont) f_amnt='' while(redbyte!=11){ f_amnt+=string(redbyte) redbyte=file_bin_read_byte(bin_cont) } repeat(real(f_amnt)){ f_size='' redbyte=file_bin_read_byte(bin_cont) while(redbyte!=11){ f_size+=string(redbyte) redbyte=file_bin_read_byte(bin_cont) } f_name='' redbyte=file_bin_read_byte(bin_cont) while(redbyte!=7){ f_name+=chr(redbyte) redbyte=file_bin_read_byte(bin_cont) } unpack_bin=file_bin_open(filename_path(cont)+f_name,1) repeat(real(f_size)){ file_bin_write_byte(unpack_bin,file_bin_read_byte(bin_cont)) } file_bin_close(unpack_bin) } file_bin_close(bin_cont) Название: Re: Полезные скрипты. Свой instance_nearest v2 Отправлено: Fantom от Февраль 13, 2014, 19:23:00 Автор: FanTom.
instance_nearest v2 Использует датаструктуры, поэтому способ может быть недоступен для лайт-версий ГМ. Код: var ds; ds=ds_priority_create(); with (object) //проверяемый объект {if collision_line(x,y,other.x,other.y,Wall,1,0) {continue} //не рассматривать тех, кто за стеной if id=other.id {continue} //не рассматривать самого себя, если with используется на таком же объекте // - добавить свои условия, при которых экземпляр не будет участвовать в отборе ближайшего ds_priority_add(ds,id,point_distance(x,y,other.x,other.y)); } // - - можно добавлять другие объекты для проверки - замена присвоения родителей для поиска ближайшего среди наследуемых - - if !ds_priority_empty(ds) {target=ds_priority_find_min(ds);} //это будет id ближайшего объекта ds_priority_destroy(ds); Название: Re: Полезные скрипты Отправлено: ETUN4 от Февраль 18, 2014, 10:01:33 FanTom, действительно полезный скрипт.
Название: Re: Полезные скрипты Отправлено: Dmi7ry от Апрель 04, 2014, 15:36:02 Мелкие скрипты, написанные для себя и используемые в проектах.
Заполнение разрядов перед числом нулями Скрипт FanTom'а (http://forum.hellroom.ru/index.php?topic=1827.msg18852#msg18852) не универсален (в силу его очень давнего написания), а скрипт через умножение (http://forum.hellroom.ru/index.php?topic=1827.msg161431#msg161431) не работает на GMS. Поэтому ещё один вариант: Цитировать zero(123, 5) -> 00123 Вывод числа с интерактивным отображением дробной части Если число меньше 10, то отображается один символ после запятой. Если же число больше или равно 10, то отображается только целая часть. При отображении дробной части, она округляется корректно, а при отображении целого числа, дробная часть просто отбрасывается, без округления. Цитировать 5.73 -> "5.7" 5.76 -> "5.8" 10.73 -> "10" Перевод строки в массив. Тут всё очень просто. Цитировать 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 и так далее... Получение элемента строки. В предыдущем скрипте используется скрипт get_part, который позволяет взять определённый элемент из строки. Задаётся строка, номер элемента и разделитель. Например: Цитировать get_part("Новичок|Бывалый|Мастер|Гуру", 2, "|") -> "Бывалый" При ошибке возвращает пустую строку.Поиск символа в строке Используется предыдущим скриптом. Задаём строку, номер символа, и сам символ. Например, в строке нужно найти положение второго символа "a": Цитировать find_char("abcabcabc", 2, "a") -> 4 Возвращает -1 при отсутствии символа.Сортировка массива Передаём в скрипт одномерный массив, на выходе получаем его же, но в сортированном виде. Название: Re: Полезные скрипты Отправлено: Fur от Апрель 11, 2014, 16:58:07 Скрипт отрисовки сектора окружности с помощью примитива. Можно задавать количество костей для большей/меньшей детализации, толщину линии. Спасибо Diablo13th за помощь в написании и оптимизации. :meow:
Код: ///draw_circle_curve(x,y,r,bones,ang,angadd,width) var xx,yy,R,B,A,Aa,W,a,lp,lm,dp,dm,B2,AAa,Wh; xx=argument0 yy=argument1 R=argument2 B=argument3 A=argument4 Aa=argument5 W=argument6 B2=B+2 a=Aa/B2 Wh=W/2 lp=R+Wh lm=R-Wh AAa=A+Aa draw_primitive_begin(pr_trianglestrip) { draw_vertex(xx+lengthdir_x(lm,A),yy+lengthdir_y(lm,A)) for(i=1 i<=B2 i+=1) { dp=A+a*i dm=dp-a draw_vertex(xx+lengthdir_x(lp,dm),yy+lengthdir_y(lp,dm)) draw_vertex(xx+lengthdir_x(lm,dp),yy+lengthdir_y(lm,dp)) } draw_vertex(xx+lengthdir_x(lp,AAa),yy+lengthdir_y(lp,AAa)) draw_vertex(xx+lengthdir_x(lm,AAa),yy+lengthdir_y(lm,AAa)) } draw_primitive_end() Название: Re: Полезные скрипты Отправлено: Goo от Июль 02, 2014, 22:51:12 Может кому пригодится простой скрипт, выделение объектов, перемещение
Код: for (i=0;i<instance_number(par);i+=1) { if collision_rectangle(o_control.x1,o_control.y1,o_control.x2,o_control.y2,(instance_nearest(x,y,par)),false,false) { with ( (instance_nearest(x,y,par))) { (instance_nearest(x,y,par)).selected=true; } } break; } if hp<1 { instance_destroy(); } if mouse_check_button_pressed(mb_left) { if selected==1 { selected=0; } } if distance_to_point(dx,dy)>128 { if distance_to_point(dx,dy)<2001 { if !collision_line(x,y,dx,dy,par,false,false) { if(mp_grid_path(o_control.gri, my_path, x, y, dx, dy, true)) { path_start(my_path,spd, 0, 1);//?????? ?????????? ???? image_angle=direction;//??? ? ?????? ? ??????? ???????!!! } } else { mp_potential_step(dx,dy,spd,false);//?????? ??????????? image_angle=direction; } } } else if distance_to_point(dx,dy)<129 { if distance_to_point(dx,dy)>0 { mp_linear_step(dx,dy,spd,false); image_angle=direction; } } сможет пригодиться, всем удачи!!! ZaRubick Название: Re: Полезные скрипты Отправлено: S_Kleer от Июль 05, 2014, 22:35:55 Этот скрипт выделяет объекты рамкой?
Если да, то у меня по проще, но без поиска пути. Название: Re: Полезные скрипты Отправлено: SilentPhil от Июль 06, 2014, 09:53:47 2ZaRubick, par, gri, магические числа... Что-а?
Название: Re: Полезные скрипты Отправлено: Goo от Июль 06, 2014, 13:41:28 Цитировать 2ZaRubick, par, gri, магические числа... Что-а? здравствуйте, простите забыл в конце скрипта прописать в коментахpar - объект который будет перемещаться (par от parents вдруг объекты разных категорий будут нуждаться в использовании этого скрипта) gri - сеть созданная в контролере т.е. gri = mp_grid_create(0, 0, room_width/40, room_height/40, 40, 40); где 40 ширина и длина ячейки сети! спасибо что предупредили, а то я не заметил, что не дописал Добавлено: Июль 06, 2014, 13:46:10 Цитировать Этот скрипт выделяет объекты рамкой? ,Если да, то у меня по проще, но без поиска пути. я же просил, если что-то есть пишите в лс!!!, если конечно не использован совсем простой способ, но если этот простой способ более уместен, то и его можно! всем удачи ZaRubick Название: Re: Полезные скрипты Отправлено: S_Kleer от Октябрь 28, 2014, 22:30:35 Скрипт на перемещение объекта по изометрической сетке:
Код: // Script: move_snap_isometric(hsnap, vsnap) Код не мой, но я его долго искал. Очень помог. Оставляю здесь, чтобы наверняка знать, где его можно найти. sm:)// Purpose: snaps the instance to an isometric grid. // Inputs: // ? argument0 = the horizontal snapping value, i.e. the width of the grid. // ? argument1 = the vertical snapping value, i.e. the height of the grid. // Example: // ? move_snap_isometric(32, 16); var m, n; m = round(y/argument1 - x/argument0); n = round(y/argument1 + x/argument0); x = (n - m)/2*argument0; y = (n + m)/2*argument1; Название: Re: Полезные скрипты Отправлено: Trus от Март 12, 2015, 17:23:42 Скрипт замены русских букв в HEX. Если допустим нужна ссылка из игры с кириллицей.
Название: Re: Полезные скрипты Отправлено: Neo от Март 31, 2015, 21:53:33 Скрипт отрисовки кругового бара (или просто окружности) на примитивах.
(http://forum.hellroom.ru/index.php?action=dlattach;topic=1827.0;attach=30758;image) x - X координата; y - У координата; radius - Радиус; width - Толщина. Только увеличивает радиус контура относительно значения radius; smooth - Сглаживание. Чем выше, тем приятнее выглядит; angle - Значение угла. При значении 360 рисует окружность полностью; shift - Поворот точки начала отсчета. Значения от 0 до 360 желательно direct - Направление для заполнения. Значения 1 или -1 Код: //Script by LisenokArtist //scr_draw_circle_bar(x, y, radius, width, smooth, angle, shift, direct) var xx, yy, radius, width, smooth, angle, shift, direct, i; xx = argument0; yy = argument1; radius = argument2; width = argument3; smooth = argument4; angle = abs(argument5); shift = argument6; direct = sign(ceil(argument7)); draw_primitive_begin(pr_trianglestrip); draw_vertex( xx + (cos(direct*degtorad(0 + shift)) * radius), yy + (sin(direct*degtorad(0 + shift)) * radius)); draw_vertex( xx + (cos(direct*degtorad(0 + shift)) * (radius + width)), yy + (sin(direct*degtorad(0 + shift)) * (radius + width))); for (i = 0; i <= smooth; i += 1) { if i * (360 / smooth) <= angle { draw_vertex( xx + (cos(direct*degtorad(i * (360 / smooth) + shift)) * radius), yy + (sin(direct*degtorad(i * (360 / smooth) + shift)) * radius)); draw_vertex( xx + (cos(direct*degtorad(i * (360 / smooth) + shift)) * (radius + width)), yy + (sin(direct*degtorad(i * (360 / smooth) + shift)) * (radius + width))); } else { draw_vertex( xx + (cos(direct*degtorad(angle + shift)) * radius), yy + (sin(direct*degtorad(angle + shift)) * radius)); draw_vertex( xx + (cos(direct*degtorad(angle + shift)) * (radius + width)), yy + (sin(direct*degtorad(angle + shift)) * (radius + width))); } } draw_primitive_end(); Название: Re: Полезные скрипты Отправлено: life Jumb от Март 31, 2015, 23:15:38 Отличная работа +1 sm_hi3
Из минусов низкая производительность - не выгодно юзать в шаге, не смотря на то что идет опись примитива, хоть немного положение это и спасает, метод не оптимальный. Рекомендую еще добавить возможность текстурирования через скрипт. Название: Re: Полезные скрипты Отправлено: Fur от Март 31, 2015, 23:19:26 По идее использование ленсдиров вместо синусов/косинусов увеличит производительность в ущерб точности вычислений. Однако ключевое значение имеет количество вершин.
Кстати, я уже выкладывал тут идентичный скриптец, повод для меряния письками. :D Название: Re: Полезные скрипты Отправлено: Neo от Март 31, 2015, 23:41:40 Из минусов низкая производительность Покажешь как должно выглядеть для высокой "производительности"? Было бы полезно знать, особенно взглянуть на те аргументы, на которых основывается твой факт. Название: Re: Полезные скрипты Отправлено: AndrewVideoGames от Апрель 01, 2015, 17:40:31 Neo, неплохо sm_good
Название: Re: Полезные скрипты Отправлено: life Jumb от Август 22, 2015, 00:05:28 Код: var r; r=0 if(argument1=argument0){r=1} return(r) Простейший скрипт, и так видно вообщем что он делает. Подобный скрипт и его вариации, очень удобно например использовать в качестве аргумента для функций. Тут вообще даже не сам скрипт важен, а смысл подобного стиля в написании кода Название: Re: Полезные скрипты Отправлено: MusNik от Август 22, 2015, 00:20:31 Код: return(argument1=argument0); Тогда уж. Но непонятно зачем, почему не использовать само равенство в выражении или функции? Код: a = 3+10*(a=b); show_debug_message(string(a=b)); Так, если что, можно. Название: Re: Полезные скрипты Отправлено: Briginas от Август 22, 2015, 00:23:40 Какой смысл скрипта, если можно писать так:
Код: (a=b) Например:Код: с = (a=b) С будет равно 1, если a=b.Код: c = (a1=b1)*(a2=b2) C будет равно 1, если a1=b1 и a2=b2.Добавлено: Август 22, 2015, 00:25:52 Мусник опередил с: Название: Re: Полезные скрипты Отправлено: life Jumb от Август 22, 2015, 00:31:55 Не это понятно, я же лишь пример привел. Я говорю о более сложных штуках
типа Код: var r; r="вася" repeat(64) { argument2=sqrt(argument2) } if(abs(argument1)+косинус_арбитальной_бомбардировки*квадрат_мамки>=argument2){r="Мавзолей"} return(r) Название: Re: Полезные скрипты Отправлено: Dmi7ry от Сентябрь 10, 2015, 22:16:30 Универсальные скрипты для создания любого количества alarm'ов. Работают по отношению к объекту, из которого запускаются.
На форуме уже были темы/решения. Например, решение с дополнительным объектом (http://forum.hellroom.ru/index.php?topic=9672.msg105355#msg105355). Но дополнительный объект - они и в Африке дополнительный объект. Иногда лишние объекты совершенно ни к чему, и есть некоторые неудобства в использовании. Ещё одно (http://forum.hellroom.ru/index.php?topic=6671.0) решение было от VladTheCat. Подобный метод используется и у меня. Пример использования: Код: (create) custom_alarms_initialize(100); // 100 таймеров Код: (step begin) custom_alarms_step(); // обработка таймеров Код: (запуск таймера) custom_alarm_set(20, room_speed * 5, alarm_action); // таймер 20, 5 секунд, запустится скрипт alarm_action Код: (получение текущего значения) custom_alarm_get_current(20) То есть не нужно ничего самостоятельно проверять, менять и т.п. Кроме того, по истечении времени, таймер запускает любой указанный скрипт, что позволяет использовать один таймер для разных целей. Код: (скрипт custom_alarms_initialize) /// custom_alarms_initialize(alarms_number) for (var i=0; i<argument0; i++) { custom_alarm[i, 0] = -1; custom_alarm[i, 1] = -1; } Код: (скрипт custom_alarms_step) /// custom_alarms_step() // Call it from Step Begin event var sz = array_height_2d(custom_alarm); for (var i=0; i<sz; i++) { if custom_alarm[i, 0] != -1 { custom_alarm[i, 0]--; // Counter if custom_alarm[i, 0] < 1 { custom_alarm[i, 0] = -1; if script_exists(custom_alarm[i, 1]) script_execute(custom_alarm[i, 1]); } } } Код: (скрипт custom_alarm_set) /// custom_alarm_set(alarm, time, script) var sz = array_height_2d(custom_alarm); if argument0 < sz { custom_alarm[argument0, 0] = floor(max(-1, argument1)); custom_alarm[argument0, 1] = argument2; } else { show_message("Out of range (alarm " + string(argument0) + "). Max alarm id: " + string(sz - 1)); } Код: (скрипт custom_alarm_get_current) /// custom_alarm_get_current(alarm) var sz = array_height_2d(custom_alarm); if argument0 < sz { return custom_alarm[argument0, 0]; } else { show_message("Out of range (alarm " + string(argument0) + "). Max alarm id: " + string(sz - 1)); } P.S. К сообщению прикреплён готовый пример. Название: Re: Полезные скрипты Отправлено: Goo от Сентябрь 10, 2015, 23:03:24 sm_good Браво!
Название: Re: Полезные скрипты Отправлено: Christopher от Январь 13, 2016, 04:31:25 Настругал небольшой скрипт тайловой работы со спрайтами
Обьекты меняют спрайты, как тайлы(чем-то напоминает работу текстур в старых Starcraft и Warcraft редакторах) Скрипт сделан на обработку всего по 4м сторонам(в идеале должно быть 8) Может быть он не новый, но я считаю его полезным, т.к. не нужно просчитывать все самому Для начала нужен спрайт с 16ю изображениями внутри (позиции показаны в спрайте) Код: (Step Event) //Tiling var pm_right, pm_left, pm_down, pm_up; pm_right=place_meeting(x-32,y,обьект); pm_left=place_meeting(x+32,y,обьект); pm_down=place_meeting(x,y-32,обьект); pm_up=place_meeting(x,y+32,обьект); if !pm_up && !pm_down && !pm_left && !pm_right { image_index=0 } if !pm_up && !pm_down && pm_left && pm_right { image_index=1 } if pm_up && pm_down && !pm_left && !pm_right { image_index=2 } if pm_up && !pm_down && !pm_left && !pm_right { image_index=3 } if !pm_up && !pm_down && !pm_left && pm_right { image_index=4 } if !pm_up && pm_down && !pm_left && !pm_right { image_index=5 } if !pm_up && !pm_down && pm_left && !pm_right { image_index=6 } if pm_up && !pm_down && pm_left && !pm_right { image_index=7 } if pm_up && !pm_down && pm_left && pm_right { image_index=8 } if pm_up && !pm_down && !pm_left && pm_right { image_index=9 } if pm_up && pm_down && !pm_left && pm_right { image_index=10 } if !pm_up && pm_down && !pm_left && pm_right { image_index=11 } if !pm_up && pm_down && pm_left && pm_right { image_index=12 } if !pm_up && pm_down && pm_left && !pm_right { image_index=13 } if pm_up && pm_down && pm_left && !pm_right { image_index=14 } if pm_up && pm_down && pm_left && pm_right { image_index=15 } Название: Re: Полезные скрипты Отправлено: Dmi7ry от Январь 13, 2016, 06:47:07 Настругал небольшой скрипт тайловой работы со спрайтами Вот как пишется данный скрипт:Обьекты меняют спрайты, как тайлы(чем-то напоминает работу текстур в старых Starcraft и Warcraft редакторах) Скрипт сделан на обработку всего по 4м сторонам(в идеале должно быть 8) Может быть он не новый, но я считаю его полезным, т.к. не нужно просчитывать все самому Для начала нужен спрайт с 16ю изображениями внутри (позиции показаны в спрайте) Код: /// autotile(тип_объекта) Подробности, ссылки и примеры тут (http://forum.hellroom.ru/index.php?topic=10034.0).image_index = // битовые смещения в зависимости от наличия объекта. (place_meeting(x, y - sprite_height, argument0) << 0) | (place_meeting(x, y + sprite_height, argument0) << 1) | (place_meeting(x - sprite_width, y, argument0) << 2) | (place_meeting(x + sprite_width, y, argument0) << 3) image_speed = 0 Название: Re: Полезные скрипты Отправлено: GreenAttila от Январь 13, 2016, 14:18:32 Настругал небольшой скрипт тайловой работы со спрайтами Обьекты меняют спрайты, как тайлы(чем-то напоминает работу текстур в старых Starcraft и Warcraft редакторах) Скрипт сделан на обработку всего по 4м сторонам(в идеале должно быть 8) Может быть он не новый, но я считаю его полезным, т.к. не нужно просчитывать все самому Для начала нужен спрайт с 16ю изображениями внутри (позиции показаны в спрайте) Код: (Step Event) //Tiling var pm_right, pm_left, pm_down, pm_up; pm_right=place_meeting(x-32,y,обьект); pm_left=place_meeting(x+32,y,обьект); pm_down=place_meeting(x,y-32,обьект); pm_up=place_meeting(x,y+32,обьект); if !pm_up && !pm_down && !pm_left && !pm_right { image_index=0 } if !pm_up && !pm_down && pm_left && pm_right { image_index=1 } if pm_up && pm_down && !pm_left && !pm_right { image_index=2 } if pm_up && !pm_down && !pm_left && !pm_right { image_index=3 } if !pm_up && !pm_down && !pm_left && pm_right { image_index=4 } if !pm_up && pm_down && !pm_left && !pm_right { image_index=5 } if !pm_up && !pm_down && pm_left && !pm_right { image_index=6 } if pm_up && !pm_down && pm_left && !pm_right { image_index=7 } if pm_up && !pm_down && pm_left && pm_right { image_index=8 } if pm_up && !pm_down && !pm_left && pm_right { image_index=9 } if pm_up && pm_down && !pm_left && pm_right { image_index=10 } if !pm_up && pm_down && !pm_left && pm_right { image_index=11 } if !pm_up && pm_down && pm_left && pm_right { image_index=12 } if !pm_up && pm_down && pm_left && !pm_right { image_index=13 } if pm_up && pm_down && pm_left && !pm_right { image_index=14 } if pm_up && pm_down && pm_left && pm_right { image_index=15 } До полезности скрипту далеко, а еще буду проблемы, в не оптимизацию проекта Добавлено: Январь 27, 2016, 01:15:55 Обычный скрипт на сдвиг значений по 0.5 (можно свой сдвиг) Пример: X = 0.0 - 0.49 = 0.0; X = 0.5 - 0.99 = 0.5; X = 1.0 - 1.49 = 1.0; X = 1.5 - 1.99 = 1.5; Код: ///decimal_num(x) var i = argument0; var s = 0.5; if (frac(i) < s) i = floor(i); else i = floor(i) + s; return string_format(i, 0, 1); Пишем допустим: draw_text(20, 20, decimal_num(10.1236879)); И выдаст ответ = 10.0 Название: Re: Полезные скрипты Отправлено: Christopher от Апрель 11, 2016, 02:22:52 Упрощенный Healthbar путем отрисовки линии.
Так же можно дополнить второй линией для обозначений пустой части, т.е. задника Код: draw_line_width_colour(x+12-1*((hp/maxhp)/100),y+16,x+12,y+16,ширина,цвет1,цвет2) примечательно оно тем, что можно обойтись без спрайтов вообще(если лень рисовать, например)//создает линию под обьектом, с опр. шириной и градиентом двух цветов Название: Re: Полезные скрипты Отправлено: Troir от Апрель 12, 2016, 19:47:33 Упрощенный Healthbar путем отрисовки линии. Так же можно дополнить второй линией для обозначений пустой части, т.е. задника Код: draw_line_width_colour(x+12-1*((hp/maxhp)/100),y+16,x+12,y+16,ширина,цвет1,цвет2) примечательно оно тем, что можно обойтись без спрайтов вообще(если лень рисовать, например)//создает линию под обьектом, с опр. шириной и градиентом двух цветов Название: Re: Полезные скрипты Отправлено: Christopher от Апрель 12, 2016, 21:28:11 Данный скрипт генерирует галлактическое кольцо. Все, вроде бы, комментировано, посему проблем не должно возникнуть. Использует обьекты obj_star для создания. + можно, в зависимости от xx,yy в скрипте испольовать данные для obj_star, котоыре будут двигаться в опр. направлении и движении, анимируя ее. Название: Re: Полезные скрипты Отправлено: Goo от Апрель 13, 2016, 10:57:03 Цитировать Данный скрипт генерирует галлактическое кольцо Код: while (instance_count < 96) { instance_create(irandom(room_width), irandom(room_height), obj_star); } возможно я чего-то в коде недопонял, но не лучше ли, вместо объектов(obj_star) подобное сделать "математикой", задать эти координаты в одном объекте(запихав их стартовые значения в какой-нибудь список), формулами их "вертеть" начиная с ранее записанных стартовых координат, и генерить в этих точках частицы! Благо формулы по которым ты "вертишь" орбитально кольцо у тебя уже есть! Название: Re: Полезные скрипты Отправлено: Christopher от Апрель 13, 2016, 11:20:35 это был комментированый кусочек же, я просто вырезал из Create контроллера, просто, сначала пытался придать "пикантности" картинке таким способом sm_sarcastic
в итоге оставил единственный случай создания (да вообще, по хорошему, нужно спрайты выводить а не обьекты и двигать уже их) Название: Re: Полезные скрипты Отправлено: geroy231 от Апрель 13, 2016, 12:23:01 это был комментированый кусочек же, я просто вырезал из Create контроллера, просто, сначала пытался придать "пикантности" картинке таким способом Тогда что это делает в разделе Полезные скрипты?Название: draw_tiled_texture_pos Отправлено: life Jumb от Апрель 13, 2016, 15:15:50 draw_tiled_texture_pos (http://marketplace.yoyogames.com/assets/2329/draw_tiled_texture_pos)
Халявный скрипт, описание с картинками. Название: Re: Полезные скрипты Отправлено: DmitryDS от Апрель 13, 2016, 20:22:49 Данный скрипт генерирует галлактическое кольцо. Все, вроде бы, комментировано, посему проблем не должно возникнуть. Использует обьекты obj_star для создания. + можно, в зависимости от xx,yy в скрипте испольовать данные для obj_star, котоыре будут двигаться в опр. направлении и движении, анимируя ее. Надо будет погонять, посмотреть. А то мне надо как раз галактику генерировать, сидел думал, как реализовать. Название: Re: Полезные скрипты Отправлено: Neo от Апрель 21, 2016, 10:23:56 Код писал для проверки графической части интерфейса. Можно использовать для задачи рисуемым кнопкам какие-то действия, например, нажатие. Преобразует позицию элемента в значение 0, когда указатель мыши находится над элементом. В противных случаях смещается на 1 значения через каждое пройденное расстояние равное размеру элемента.
Код: //Script by LisenokArtist Пример того, как это должно было выглядеть, прикрепил к сообщению.///scrMouseOn( startx, starty, cell width, cell height) var startx, starty, cellw, cellh; startx = argument0; starty = argument1; cellw = argument2; cellh = argument3; var cx, cy; cx = floor((mouse_x - startx - view_xview) / cellw); cy = floor((mouse_y - starty - view_yview) / cellh); //Визуальная проверка для наглядности результата. Его можно затереть draw_set_alpha(1); if cx == 0 && cy == 0 draw_set_color(c_white) else draw_set_color(c_black); draw_set_alpha(0.75); draw_rectangle( startx + cx*cellw, starty + cy*cellh, startx + cx*cellw + cellw, starty + cy*cellh + cellh, false); draw_set_alpha(1); draw_set_color(c_red); draw_text(mouse_x - 16, mouse_y + 16, "X: " + string(cx) + "Y: " + string(cy)); draw_set_color(c_white); ///////////////////////////////////////////////////////////////////////////// if cx == 0 && cy == 0 return true else return false; Название: Re: Полезные скрипты Отправлено: DmitryDS от Июнь 29, 2016, 18:41:16 Простой, но очень полезный скрипт, заметно уменьшающий объем кода при написании всяких интерфейсов, а также имеющий небольшую защиту от возможных ошибок: Кнопка!
Код: (sc_Button) ///sc_Button(x1, y1, x2, y2) var x1 = min(argument0, argument2), y1 = min(argument1, argument3), x2 = max(argument0, argument2), y2 = max(argument1, argument3); return point_in_rectangle(window_mouse_get_x(), window_mouse_get_y(), x1, y1, x2, y2); Назначение, как видно - убедиться, что курсор находится в заданной области. Можно использовать не только для кнопок, но и для выделения элемента при наведении, вызове всплывающих подсказок etc. Название: Re: Полезные скрипты Отправлено: Gamedel от Июнь 30, 2016, 05:10:28 Скрипт нажатия кнопки с её отрисовкой Create: button_init() - инициализация скрипта Draw: button_sc_ext(x,y,image,index,image_index,toggle on, image off,image_index off) - рисование и проверка нажатия кнопки. При нажатии на кнопку возвращает значение 1, а по умолчанию 0. Нажатие проверяется по маске спрайта. x,y - координаты кнопки index - индекс кнопки (у каждой кнопки должен быть свой индекс. Примечание: индексы лучше начинать нумеровать с 0-n) image, image_index - спрайт кнопки и индекс спрайта toggle on - состояние кнопки (0 - выключена, тогда игнорирует нажатия и рисует спрайт image off; 1 - активна; 2 - игнорирует нажатия рисуется спрайт image) image off,image_index off - спрайт и его индекс, который будет рисоваться если кнопка отключена (т.е. toggle on=0) Пример использования скрипта: P.S. Если скрипт оказался полезным не забываем плюсовать sm_epik Добавлено: Июнь 30, 2016, 05:20:04 Скрипт постепенного сведения числа к нужному raven(my_val,other_val,prirost) - позволяет свести какое-нибудь число к нужному, используя число приращения. Возвращает my_val с приращением (в конечном итоге other_val). Полезен тем, что можно накидывать числу значения не боясь переполнения, заданного вами порога. my_val - число которое надо свести other_val - число к которому надо свести prirost - приращение (всегда положительное, даже если my_val>other_val) Пример использования: Название: Re: Полезные скрипты Отправлено: MusNik от Июнь 30, 2016, 10:10:24 prirost :sideways:
Это не это разве? Название: Re: Полезные скрипты Отправлено: Gamedel от Июнь 30, 2016, 10:56:15 Оно самое, не заметил. Ещё думаю можно было бы подобное с помощью готовой функции реализовать clamp(val, min, max)
Название: Re: Полезные скрипты Отправлено: life Jumb от Август 12, 2016, 13:24:50 Код: (math_mix(v1, v2, coof)) ///math_mix(v1, v2, coof) Самая обычная пропорция, возвращает среднее значение между v1 и v2 со смещением в сторону coofreturn( argument0*(1-argument2)+argument1*argument2 ) т.е если coof=0 возвратит v1 если coof=1 то v2 Код: (например) image_angle=math_mix(90, 80, 0.7) //необязательно v2 должен быть больше v1, формула работает и так x=math_mix(50, 20, global.pause=0) //норм работает с булевыми, это заменяет код: "if(global.pause=0){x=20}else{x=50}" Название: Re: Полезные скрипты Отправлено: Dmi7ry от Август 12, 2016, 14:39:20 Код: (math_mix(v1, v2, coof)) ///math_mix(v1, v2, coof) Самая обычная пропорция, возвращает среднее значение между v1 и v2 со смещением в сторону coofreturn( argument0*(1-argument2)+argument1*argument2 ) т.е если coof=0 возвратит v1 если coof=1 то v2 Код: (например) image_angle=math_mix(90, 80, 0.7) //необязательно v2 должен быть больше v1, формула работает и так x=math_mix(50, 20, global.pause=0) //норм работает с булевыми, это заменяет код: "if(global.pause=0){x=20}else{x=50}" Название: Re: Полезные скрипты Отправлено: life Jumb от Август 12, 2016, 15:47:53 О и правда такая есть, хотя я помню ее искал перед тем как написал свою, странно почему не mix
Название: Re: Полезные скрипты Отправлено: Лер да Рим от Август 12, 2016, 16:03:30 Какой ещё mix? Это функция линейно интерполяции.
Название: Re: Полезные скрипты Отправлено: life Jumb от Август 12, 2016, 16:10:57 Я имел в виду почему ее не mix в гамаке назвали. везде аналогичная функция mix называется, сорри если меня не поняли
Название: Re: Полезные скрипты Отправлено: Лер да Рим от Август 12, 2016, 16:20:07 Везде она как раз называется lerp (https://en.wikipedia.org/wiki/Linear_interpolation#Programming_language_support).
Название: Re: Полезные скрипты Отправлено: life Jumb от Август 12, 2016, 16:32:10 Я не знаю других яп, кроме glsles и блупринтов из ue, поэтому искал в справке потому-что хранилось в моей голове.
т.е. у меня очень узкий круг знаний в кодерстве Хотя забавно бывает натыкаться на такие совпадения, когда названия действия функции разные, но формула работы идентичная. Название: Re: Полезные скрипты Отправлено: MusNik от Август 12, 2016, 18:57:07 Какой, к чёрту, mix?
везде аналогичная функция mix называется Я не знаю других яп, кроме glsles и блупринтов из ue Я не знаю не одного ЯП, но буду использовать термин "везде". Молодец, чо.Название: Re: Полезные скрипты Отправлено: Goo от Август 13, 2016, 12:24:51 Ну не знаю, мне пригодилось, вдруг и еще кто-нибудь найдет ему применение
Первый скрип, у вас есть 3 произвольных значения, val0,val1 и val2, если при нажатии мыши точка cx,cy(не обязательно координаты мыши) попадает в оба квадрата(они одинаковы, но у второго дополнительные границы), то возвращает val2, если попадает в квадрат с границей(минуя "безграничный" квадрат), то возвращает val1, в противном случае возвращает val0(вне квадратов) Код: /// f_point_in_rectangle_border(cx,cy,x,y,x1,y1,lb,ub,rb,db,debug,val0,val1,val2,mouse key) var cx = argument0; // x var cy = argument1; // y var lx = argument2; // left x var uy = argument3; // up y var rx = argument4; // right x var dy = argument5; // down y var lb = argument6; // borders left var ub = argument7; // up var rb = argument8; // right var db = argument9; // down var d = argument10; // debug var v = argument11; // val 0 var v0 = argument12; // 1 var v1 = argument13; // 2 var k = argument14; // mouse key if(d) { draw_rectangle(lx,uy,rx,dy,true); draw_rectangle(lx-lb,uy-ub,rx+rb,dy+db,true); } if(mouse_check_button_pressed(k)) { if(point_in_rectangle(cx,cy,lx-lb,uy-ub,rx+rb,dy+db)) { if(point_in_rectangle(cx,cy,lx,uy,rx,dy)) { return(v1); } return(v0); } } return(v); Второй скрипт, возвращает true, если при нажатии мыши точка px,py(не обязательно координаты мыши) принадлежит кругу (cx,cy,r), при условии, что центр этого круга тоже принадлежит кругу (cx0,cy0,r0), в противном случае возвратит false Код: /// f_point_in_circle_ext(px,py,cx,cy,rad,cx0,cy0,rad0,debug,mouse key) var px = argument0; // point x var py = argument1; // point y var cx = argument2; // first circle x var cy = argument3; // first circle y var r = argument4; // first circle radius var cx0 = argument5; // second circle x var cy0 = argument6; // second circle y var r0 = argument7; // second circle radius var d = argument8; // debug var k = argument9; // mouse key if(d) { draw_circle(cx,cy,r,true); draw_circle(cx0,cy0,r0,true); } if(mouse_check_button_pressed(k)) { if(point_in_circle(cx,cy,cx0,cy0,r0)) { if(point_in_circle(px,py,cx,cy,r)) { return(true); } } } return(false); Название: Re: Полезные скрипты Отправлено: Fur от Август 13, 2016, 19:38:27 Комментарии? Объяснение назначения функции? .-.
Название: Re: Полезные скрипты Отправлено: MusNik от Август 13, 2016, 19:40:54 Да вроде и так понятно.
Название: Re: Полезные скрипты Отправлено: Fur от Август 13, 2016, 19:43:19 Да вроде и так понятно. Прочесть краткое описание функции так-то попроще, чем код, особенно с 14-ю аргументами. Название: Re: Полезные скрипты Отправлено: Goo от Август 13, 2016, 20:32:46 Цитировать Прочесть краткое описание функции так-то попроще, чем код, особенно с 14-ю аргументами. поправил (надеюсь описал понятно)Название: Re: Полезные скрипты Отправлено: Anto96WS от Ноябрь 08, 2016, 19:55:52 isLetter(char) | Возвращает true если символ - буква
Код: var temp; temp =ord(argument0); if((temp >64 && temp <91) || (temp >96 && temp <123) || (temp >191 && temp <256)){return true;} return false; isDigit(char) | Возвращает true если символ - цифра Код: var temp; temp =ord(argument0); if(temp >47 && temp< 58){return true;} return false; Название: Re: Полезные скрипты Отправлено: Fur от Ноябрь 08, 2016, 19:58:39 Кое-кто не знает про оператор ИЛИ.
Алсо, Код: temp=string_letters(argument0) //string_digits() for... um... digits. Насчёт быстродействия, правда, не уверен.return (temp!='') Название: Re: Полезные скрипты Отправлено: Anto96WS от Ноябрь 08, 2016, 20:02:12 Кое-кто не знает про оператор ИЛИ. Однако знаю. С GM8 осталась привычка разбивать сложное условие на несколько простых. Название: Re: Полезные скрипты Отправлено: Fur от Ноябрь 08, 2016, 20:05:01 Цитировать Код: if(temp >64 && temp <91 || temp >96 && temp <123 || temp >191 && temp <256){return true;} Название: Re: Полезные скрипты Отправлено: Anto96WS от Ноябрь 08, 2016, 20:10:24 Цитировать Код: if(temp >64 && temp <91 || temp >96 && temp <123 || temp >191 && temp <256){return true;} Название: Re: Полезные скрипты Отправлено: DmitryDS от Ноябрь 08, 2016, 20:18:19 Работать-то работает, а вот так ли оно работает, как должно? Скобок очсильно не хватает в выражении
Название: Re: Полезные скрипты Отправлено: Anto96WS от Ноябрь 08, 2016, 20:21:49 Работать-то работает, а вот так ли оно работает, как должно? Скобок очсильно не хватает в выражении Скорректировал. На проверке символов с клавиатуры вроде работало как надо. Добавлено: Ноябрь 08, 2016, 21:05:47 Система сообщений с выводом и плавным исчезновением. Для создания подойдут два любых пустых списка. Название: Re: Полезные скрипты Отправлено: Christopher от Ноябрь 16, 2016, 01:52:24 Простенько, но полезно, в очередной раз, лично я уже не впервые им пользуюсь и писал чисто ради экономии времени
То же самое, только в профиль, вызывает деактивацию всех обьектов, кроме того, в котором был скрипт запущен Название: Re: Полезные скрипты Отправлено: Goo от Ноябрь 16, 2016, 14:33:53 Этот скрипт уже был, я просто свою вариацию предложу
ну и еще Название: Re: Полезные скрипты Отправлено: Fur от Январь 14, 2017, 18:43:48 Плавное движение с целыми координатами при нецелых скоростях.
Простой приём, который придаёт плавности движениям, при этом сохраняя координаты объекта целочисленными. Никто не любит дробные координаты. Суть заключается в том, чтобы завести каждой координате по дополнительной переменной x_f и y_f, которые будут хранить дробную часть переменной. Когда в них накапливается 1 или -1, они передают эту единицу координате. Код: ///moveSmooth_x() x+= hspd div 1 //Двигаем объект с какой-то скоростью, предварительно лишив её дробной части. x_f+=hspd mod 1 //Сохраняем дробную часть в переменную. if abs(x_f)>=1 { var x_f_s=sign(x_f); x+=x_f_s //Прибавляем единицу, накопившуюся в дробной части. x_f-=x_f_s //И отнимаем её от самой дробной переменной. } Название: Re: Полезные скрипты Отправлено: DmitryDS от Январь 14, 2017, 20:05:18 Код: x+= hspd div 1 //Двигаем объект с какой-то скоростью, предварительно лишив её дробной части. x_f+=hspd mod 1 //Сохраняем дробную часть в переменную. floor() и frac() не проще? Название: Re: Полезные скрипты Отправлено: Fur от Январь 14, 2017, 20:40:57 Код: x+= hspd div 1 //Двигаем объект с какой-то скоростью, предварительно лишив её дробной части. x_f+=hspd mod 1 //Сохраняем дробную часть в переменную. floor() и frac() не проще? Пример: floor(-3.4)=-4 -3.4 div 1 = -3 Надо именно отбрасывать дробную часть, а не округлять. Название: Re: Полезные скрипты Отправлено: DmitryDS от Январь 14, 2017, 20:51:17 Ну да, с floor() я погорячился (хотя уверен, что видел функцию, отрывающую именно целую часть. Странно, что не могу ее найти).
Тут в основном читаемость повышается - не надо объяснять, зачем мы это делаем, поскольку функция говорит сама за себя. Название: Re: Полезные скрипты Отправлено: Goo от Апрель 12, 2017, 18:47:39 мелкие скипты, возможно у многих уже есть такие, но если нет таких, то вот тут их оставлю,
банальные конвертеры температуры Банальное сложение времени, авось кому пригодиться, в качестве аргументов вводятся как строки, так и числа Код: /// time_sum(hore1, min1, hore2, min2) // * return: array * // var h0 = argument0; var m0 = argument1; var h1 = argument2; var m1 = argument3; h0 = real(min(h0, 24)); h1 = real(min(h1, 24)); m0 = real(min(m0, 60)); m1 = real(min(m1, 60)); var a = 0; m0 = m0 + m1; a = m0 div 60; m0 -= a * 60; h1 = h0 + h1 + a; if (h1>24){h1 = h1-24} a[0] = h1; a[1] = m0; return a; Название: Re: Полезные скрипты Отправлено: Anto96WS от Июнь 27, 2017, 23:40:19 Поиск значений списка, содержащих указанные через пробел слова.
(Если перед словом поставить минус, то значения, содержащие это слово, будут исключены из результата) Возвращает список со значениями удовлетворяющими запросу. Зависимости: get_part(), find_char() из этой темы. Работоспособность: GM8, GM:S. Код: /// list_scan(id, query) var i, j, l, p, v, a, f; l =ds_list_create(); p =0; while(true) if get_part(argument1, p +1, ' ') ='' break else p+=1; if !p return l; for(i =0; i <ds_list_size(argument0); i+=1){ v =ds_list_find_value(argument0, i); a =1; for(j =1; j <=p; j+=1){ f =get_part(argument1, p, ' '); if string_char_at(f, 1) ='-' a&=!(string_pos(string_delete(f, 1, 1), v)) else a&=(string_pos(f, v)); } if a ds_list_add(l, v); } return l; Добавлено: Июнь 28, 2017, 00:22:12 Возвращает false, если точка(x, y, z) вне сферы с центром(x0, y0, z0) и радиусом r. Код: /// inSphere(x, y, z, x0, y0, z0, r) return ((sqr(argument0 -argument3) +sqr(argument1 -argument4) +sqr(argument2 -argument5)) <=sqr(argument6)) Название: Re: Полезные скрипты Отправлено: ABSOSAK от Июнь 29, 2017, 16:21:42 Скрипт изменения слоев при передвижении персонажа между обьектами 2.5D . Сортировка Z - порядок наложения.
Название: Re: Полезные скрипты Отправлено: Fur от Июнь 29, 2017, 19:58:28 Скрипт изменения слоев при передвижении персонажа между обьектами 2.5D . Сортировка Z - порядок наложения. Что это за мусор и зачем он нужен, если есть намного более простой, быстрый и функциональный depth=-y?Название: Re: Полезные скрипты Отправлено: Neo от Ноябрь 26, 2017, 01:16:19 Исправил из рекомендации (http://forum.hellroom.ru/index.php?topic=1827.msg307460#msg307460)
Скрипт для замены символа в указанной позиции: Код: ///string_replace_char_at(string, char, pos) var s, c, p; s = argument0; c = string_copy(argument1, 1, 1); //Возьмет только первый символ. p = argument2; s = string_delete(s, p, 1); s = string_insert(c, s, p); return s; Скрипт для автоматической вставки символов "#" для переноса строки при указании максимальной допустимой длины в пикселях. Код: ///string_linebreak(string, width); var str, width; str = argument0; width = argument1; var ws, lb, sl; ws = 0; // Записывает позицию нового слова lb = 0; // Записывает сколько было переносов строк sl = string_length(str); // Записывает сколько букв в строке for (var i = 0; i < sl; i ++){ // Конвертирует указанную область строки в длину в пикселях var sw = string_width( string_copy(str, 0, i) ); // Обновляем позицию нового слова, если найдено if string_char_at(str, i) == " " ws = i; // Процесс переноса строки if sw - lb mod width >= width{ lb ++; str = string_delete(str, ws, 1); str = string_insert("#", str, ws); }} return str; Название: Re: Полезные скрипты Отправлено: SilentPhil от Ноябрь 26, 2017, 06:22:01 Цитировать Скрипт для автоматической вставки символов "#" для переноса строки при указании максимальной допустимой длины в пикселях. draw_text_ext? Не могу придумать юзкейс хранения текста с переносами. Название: Re: Полезные скрипты Отправлено: Neo от Ноябрь 26, 2017, 13:05:23 Цитировать Скрипт для автоматической вставки символов "#" для переноса строки при указании максимальной допустимой длины в пикселях. draw_text_ext? Не могу придумать юзкейс хранения текста с переносами. Знаю. Мне не понравилось как эта функция работает в паре с string_copy, когда мне нужно было создать анимацию, где текст выводится постепенно: при выводе части слова оно остается на первой строке, но при полном выводе уже переносится на новую. Название: Re: Полезные скрипты Отправлено: Dmi7ry от Ноябрь 26, 2017, 13:12:48 А зачем string_replace_at? Есть же string_insert
Название: Re: Полезные скрипты Отправлено: Neo от Ноябрь 26, 2017, 14:30:05 А зачем string_replace_at? Есть же string_insert string_replace_at я делал только для замены одного символа на другой. Название для скрипта не подходящее. Проблема возникает для string_linebreak: при вставке в позицию без удаления предыдущего символа длина строки увеличится, что не будет соответствовать размеру для цикла for, что может привести к потере конечной части строки (не будет обрабатываться?)Да, можно переписать его на основе string_insert. Так даже, может, проще получится. Название: Re: Полезные скрипты Отправлено: Dmi7ry от Ноябрь 26, 2017, 15:00:47 Да, можно переписать его на основе string_insert. Я как раз про это.Код: str = string_delete(str, ws, 1); str = string_insert("#", str, ws); Название: Re: Полезные скрипты Отправлено: Fur от Ноябрь 26, 2017, 15:12:24 Название: Re: Полезные скрипты Отправлено: Dmi7ry от Ноябрь 26, 2017, 15:15:56 но внезапно вспомнил, что в гмл такого нет. Ну, если ограничиться ASCII, то можно string_set_byte_at использовать.Название: Re: Полезные скрипты Отправлено: DmitryDS от Декабрь 12, 2017, 18:38:56 Поскольку сам провозился дольше, чем следовало бы, делюсь скриптом на отражение (лучше как-то не формулируется). Вкратце: скрипт принимает направление отражающей линии и отражаемого направления и возвращает отраженное направление. Код с мини-документацией:
Код: (direction_reflect()) ///direction_reflect(mirror, dir) /*------------------------------/ Используются градусы mirror - линия, от которой будет отражен dir возвращает направление отраженной линии !!!ВСЕ НАПРАВЛЕНИЯ ВЕДУТ _ОТ_ mirror, А НЕ К!!! Чтобы получить направление к mirror, нужно добавить 180 /------------------------------*/ var mir = argument0, dir = argument1, cross = dsin(dir)*dcos(mir) - dsin(mir)*dcos(dir); //С какой стороны mir находится dir; это нужно для корректного определения нормали if sign(cross) == 1 { var n = mir + 90; } else { var n = mir - 90; } var ref = 2*n - dir; return ref; Название: Re: Полезные скрипты Отправлено: Dmi7ry от Декабрь 12, 2017, 19:24:17 Как уже говорил, угол отражения вычисляется одной строкой:
Код: var reflection = mirror + angle_difference(mirror, dir); Название: Re: Полезные скрипты Отправлено: DmitryDS от Декабрь 12, 2017, 19:29:36 Как уже говорил, угол отражения вычисляется одной строкой: Код: var reflection = mirror + angle_difference(mirror, dir); Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии. Название: Re: Полезные скрипты Отправлено: Dmi7ry от Декабрь 12, 2017, 19:43:14 Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии. Давайте возьмём поверхность 0 градусов. На неё под углом 135 градусов падает луч. Под каким углом он должен отразиться?Название: Re: Полезные скрипты Отправлено: MusNik от Декабрь 12, 2017, 20:10:44 Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии. Эээ, разве ось "симметрии" не равна оси "отражения" + 90 градусов?Название: Re: Полезные скрипты Отправлено: DmitryDS от Декабрь 12, 2017, 20:13:28 Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии. Эээ, разве ось "симметрии" не равна оси "отражения" + 90 градусов?Да это уже в чате обсудили, если кто не заметил. (И, замечу, что это верно только в половине случаев, с осью симметрии). Название: Re: Полезные скрипты Отправлено: Dmi7ry от Декабрь 12, 2017, 20:54:39 Выяснили, что результат всё-таки один и тот же. Просто мой способ не требует переворота луча, падающего на поверхность, на 180 градусов.
Название: Re: Полезные скрипты Отправлено: Slug2002 от Декабрь 29, 2017, 19:49:09 Простой скролл в RTS без использования объекта курсора.
Это лучше всего впихнуть в какой нибудь главный объект отвечающий за переменные. :gm123: Create: Код: ss=16//Скорость скролла ds=16//Отвечает за расстояние скролла. :gm126: Step: Код: if view_xview[0]>0 if mouse_x<view_xview[0]+ds or keyboard_check(vk_left) { view_xview[0]-=ss } if view_yview[0]>0 if mouse_y<view_yview[0]+ds or keyboard_check(vk_up) { view_yview[0]-=ss } if view_xview[0]<room_width-view_wview[0] if mouse_x>view_xview[0]+view_wview[0]-ds or keyboard_check(vk_right) { view_xview[0]+=ss } if view_yview[0]<room_height-view_hview[0] if mouse_y>view_yview[0]+view_hview[0]-ds or keyboard_check(vk_down) { view_yview[0]+=ss } Название: Re: Полезные скрипты Отправлено: Fur от Декабрь 29, 2017, 20:04:50 Простой скролл в RTS без использования объекта курсора. Это лучше всего впихнуть в какой нибудь главный объект отвечающий за переменные. :gm123: Create: Код: ss=16//Скорость скролла ds=16//Отвечает за расстояние скролла. :gm126: Step: Код: if view_xview[0]>0 if mouse_x<view_xview[0]+16 or keyboard_check(vk_left) {view_xview[0]-=16} if view_yview[0]>0 if mouse_y<view_yview[0]+16 or keyboard_check(vk_up) {view_yview[0]-=16} if view_xview[0]<room_width-view_wview[0] if mouse_x>view_xview[0]+view_wview[0]-16 or keyboard_check(vk_right) {view_xview[0]+=16} if view_yview[0]<room_height-view_hview[0] if mouse_y>view_yview[0]+view_hview[0]-16 or keyboard_check(vk_down) {view_yview[0]+=16 - Отсутствие какого-либо форматирования (пока-пока, читаемость кода). - Волшебные числа в коде. (самое смешное -- ты даже догадался создать переменные, но мыслительного процесса, по всей видимости, не хватило на то, чтобы использовать их в коде, лолц.) - Это настолько элементарная задача, что с таким же успехом можно сюда впихнуть код движения на стрелачки. Очень полезно, верно? Название: Re: Полезные скрипты Отправлено: AndrewVideoGames от Декабрь 29, 2017, 23:14:21 Простой скролл в RTS без использования объекта курсора. Да, с ss/ds конечно факапнулся, раз объявил, то вместо 16 вставь переменные, чтобы понятно было.Это лучше всего впихнуть в какой нибудь главный объект отвечающий за переменные. :gm123: Create: Код: ss=16//Скорость скролла ds=16//Отвечает за расстояние скролла. :gm126: Step: Код: if view_xview[0]>0 if mouse_x<view_xview[0]+16 or keyboard_check(vk_left) {view_xview[0]-=16} if view_yview[0]>0 if mouse_y<view_yview[0]+16 or keyboard_check(vk_up) {view_yview[0]-=16} if view_xview[0]<room_width-view_wview[0] if mouse_x>view_xview[0]+view_wview[0]-16 or keyboard_check(vk_right) {view_xview[0]+=16} if view_yview[0]<room_height-view_hview[0] if mouse_y>view_yview[0]+view_hview[0]-16 or keyboard_check(vk_down) {view_yview[0]+=16 Название: Re: Полезные скрипты Отправлено: Neo от Февраль 19, 2018, 02:26:10 Набросал грубый скрипт, что позволит получить угол грани у объекта.
Код: ///collision_get_angle(x, y, angle, lenght, object, prec, notme) ~В GM не нашел что-то, что позволяет работать с векторами. С фикстурой тоже не нашел ничего подходящего.var xx, yy, angle, lenght, steps, obj, prec, notme; xx = argument0; // X позиция коллизии yy = argument1; // Y позиция коллизии steps = 18; // Шагов (360 / 20); angle = round(argument2 / steps) * steps; // Округляем значение угла lenght = argument3; // Длина сенсоров obj = argument4; // Искомый объект prec = argument5; // Точная маска notme = argument6; // Исключить вызывающий экземпляр var step = 360 div steps; // Текущий шаг, выраженный в значении угла var x1, y1, x2, y2; // Коодинатые точки вершин сенсоров x1 = xx - dcos(angle) * lenght; y1 = yy - dsin(angle) * lenght; x2 = xx - dcos(angle) * lenght; y2 = yy + dsin(angle) * lenght; var angle1, angle2; // Собственные значения угла для каждого сенсора angle1 = 0; angle2 = 0; // Первый сенсор полуокружности while (angle1 < 180){ var c1; x1 = xx - dcos(-angle + angle1) * lenght; y1 = yy - dsin(-angle + angle1) * lenght; c1 = collision_point(floor(x1), floor(y1), obj, prec, notme); if c1 == noone angle1 += steps else break;} // Второй сенсор полуокружности while (angle2 < 180){ var c2; x2 = xx - dcos(angle + angle2) * lenght; y2 = yy + dsin(angle + angle2) * lenght; c2 = collision_point(floor(x2), floor(y2), obj, prec, notme); if c2 == noone angle2 += steps else break;} return floor(point_direction(x1,y1,x2,y2)); ~~Мне кажется, что это можно доработать... Как уже говорил, угол отражения вычисляется одной строкой: Код: var reflection = mirror + angle_difference(mirror, dir); Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии. Код: ///vector_reflect(vector_angle, planar_angle) var a, b, c; a = argument0; b = argument1; c = b - (angle_difference(a, b)); return(c); Название: Re: Полезные скрипты Отправлено: Goo от Февраль 19, 2018, 09:41:03 Особо не вникал в работу скрипта (и увы не проверял его на практике),
но что-то мне подсказывает что если тут 2 минуса Код: x1 = xx - dcos(-angle + angle1) * lenght; y1 = yy - dsin(-angle + angle1) * lenght; то тут, должно быть 2 плюса Код: x2 = xx - dcos(angle + angle2) * lenght; y2 = yy + dsin(angle + angle2) * lenght; Если я не прав, поправь меня. Название: Re: Полезные скрипты Отправлено: Neo от Февраль 19, 2018, 13:57:57 Особо не вникал в работу скрипта (и увы не проверял его на практике), Перепроверил. Вроде правильно.но что-то мне подсказывает что если тут 2 минуса Код: x1 = xx - dcos(-angle + angle1) * lenght; y1 = yy - dsin(-angle + angle1) * lenght; то тут, должно быть 2 плюса Код: x2 = xx - dcos(angle + angle2) * lenght; y2 = yy + dsin(angle + angle2) * lenght; Если я не прав, поправь меня. Вершины сенсоров создаются за + 180 от указанного значения угла. Один из сенсоров перемещается на 180 градусов по часовой, второй против часовой до тех пор, пока не обнаружат столкновение. За место collision_ можно использовать тот же place_ при желании. Не знаю что лучше будет использовать. Название: Re: Полезные скрипты Отправлено: Goo от Февраль 19, 2018, 16:25:16 Да все верно, проверил.
Да и если приглядется Код: x1 = xx - dcos(angle) * lenght; y1 = yy - dsin(angle) * lenght; x2 = xx - dcos(angle) * lenght; y2 = yy + dsin(angle) * lenght; {-;-;-;+} Код: x1 = xx - dcos(-angle + angle1) * lenght; y1 = yy - dsin(-angle + angle1) * lenght; x2 = xx - dcos(angle + angle2) * lenght; y2 = yy + dsin(angle + angle2) * lenght; тоже {-;-;-;+}, я просто не сразу заметил, ну а там из-за симметрии функций... и т. д. Название: Re: Полезные скрипты Отправлено: S_Kleer от Август 02, 2018, 20:15:26 Скрипт, который возвращает позицию и индекс вертикального, равностороннего по высоте и ширине гексагона. Подойдёт для игр с гексагональной картой.
Не уверен, что код самый правильный, но он работает. Проверял на гексагонах размером 64х64 и 32х32. Объявляем макросы: Код: (macro) #macro HEX_W 32 // 32 ширина гексагона, можно использовать sprite_get_width #macro HEX_PART (HEX_W / 4) // Четверть высота гексагона, для проверок двух верхних углов #macro HEX_H (HEX_W - HEX_PART) // Высота гексагона (Полная ширина минус четверть) #macro HEX_W_HALF (HEX_W / 2) // Половина ширины гексагона (пригодится для смещений) Сам скрипт: Код: (mouse_hex) /// @desc Возвращает индекс и позицию гексагона // Представляем координаты курсора в виде индексов var mx = mouse_x div HEX_W; var my = mouse_y div HEX_H; // Смещение var off_x = 0; // Если каждая вторая строка чётная, то смещаем координаты на половину ширины гексагона if my mod 2 = 1 { off_x = HEX_W_HALF; mx = (mouse_x + off_x) div HEX_W; } // Обновляем координаты текущего гексагона mx = mx * HEX_W - off_x; my = my * HEX_H; // Если курсор в левом верхнем углу, то смещаем координаты гексагона влево вверх if point_in_triangle(mouse_x, mouse_y, mx, my, mx + HEX_W_HALF, my, mx, my + HEX_PART) { mx = mx - HEX_W_HALF my = my - HEX_H } // Если курсор в правом верхнем углу, то смещаем координаты гексагона вправо вверх if point_in_triangle(mouse_x, mouse_y, mx + HEX_W_HALF, my, mx + HEX_W, my, mx + HEX_W - 1, my + HEX_PART) { mx = mx + HEX_W_HALF; my = my - HEX_H; } // Возвращаем индекс и позицию гексагона return [mx div HEX_W, my div HEX_H, mx, my]; Пример использования: Код: var result = mouse_hex(); // Индексы гексагона hex_i = result[0]; hex_j = result[1]; // Координаты гексагона hex_x = result[2]; hex_y = result[3]; // При нажатии лкм, ставим на карту лес if mouse_check_button_pressed(mb_left) { map[hex_i, hex_j] = 5; // Допустим 5 - это лес } // Рисуем гексагональный курсор точно на клетке draw_sprite(s_cursor, 0, hex_x, hex_y); Код заточен под GMS2, но его несложно переделать под другие версии. Название: Re: Полезные скрипты Отправлено: Goo от Сентябрь 30, 2018, 21:03:20 срипт "складываюший" два списка
0 - аргумент основной лист, 1 - лист добавляемый в конец первого, 2 - если == false, изменяем 1-й лист, добавляя 2-й в конец если == true, создаем новый лист, являющийся их суммой, не меняя содержимое исходных Код: /// ds_list_plus_list(main_list, sourse_list, change[boolean]) // return ds_list var l = argument0; var s = argument1; var c = argument2; if !ds_exists(l, ds_type_list) show_error("data structure is not exists", 1); if !ds_exists(s, ds_type_list) show_error("data structure is not exists", 1); var z = undefined; if c { z = ds_list_create(); ds_list_copy(z, l); } for (var i = 0; i < ds_list_size(s); i++) { var v = s[| i]; if is_undefined(v) continue; if !c ds_list_add(l, v); else ds_list_add(z, v); } if c return z; return l; Добавлено: Сентябрь 30, 2018, 21:16:08 пожалуй можно и так Код: /// ds_list_plus_list(main_list, sourse_list, change[boolean]) // return ds_list var l = argument0; var s = argument1; var c = argument2; if !ds_exists(l, ds_type_list) show_error("data structure is not exists", 1); if !ds_exists(s, ds_type_list) show_error("data structure is not exists", 1); var z = l; if c { z = ds_list_create(); ds_list_copy(z, l); } for (var i = 0; i < ds_list_size(s); i++) { var v = s[| i]; if is_undefined(v) continue; ds_list_add(z, v); } return z; Добавлено: Ноябрь 23, 2018, 17:32:20 скрипт сравнивающий строки... возвращает массив. 0-й индекс - степень сравнения. 1-й количество схожих символов если строки не равны возвращает 0 - не равны 0 - схожих символов если строки равны частично возвращает 1 - частично равны n - схожих символов если строки равны целиком 2 - целиком равны длина сравниваемых строк - схожих символов Код: #macro NOT_EQUALLY 0 #macro NEARLY_EQUAL 1 #macro EQUALLY 2 #macro COMPARISON_VALUE 0 #macro INDEX 1 Код: /// string_compare(str, str1) // return: array var str_0 = argument0; var str_1 = argument1; var cmp_val = NOT_EQUALLY; var arr_for_ret = array_create(2); var str_len_0 = string_length(str_0); var str_len_1 = string_length(str_1); var str_len = min(str_len_0, str_len_1); var i; for (i = 1; i < str_len + 1; i++;) { var char_0 = string_char_at(str_0, i); var char_1 = string_char_at(str_1, i); if char_0 != char_1 break; cmp_val = NEARLY_EQUAL; } if cmp_val && (i - 1 == str_len) { if str_len_0 == str_len_1 { cmp_val = EQUALLY; } } arr_for_ret[COMPARISON_VALUE] = cmp_val; arr_for_ret[INDEX] = i - 1; return arr_for_ret; Название: Re: Полезные скрипты Отправлено: SilentPhil от Ноябрь 23, 2018, 19:14:43 Для сравнения строк хорошо использовать алгоритм расстояние Ливенштейна. Даже реализовал его на гм8 в прошлом веке.
Название: Re: Полезные скрипты Отправлено: Neo от Июль 12, 2019, 12:49:44 Лучше названия не придумал. Скрипт возвращает значение 1 если находится между минимум и максимум и 0 если на границах. С плавающей точкой, разумеется.
Код: ///rise_fall(value, min, max); var min_, max_, val_; min_ = argument1; max_ = argument2; val_ = clamp(argument0, min_, max_); var s, m, l; s = max_ - min_; m = s div 2; v = val_ - min_; l = 1 - (abs((m - v) * 2) / s); return l; Следующий скрипт рисует линию с прозрачностью на границах. Работает в паре с скриптом выше. Код: ///draw_line_alpha_rise_fall(x1, y1, x2, y2); Можно было проще, ну так получилось...var x1, y1, x2, y2; x1 = argument0; y1 = argument1; x2 = argument2; y2 = argument3; var lx, ly, sx, sy, ii; ii = 2; lx = (x2 - x1); ly = (y2 - y1); sx = lx / ii; sy = ly / ii; draw_primitive_begin(pr_linestrip); for (var i = 0; i <= ii; i ++){ var xx, yy, alpha; xx = x1 + sx * i; yy = y1 + sy * i; alpha = rise_fall(i, 0, ii); draw_set_alpha(alpha); draw_vertex(xx, yy);} draw_primitive_end(); draw_set_alpha(1); return true; Добавлено: Август 14, 2019, 21:52:20 Простой скрипт смешивает каналы двух цветов. Канал смешиваемого цвета необходимо получить функцией color_get_red/green/blue соответственно. Код: ///merge_channel(channel a, channel b, amount) //amount- насколько тот или иной цвет должен быть смешан. Значения от 0 до 1.0 var a, b; a = argument0 * argument2; b = argument1 * (1 - argument2); return a + b; Название: Re: Полезные скрипты Отправлено: SilentPhil от Август 15, 2019, 07:32:29 Lerp же делает то же самое.
Название: Re: Полезные скрипты Отправлено: Neo от Август 15, 2019, 12:12:22 Упс, не подумал. Надо было сначала искать другое решение, как всегда.
Название: Re: Полезные скрипты Отправлено: Aristokrat952 от Август 15, 2019, 12:25:43 Упс, не подумал. Надо было сначала искать другое решение, как всегда. На минус напрашиваешься? |