Сюда выкладываем макросы, или вспомогательные функции, состоящие из других функций. Взрыв
function explosion(x, y, times, spd) local times = times or 1 local spd = spd or 0 for i=0, times-1 do pushcmd(function() actor("user_object", x, y, {name="exploder"}); damage(100, "exploder") end, 0+i/100*spd) end end x, y - координаты взрыва times(опционально) - количество взрывов spd(опционально) - время между взрывами в миллисекундах. Применение: explosion(16*32, 12*32, 5, 20) -- бомбардировка по клетке 16-12. explosion(16*32, 12*32, 5, 0) -- мгновенный сильный взрыв по клетке 16-12. explosion(16*32, 12*32) -- единичный взрыв.
function bombard(x1, y1, x2, y2, times, spd, explo, explospd) times = times or 24 spd = spd or 15 explo = explo or 1 explospd = explospd or 0 local pixx = (x2-x1)/times local pixy = (y2-y1)/times for i=0, times-1 do pushcmd(function() explosion(x1+pixx*i, y1+pixy*i, explo, explospd) end, 0+i/100*spd) end end x1, y1 - это координаты начала бомбардировки. x2, y2 - это координаты конца бомбардировки. times(опционально) - это сколько точек взрыва будет сделано. spd(опционально) - это как быстро будет проходить бомбардировка всех точек. explo(опционально) - это сколько раз будет взрыв в каждой точке. explospd(опционально) - это промежуток между взрывами в миллисекундах. Применение:
-- это четыре волны взрывов с промежутками в секунду, -- пересекающих весь экран 32*24 клеток. -- Точка взрыва - каждая клетка. bombard(0, 0, 32*32, 24*24, 32, 10, 4, 100)
-- это бомбардировка каждой второй клетки, пересекающая наискосок -- зону 32*24 клетки. Сила взрыва - четыре обычных взрыва. bombard(0, 0, 32*32, 24*32, 16, 20, 4)
-- это взрыв каждой половины клетки по горизонтали посередине экрана. -- Сбрасываются 64 бомбы каждые полсекунды. -- Количество взрывов на полклетки - 10. -- Кстати, за этими скучными словами скрывается туча огня. bombard(0, 12*32, 32*32, 12*32, 64, 100, 10, 20)
Описание: Бомбардировка случайных точек на полигоне с координатами x1. y1, x2, y2 определенное время. Требует: - макросы explosion и bombard - версию 1.41a1 и выше(поддержка библиотеки math) Взрыв полигона
function dangerzone(x1, y1, x2, y2, time, spd, islinear, linspd) time = time or 500 spd = spd or 500 islinear = islinear or 0 linspd = linspd or math.random(5, 20) if islinear==0 then local i=time/spd for q=0, i-1 do pushcmd(function() rx = math.random(x1*32, x2*32) ry = math.random(y1*32, y2*32) explosion(rx, ry) end, spd*q/100) end end if islinear==1 then local i=time/spd for q=0, i-1 do pushcmd(function() local rx1 = math.random(x1*32, x2*32) local rx2 = math.random(x1*32, x2*32) local ry1 = math.random(y1*32, y2*32) local ry2 = math.random(y1*32, y2*32) bombard(rx1, rx2, ry1, ry2, linspd, spd) end, spd*q/100) end end end` x1, y1 - координаты верхней левой точки целевого полигона. Измеряются В КЛЕТКАХ! x2, y2 - координаты нижней правой точки целевого полигона. Измеряются В КЛЕТКАХ! time(опционально) - время, в течение которого будут происходить взрывы. ВАЖНО: тут просчет ведется по времени, а не по кол-ву взрывов. Имейте это в виду при применении данного макроса. spd(опционально) - интервал между взрывами, в мс. isline(опционально) - проверка, отвечающая за тип взрывов(бомбардировка(1) или одиночные(0)). Изначально - 0, т.е. одиночные. linspd(опционально) - скорость бомбардировки. Задействуется только, если включен бомбардировочный режим. Применение: dangerzone(0, 0, 32, 24, 300, 10, 1) -- 3-секундная бомбардировка в 30 линий, -- которые идут со случайной скоростью от 20/100 до 5/100 секунды на взрыв.
dangerzone(0, 0, 32, 24, 10000) -- 100-секундная бомбардировка -- по случайным точкам всей карты 32*24. -- Интервал между взрывами - 20мс.
а еще надо сделать редактирование ВСЕХ параметров оружия вплоть до разлета и скорости атаки. тогда можно будет реализовать пулемет вулкан, просто по нажатию запуская таймер и каждое определенный промежуток времени увеличивать скорость атаки и разлет. и сразу необходимо будет сделать функции типа: onMouseover только для клавы, т.е. по нажатию один скрипт, по отпусканию кнопки другой.
Описание: создает предмет num на x, y, приводя тому свойства param. Создать
function create(num, x, y, param) local a = {"crate", "pu_booster", "pu_health", "pu_mine", "pu_shield", "pu_shock", "respawn_point", "spotlight", "turret_cannon", "turret_gauss", "turret_minigun", "turret_rocket", "user_object", "wall_brick", "wall_concrete", "water", "weap_autocannon", "weap_bfg", "weap_cannon", "weap_gauss", "weap_minigun", "weap_plasma", "weap_ram", "weap_ripper", "weap_rockets", "wood"} param = param or {} actor(a[num], x, y, param) end num - номер предмета. x - координаты создаваемого предмета по x y - координаты создаваемого предмета по y param - параметры создаваемого предмета
Описание: создает times предметов со случайными номерами от diapazone1 до diapazone2 на случайных клетках на площади между x1, y1, x2, y2. Придает предметам параметры param. Требует: - макрос create; - библиотеку math. Залить
function fill(x1, y1, x2, y2, diapason1, diapason2, times, param) local times1=times or (x2-x1)*(y2-y1)/32-math.random((x2-x1)*(y2-y1)/128) if times1>0 then local rx=math.random(x1, x2)*32+16 local ry=math.random(y1, y2)*32+16 local ritem=math.random(diapason1, diapason2) create(ritem, rx, ry, param) fill(x1, y1, x2, y2, diapason1, diapason2, times1-1) end end x1, y1, x2, y2 - координаты зоны. diapason1, diapason2 - первый и последний дозволенные номера. times - кол-во создаваемых предметов. param - параметры создаваемого предмета
hmh функцию create можно написать немного покороче. Вместо кучи if'ов:
function create(num, x, y, param) local a = {"crate", "pu_booster", "weap_bfg"}[num] -- и остальные предметы сюда же actor(a, x, y, param) -- здесь не обязательно проверять param на nil end
И еще пара замечаний: - всё, что можно вызвать напрямую, надо вызывать напрямую, а не через pushcmd - все переменные по умолчанию глобальные, поэтому их надо объявлять как local
Отправлено: 29.09.09 11:28. Заголовок: В файлы формата .lua..
В файлы формата .lua в папке campaign. Открываешь Блокнотом и пишешь в самом начале. Вызываются они функцией, на которую записаны, то есть, к примеру, explosion(16*32, 12*32) где-нибудь в тексте.
Отправлено: 22.10.09 22:21. Заголовок: VIRUS Надо вставить ..
VIRUS Надо вставить макрос(то есть строки от function и до последнего end) куда-нибудь в начало кампании, потом дальше по кампании вызвать функцию, добавленную макросом. Если над макросом написано, что он требует другой макрос, надо вставить требуемый макрос до требующего. То есть бомбардировку вставить надо так:
цитата:
function explosion(x, y, times, spd) local times = times or 1 local spd = spd or 0 for i=0, times-1 do pushcmd(function() actor("user_object", x, y, {name="exploder"}); damage(100, "exploder") end, 0+i/100*spd) end end
function bombard(x1, y1, x2, y2, times, spd, explo, explospd) times = times or 24 spd = spd or 15 explo = explo or 1 explospd = explospd or 0 local pixx = (x2-x1)/times local pixy = (y2-y1)/times for i=0, times-1 do pushcmd(function() explosion(x1+pixx*i, y1+pixy*i, explo, explospd) end, 0+i/100*spd) end end
Отправлено: 22.10.09 22:31. Заголовок: Тоесть если не встав..
Тоесть если не вставить это:
цитата:
function explosion(x, y, times, spd) local times = times or 1 local spd = spd or 0 for i=0, times-1 do pushcmd(function() actor("user_object", x, y, {name="exploder"}); damage(100, "exploder") end, 0+i/100*spd) end end
То не сработает это:
цитата:
function bombard(x1, y1, x2, y2, times, spd, explo, explospd) times = times or 24 spd = spd or 15 explo = explo or 1 explospd = explospd or 0 local pixx = (x2-x1)/times local pixy = (y2-y1)/times for i=0, times-1 do pushcmd(function() explosion(x1+pixx*i, y1+pixy*i, explo, explospd) end, 0+i/100*spd) end end
function explosion(x, y, times, spd) local times = times or 1 local spd = spd or 0 for i=0, times-1 do pushcmd(function() actor("user_object", x, y, {name="exploder"}); damage(100, "exploder") end, 0+i/100*spd) end end
А можно написать function explosion(position,nameo)
function user.print(text,x,y,name,font) local size=0.45 if font==nil then font='font_default' else size=0.2 end local curx,cury; local n=0; if name==nil then name="" n="" end local t = string.gsub(text, "([^<])", function(ch) if curx == nil or cury==nil then curx=x cury=y if x==nil or y==nil then message('введите правильно user.print(\'текст\',расстояние_между_символами,начало_по_х,по_у,имя)') end end if name~="" then n=n+1 end actor('user_sprite',((curx-1) * 32) + 16,((cury-1) * 32) + 16,{name=name.."dot"..n, texture=font, frame=symbols[ch]}) curx=curx+size end)
end
function user.erase(name) local n=1
while (exists(name.."dot"..n)) do kill(name..n) n=n+1 end
end --------примеры использования--------- user.print('Тестовая фраза 1: Эх, взъярюсь, толкну флегматика: дал бы щец жарчайших, Пётр!',10,18,'text2') user.print('Тестовая фраза small text: Эх, взъярюсь, толкну флегматика: дал бы щец жарчайших, Пётр!',10,18.5,'text4','font_small') user.print('Тестовая фраза 3: The quick brown fox jumps over the lazy dog. !@$#$^*&*()~',10,19,'text5','font_small') user.print('Тестовая фраза 2: Хрюкнул ёж <Тыща>, а ведь село Фершампенуаз - это центр Нагайбакского района Челябинской области.',10,17,'text') user.print('Тестовая фраза 3: The quick brown fox!@$#$^*&*()~ jumps over the lazy dog.',10,16,'text3')
функция user.print выводит в правую сторону от заданной точки x,y любой текст user.print(текст,точка_х,точка_y,название_для_этого_текста,шрифт) шрифт по умолчанию font_default, но есть еще font_small он намного мельче, как в message() и удаление через user.erase(название_для_этого_текста)
В умелых руках это можно использовать где угодно: реализовать чат между ботами, создать говорливых NPC, выводить по 100 разных месагов в минуту и т.д. font_default шрифт намного лучше воспринимается чем те которыми выводятся сообщения через message() . На моем 1280х1024 message() сообщения можно и не заметить
Отправлено: 07.01.12 12:52. Заголовок: Сегодня работал над ..
Сегодня работал над созданием случайных пушек и над отключением прицеливанием мышкой. В первом проблема от незнания, а во втором нужно как-то обновить профиль без входа в опции. Пока ничего нет, буду в исходниках ковыряться...
Вспомнив геометрию, написал универсальную функцию передвижения объектов в любом направлении:
function move(name, x, y, valueType, speed) x1, y1 = position(name) x2 = x y2 = y if valueType == 'grid' then x2 = x2*32-16 y2 = y2*32-16 end xKatAB = math.abs(x1 - x2) yKatOA = math.abs(y1 - y2) GipOB = math.sqrt((xKatAB * xKatAB) + (yKatOA * yKatOA)) if x1 < x2 and y1 < y2 then for i=1, GipOB do pushcmd( function() setposition(name, x1+i*(xKatAB/GipOB), y1+i*(yKatOA/GipOB)) end, i/speed) end end if x1 > x2 and y1 > y2 then for i=1, GipOB do pushcmd( function() setposition(name, x1-i*(xKatAB/GipOB), y1-i*(yKatOA/GipOB)) end, i/speed) end end if x1 > x2 and y1 < y2 then for i=1, GipOB do pushcmd( function() setposition(name, x1-i*(xKatAB/GipOB), y1+i*(yKatOA/GipOB)) end, i/speed) end end if x1 < x2 and y1 > y2 then for i=1, GipOB do pushcmd( function() setposition(name, x1+i*(xKatAB/GipOB), y1-i*(yKatOA/GipOB)) end, i/speed) end end end
Все даты в формате GMT
3 час. Хитов сегодня: 6
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет