Автор | Сообщение |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 20.12.07 23:00:57 | |
| Nil : | Просто повесте ACS_Execute в качестве экшена у монстра и он вызовется после смерти. |
Не катит. Мне ж не нужно чтобы после смерти каждого демона вызывался какой-то скрипт. Это только для особых монстров годится, для боссов например. | |
|
1 |
5 |
2 |
|
|
| |
nprotect = Colonel =
| 2546 |
Doom Rate: 1.48
|
Отправлено: 21.12.07 08:54:13 | |
| Shadowman
да нормально же, это скрипт проверки просто будет, и не надо загружать проц и проверять каждую секунду | |
|
| |
Nil = 1st Lieutenant =
| 1402 |
Doom Rate: 1.79
|
Отправлено: 21.12.07 14:21:24 | |
| Может, создать тему "Мастер класс скриптинга" и писать туда большие статьи со скриншотами и вадами-примерами? а прозьбы создать статью "по мотивам" в эту тему постить? Я действительно готов писать статьи | |
|
1 |
1 |
1 |
|
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 21.12.07 14:32:15 | |
| Nil : | Может, создать тему "Мастер класс скриптинга" |
Давай пока ограничимся этой темой про скрипты. Сюда пиши и статьи, и примеры А плодить кучу тем по одним скриптам ни к чему, тем более понятие "мастер-класс" скриптинга - весьма относительное.
Для кого-то может скрипт подсчета отспавненных зверюг - тоже мастер-класс, а кому-то это раз плюнуть:)
Или ты хочешь привесить скрипты с библиотеками ACS? Вот библиотеки - это действительно Мастер-класс! Еще не приходилось с ними работать и я толком не понимаю, как это все там делается... | |
|
1 |
5 |
2 |
|
|
| |
Furret = Master Corporal =
| 365 |
Doom Rate: 2.19
|
Отправлено: 21.12.07 14:55:42 | |
| Может быть кому полезно будет.
Если нужно найти процедуру, обладающую определённым свойством, то не обязательно лезть в Zdoom Wiki. Тем более не все содержащиеся там срипты может скомпилить Билдер. Пример: Scroll_Texture_Down.
Что предлагаю я? Можно открыть файл ASC.CFG в директории Билдера и пройтись по нему поиском. Дапустим нужно найти процедуру, меняющую текстуру на лайндэфе. Ищем "Texture", читая по-английски пытаемся понять, то ли это. Находим строчку:
| SetLineTexture = "SetLineTexture(line, side, position, texture)"; |
Очевидно, что это и будет то, что нам надо. Такой скрипт Билдер точно примет и скомпилит.
Я всегда их так и ищу. | |
|
| |
Nil = 1st Lieutenant =
| 1402 |
Doom Rate: 1.79
|
Отправлено: 21.12.07 15:05:35 | |
| Furret, ну не на уровне процедур же А на уровне целых задач, а то и методов. Ест идеи, может, скоро чего напишу | |
|
1 |
1 |
1 |
|
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 21.12.07 15:17:33 | |
| Furret
А еще проще скачать Doom Builder ACS Configuration - есть в Вике - распечатать этот файл и положить на стол рядом с компом. Если нужен какой-то скрипт - смотрим туда. Если непонятно, что он делает (или что означают его параметры) - тогда уже глядим в вики. Я например так и делаю
Nil : | Ест идеи, может, скоро чего напишу |
Ок, ждем статью. Только предварительно уведоми, о чем будешь писать | |
|
1 |
5 |
2 |
|
|
| |
Furret = Master Corporal =
| 365 |
Doom Rate: 2.19
|
Отправлено: 21.12.07 15:27:31 | |
| Shadowman : | А еще проще скачать Doom Builder ACS Configuration |
Да и скачивать не надо. Это ТО ЖЕ САМОЕ, что и упомянутый мною ASC.CFG! (открыть Блокнотом)
Когда я маплю, он у меня всегда открыт. | |
|
| |
nprotect = Colonel =
| 2546 |
Doom Rate: 1.48
|
Отправлено: 21.12.07 16:42:48 | |
| Furret : | что и упомянутый мною ASC.CFG! (открыть Блокнотом) |
твой расчудесный конфиг не дает ни описания параметров, ни даже самого описания функции. здум вики в этом плане гораздо более информативен, и если требуется не просто вспомнить синтаксис, а именно прочитать все про оператор, нужно лезть в вики. с этим SetLineTexture итак все понятно, а вот растолкуй-ка по "конфигу" такую функцию:
Ceiling_CrushRaiseAndStaySilA = "Ceiling_CrushRaiseAndStaySilA(tag, dspeed, uspeed, crush)";
боюсь, что без википедии тут не обойтись, вот для чего спрашивается вики делали, чтоб программерам не пришлось гадать на кофейной гуще и на конфигах | |
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 22.12.07 00:46:18 | |
| Кстати, насчет википедии. Не всегда она верно отражает действительность... или у меня билдер кривой, короче - вот описание скрипта Scroll_Floor как оно дано в вике:
http://zdoom.org/wiki/Scroll_Floor
А вот при попытке сделать такой скрипт, билдер выдает совсем другой набор параметров:
Scroll_Floor(tag, scrollbits, method xmove, ymove)
Причем между method и xmove нет запятой, хотя по идее должна быть. Далее, не ясно, что есть method - это type как в вике? или что-то иное? Попытка насильно вбивать 5 параметр успеха не приносит - ACS отказывается компилить такой скрипт. Как можно решить проблему? | |
|
1 |
5 |
2 |
|
|
| |
Nil = 1st Lieutenant =
| 1402 |
Doom Rate: 1.79
|
Отправлено: 22.12.07 00:49:13 | |
| Shadowman, рекомендую скачать последнюю версию ACS
Есть на Zdoom.org | |
|
1 |
1 |
1 |
|
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 22.12.07 01:57:58 | |
| Nil, а все, разобрался
У меня ACS.cfg в билдере неправильную подсказку давал, я его отредактировал так, как надо и теперь скрипт работает... и меня не вводит в заблуждение
Furret
Так что хоть этот файл и хорош, но иногда и он может обмануть... | |
|
1 |
5 |
2 |
|
|
| |
Nil = 1st Lieutenant =
| 1402 |
Doom Rate: 1.79
|
Отправлено: 25.12.07 17:06:14 | |
| Кстати, я, кажется, понял, зачем вы смотрели в блокнот... Чтобы узнать названия функций? тогда лучше нажать ctrl+пробел в редакторе. работает в DB и SlumpEd | |
|
1 |
1 |
1 |
|
|
| |
Gucha = Sergeant =
| 479 |
Doom Rate: 1.35
|
Отправлено: 30.12.07 11:23:47 | |
| Выложите скрипты для работы с текстом различные.
*Например простой вывод
*Вывод с заголовком другого цвета и размера
*Вывод побуквенно.
Но не просто скрипты, а функции где тока текст ввести и эту функцию можно было в других скриптах юзать.
В частности 2 последних штуки мне бы щас для одного небольшого вадика не помешали) | |
|
| |
nprotect = Colonel =
| 2546 |
Doom Rate: 1.48
|
Отправлено: 30.12.07 11:35:25 | |
| Gucha
посмотри в Zdoom Community Project 1, там много примеров | |
|
| |
Memfis - Sergeant Major -
| 665 |
Doom Rate: 1.71
|
Отправлено: 30.12.07 12:00:23 | |
| В Simplicity есть отличный пример реализации побуквенного вывода названия уровня в начале игры.Насколько я помню, там именно функцией - Спорк написал её в acs-файл, потом просто инклудит в скрипт-эдиторе в каждом уровне и использует. | |
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 10.01.08 19:01:37 | |
| Как можно активировать скрипт, заходя в нужный сектор, но находясь при этом на 2 "этаже" (3дполу)? Другими словами, запретить скрипту активироваться, если игрок на 1 этаже (на естественном полу сектора)? | |
|
1 |
5 |
2 |
|
|
| |
Eternal = UAC Marshal =
| 3366 |
Doom Rate: 1.93
|
Отправлено: 10.01.08 19:03:03 | |
| Shadowman
Я бы тупо поставил шмотку подбираемую на втором этаже и на неё повесил скрипт. Это вроде на поверхности лежит. | |
|
1 |
2 |
2 |
|
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 10.01.08 19:10:21 | |
| Eternal
Хорошее решение, хоть и не универсальное. В данном случае думаю прокатит. | |
|
1 |
5 |
2 |
|
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 10.01.08 22:37:20 | |
| Еще бы не помешал универсальный скрипт, который с определенными вероятностями выполняет некоторые действия. То есть сперва включается скрипт а дальше он уже вероятностно перебирает внутри себя то, что записал (с вероятностью Х делать одно, с вероятностью У другое и т.д.)
например - рандомно телепортировать вещь в одну из точек на карте. | |
|
1 |
5 |
2 |
|
|
| |
Nil = 1st Lieutenant =
| 1402 |
Doom Rate: 1.79
|
Отправлено: 11.01.08 00:03:48 | |
| Shadowman, а что тебе мешает написать такую функцию функцию? | |
|
1 |
1 |
1 |
|
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 11.01.08 00:08:38 | |
| Nil : | что тебе мешает написать такую функцию |
То что я не умею работать с функциями в ACS... Если ты знаешь, как это делается, может объяснишь в этой теме, с примерами. Ты ж вроде собирался статью по ACS тут, было бы весьма кстати... | |
|
1 |
5 |
2 |
|
|
| |
Nil = 1st Lieutenant =
| 1402 |
Doom Rate: 1.79
|
Отправлено: 15.01.08 01:21:55 | |
| Итак, немного информации о функциях!
1. Зачем функции нужны
Функции нужны, чтобы не писать один и тот-же код много раз.примером функии служит, например, функция Вывода строки. стандартный print убог, вым нужна альтернатива? вы можите сделать такую функцию!
2. Ограничения
Сразу скажу, что в функциях нельзя делать.
1)Ждать. недопустимы Delay, TagWait, ScriptWait и все прочие.
2)создавать бесконечные циклы вроде
while (true)
{
print(s:"Правда я самый умный?");
}
3 и главное. Как их создавать
Любая функция начинается с заголовка. он состоит из 4 частей :
1)слово function
2)тип возврашаемого результата. Лубая функция может вернуть какое-нибудь значение. например, результатом гипотетической функции sin(x) будет значение синуса угла x.
Всего существует 3 типа значений :
Числа - int
Строки - str
ничего - void. если функця ничего не возврашает, то надо использовать этот тип.
есть ещё тип bool, но он равносилен типу int, ничем от него не отличаясь. использовать его не следует, т.к. неизвестно, оставят ли его, ведь его полезность под сомнением.
3)Имя функции. Естейственно, без пробелов и киррилицы.
4)Аргументы. Аргументы функции перечисляются в круглыс скобках через запятую в таком порядке : Тип, имя. например :
function int SamplieFunction(int x,int y,str String)
Где :
int - тип возврашаемого значения. Эта функция возврашает значение с типом int
SamplieFunction - Имя функции.
(int x,int y,str String) - аргументы(3 шт).
Эту функцию следует вызывать вот так
...
str Teststring = "Пример";
int A = strlen(Teststring);
int B = 10;
int C = SamplieFunction(A,B,""); <---
...
После строки c "<---" управдение будет передано в функцию. Внутри функции переменная x будет иметь значение 6, y - 10, а String - "" (Пустая строка).
Изменение переменных x и y никак не отразится на переменных A,B.
Если функция возвращает значение, то в ней обязательно должа быть конструкция
return XXX
, где XXX - значение. может быть константой, например Return 2, или переменной, например "Return x+y"
Тип значения указывается в заголовке функции (2). Все ветки выполнения функции должны содержать return, например :
function int Test1 (int x,y)
{
if (x>0)
return y;
else
return y-x;
}
сравните:
function int Test2 (int x,y)
{
if (x>0)
return y;
else print("Ошибка!");
}
Какое значение должна вернуть функция, если x<=0? не указанно. это можно исправить, добавив return 0 в конец.
Выполнение функции заканчивается, как только выполнение дойдёт до return. После чего значение будет возвращено в вызвавший скрипт :
int a = test1(-10,20); //В а будет 30
Итак, когда-же следует использовать функции? Вот даю конкретный пример
function void TextOut(str text)
{
SetFont("rus1");
int holdtime = (strlen(text) / 10) + 1;
MsgDelay = holdtime *35;
HudMessage(s:text;HUDMSG_PLAIN,120,CR_UNTRANSLATED,0.5,0.3,holdtime<<16);
}
Довайте разбирать по-порядку. Название функции - 'TextOut'. Она не возврашает значение, поэтому return быть не обязан. у функции 1 параметр - строка.
Внутри функции устанавливается шрифт и вызывается встроенная функция HudMessage.
Зачем нужна эта функция? она - заменитель стандартного print в случаях, когда надо вывести текст на русском. Согласитесь, что каждый раз вставлять такую большую строку в код лень, а так TextOut и готово.
---Небольшое примечание---
MsgDelay - int переменная, объявленная глобально(т.е. вне скрипта или цикла). нужна для организации задержки текста(ведь Delay в функциях недоступен!) Вот как это работает :
TextOut("Текст");
Delay(MsgDelay);
TextOut("Другой текст");
Delay(MsgDelay);
Это, естейственно, надо вставлять в скрипт, в месте, где надо выводить текст.
---
http://timkanil1.narod.ru/Files/example1.rar
Вад - пример с функцией. В дальнейших статейках буду его усложнять.
---
Жду комменты и пожелания. Что бы вы хотели услышать? | |
|
1 |
1 |
1 |
|
|
| |
Shadowman UAC General
| 4393 |
Doom Rate: 1.66
|
Отправлено: 15.01.08 01:41:38 | |
| Nil
Спасибо, весьма полезная статья, но пока надо переварить ее и привыкнуть. Вопросы конечно появятся еще, не беспокойся | |
|
1 |
5 |
2 |
|
|
| |
Reiko = Lance Corporal =
| 264 |
Doom Rate: 1.65
|
Отправлено: 18.02.08 21:44:52 | |
| Как сделать скрипт, чтобы каждый следующий уровень начинать с пистолетом (как в начале игры) | |
|
| |
nprotect = Colonel =
| 2546 |
Doom Rate: 1.48
|
Отправлено: 18.02.08 22:01:17 | |
| Reiko
можно через TakeInventory() все хапнуть (перебрать каждое оружие и каждый вид боеприпаса), в начале каждого уровня как open-скрипт, или тоже самое в FSGLOBAL | |
|
| |
Nil = 1st Lieutenant =
| 1402 |
Doom Rate: 1.79
|
Отправлено: 18.02.08 22:12:49 | |
| ClearInventory() надежнее
Потом
GiveInventory("Pistol",1);
GiveInventory("Clip",30);
всё это в
Script # ENTER | |
|
1 |
1 |
1 |
|
|
| |
Reiko = Lance Corporal =
| 264 |
Doom Rate: 1.65
|
Отправлено: 19.02.08 00:33:59 | |
| nprotect
Nil
Спасибо помогло) | |
|
| |
Nil = 1st Lieutenant =
| 1402 |
Doom Rate: 1.79
|
Отправлено: 19.02.08 01:01:52 | |
| Reiko
я забыл
ещё надо бы
GiveInventory("Fist",1);
а то не по людски получается | |
|
1 |
1 |
1 |
|
|
| |
Reiko = Lance Corporal =
| 264 |
Doom Rate: 1.65
|
Отправлено: 21.04.08 16:34:59 | |
| Помогите сделать подобный скрипт:
Есть уровень, есть дверь за которой выход. При попытки открыть дверь появляется сообщение типа "Убейте всех монстров на уровне" и дверь остается закрытой. Только после того как игрок убивает монстров на уровне, он сможет открыть дверь на выход.
Я тут пытался такой скрипт состряпать, но он не работает(( какие в нем ошибки?
#include "zcommon.acs"
int monsters = 0;
script 1 (void)
{
if(monsters == 1);
{
printbold(s:"Well done");
Door_open(1,10);
}
if(monsters == 0);
{
ACS_Execute(const:3, 0, 0, 0, 0);
}
}
script 3 (void)
{
Print(s:"Kill all monsters on the level!");
delay(100);
}
script 2 open
{
while(ThingCount(T_NONE, 1)) delay(20);
Printbold(s:"Go to the exit");
monsters = 1;
}
| |
|
| |