Форум » Вопросы и ответы » Несколько вопросов по скриптам » Ответить

Несколько вопросов по скриптам

Morse: 1. Есть ли аналог сишного #include? блонкнот сам по себе - не самая лучшая IDE, а после сотой строки так и просто смерть 2. Можно ли сервису вручную влепить танк (и наоборот)? допустим делаем actor("tank", вся фигня), после чего хотим ему нагрузить сервис. можно? 3. Можно ли убить сервис оставив на поле безхозный танк? если я скажем хочу пересадить игрока в другой танк так, чтобы старый остался на месте? вообще насколько прочна связь сервис-танк? 4. есть ли ссылка на себя (аналог this)? скажем, сработало событие on_damage, и надо вызвать функцию user.myOnDamage(this). можно ли это сделать как-нибудь так унифицированно, или надо каждый раз пихать свое имя явным образом? 5. предусмотрено ли динамическое высвобождение памяти? если скажем я заведу массив о тысяче элементов, а потом решу его убить, это можно? или вообще не запариваться о памяти априори решив что "на наш век хватит"? 6. не столько по скриптам сколько по движку: возможно прикинуть, сколько АИ-сервисов потянет среднестатистическая машина? если я в скрипте создам, скажем, сто сервисов - это как? 7. pushcmd опять же. сколько команд реально пихнуть в очередь? скажем, с тысячи он не сдохнет? как быстро происходит обработка команд типа actor и kill? сильно ли увеличится время поиска объекта, если их (обектов) сотни? скажем сто сервисов и сто танков на них, у всех уникальные имена, а нам надо отловить один - сколько это времени займет? Я тут только что сдал последний экзамен, и у меня есть желание сделать кампанию (на этот раз игручую). Если все получится, то по традиции будет много новых нестандартных скриптов, и максимальная интерактивность, но сначала хочется узнать насколько мои наполеоновские планы реальны - будет обидно если то, что я задумал, пойдет только на каких-нибудь глубоких голубых гигантах кремниевой мысли...

Ответов - 22, стр: 1 2 All

ZURG: блонкнот сам по себе - не самая лучшая IDE, а после сотой строки так и просто смерть Юзай Notepad++ или любой другой текстовый редактор с подсветкой синтаксиса.

Morse: по крайней мере на первый вопрос я сам себе ответил!! (ставлю себе +1)))) Если кому интересно: первым делом заменяем строку package.path - сейчас ее значение равно "scripts//?.lua" что означает что скрипты прога будет искать только в папки скриптов. заменяем значение: package.path="scripts//?.lua;campaign//?.lua" после этого импорт проводится простой командой require("<имя файла без '.lua'>") скажем файл следующего содержания package.path="scripts//?.lua;campaign//?.lua" require("Demo") запустит демо кампанию

Insert: Morse пишет: 1. Есть ли аналог сишного #include? Точного аналога нет, ибо в луа нет встроенного препроцессора. Зато есть функция dofile("имя файла"), которая выполняет указанный скрипт. На первый вопрос ты частично ответил правильно. package и requie придуманы как раз для того, чтобы хранить в них библиотеки функций. А вот запускать кампании таким образом не стоит, поскольку require выполняет скрипт только один раз. Это сделано для того чтобы библиотека функций, включенная в разные файлы, инициализировалась только один раз. Morse пишет: 2. Можно ли сервису вручную влепить танк (и наоборот)? допустим делаем actor("tank", вся фигня), после чего хотим ему нагрузить сервис. можно? 3. Можно ли убить сервис оставив на поле безхозный танк? если я скажем хочу пересадить игрока в другой танк так, чтобы старый остался на месте? вообще насколько прочна связь сервис-танк? Нет нельзя. Сервис и танк связаны жестко. Если убить танк, то сервис через 2 секунды родит себе новый. Если убить сервис, то он заодно грохнет свой танк. Я уже думал на тему переключение сервисов на танке. Там есть кой-какие сложности, но задача в принципе решаемая. Morse пишет: 4. есть ли ссылка на себя (аналог this)? скажем, сработало событие on_damage, и надо вызвать функцию user.myOnDamage(this). можно ли это сделать как-нибудь так унифицированно, или надо каждый раз пихать свое имя явным образом? Нужно каждый раз пихать... Вообще, в луа принято писать self, но у меня такое не поддерживается. Пока не поддерживается. Morse пишет: 5. предусмотрено ли динамическое высвобождение памяти? если скажем я заведу массив о тысяче элементов, а потом решу его убить, это можно? или вообще не запариваться о памяти априори решив что "на наш век хватит"? В луа управление памятью полностью автоматическое, можно не париться. Однако сама по себе память - ограниченный ресурс и распоряжаться ей надо экономно. Чтобы освободить массив, достаточно записать в переменную значение nil. Morse пишет: 7. pushcmd опять же. сколько команд реально пихнуть в очередь? скажем, с тысячи он не сдохнет? как быстро происходит обработка команд типа actor и kill? сильно ли увеличится время поиска объекта, если их (обектов) сотни? скажем сто сервисов и сто танков на них, у всех уникальные имена, а нам надо отловить один - сколько это времени займет? В очередь надо стараться пихать поменьше. Даже если команда просто лежит в очереди, она отъедает какое-то время. Вот сейчас померил на моем проце core2 e6300 очередь из 10000 команд требует где-то 1 миллисекунду на обработку каждый кадр. Наверно не очень много... Но я бы все равно не советовал класть в очередь больше тысячи заданий. Поиск объекта по имени происходит очень быстро. Можно не париться. ЗЫ на тему IDE посетите страничку http://lua-users.org/wiki/LuaAddons ЗЗЫ я сам пользуюсь редактором TextPad с подсветкой синтаксиса луа. И еще у меня стоит [VS Lua Language Pack] - подсветка синтаксиса прямо в вижуал студио.


Morse: И еще один вопрос: есть ли какой-нибудь аналог wait(), или как вообще заставить скрипт приостановиться?

ZURG: Насколько я знаю, есть команда pause(true) и pause(false)

Morse: Уж не знаю что делает pause, но точно не тормозит скрипты. К тому же вряд ли скрипты будут тормозится таким манером, ведь после постановки в паузу снять будет крайне проблематично - паузнутый скрипт не сможет сам себе подать команду pause(false), и скрипт просто войдет в дедлок.

RUSlan: Morse http://ru.zod.wikia.com/wiki/Function_freeze http://ru.zod.wikia.com/wiki/Function_pause

Morse: Установка/снятие паузы. Так же останавливается выполнение заданий из очереди (pushqueue) не очень понятная формулировка. одно могу сказать точно: делаем простейший скрипт pause(true) message("YOYO") и убеждаемся что pause - это не то кстати в вики похоже ошибка - не pushqueue а pushcmd наверное...

Insert: Morse Пауза останавливает игру, но не скрипты. Чтобы приостановить выполнение скрипта, можно поступить например так [pre] function user.part1() -- делаем что-то полезное -- затем ставим в очередь продолжение скрипта через 3 секунды pushcmd(user.part2, 3) end function user.part2() -- ляля end ----- user.part1() [/pre]

Insert: ошибку исправил, ага

Morse: я так понимаю что массив (который почему-то называется таблицей) задается так user.array={ident1=1,ident2=2...итд} а как задать подобную радость в цикле? ident1 - не строка чтоб легко и просто собрать по кускам, а наглое обращение user.array["ident1"]=1 не встречает понимания.

Insert: user.array={} -- создали пустой массив user.array["ident1"]=1 -- теперь все нормально

Dezman: Insert Я хочу спросить я делаю компанию и у меня такая задумка мене надо чтоб после каждого убитого танка выпадала лечебка. Как это осуществить скриптами? И еще мона задать определеный машрут для ботов???

Insert: Dezman к сожалению ни того ни другого сделать нельзя

Dezman: Insert Жалко, но надеюсь вы прикрутите это потом. Но вот как сделать вот сначала 2 танка когда один умрет появится другой???

Morse: все что связано со смертью танка вешается в свойство on_die сервиса. можно допустим сделать так: service("ai",{name="bot1",on_die="kill(\"bot1\");user.nextbot()"}) function user.nextbot() --а тут уже можно создавать аптечки, или там создавать других ботов, или там еще что-нибудь создавать end если дашь более подробное описание задачи смогу подсказать конкретный код. единственное чего делать НЕЛЬЗЯ, это нельзя получить координаты танка и управлять ботами. и то как известно если нельзя но очень хочется.... скажем, если карта небольшая можно в цикле нагенерить триггеров по всей поверхности карты, которые бы на on_enter в переменные user.tankX user.tankY (к примеру) заносили бы свои координаты. таким образом мы получим координаты танка с известной степенью точности.

Dezman: Morse Короче смотри у меня такая штука 4 танка ездят. Если один умирает то после него появляется аптечка. Или там другое оружие. Просто у меня такая кампания. А можна так сделать в массив засунь ну например: автоматическая пушка, пулемет, аптечка. И генерировать их ну чтоб они каждый раз что то другое выпадало.

Morse: не очень понятно описываешь условие. во-первых. если танк умирает надо ли убивать сервис? если непонятно, поясню: надо ли делать так, чтоб после убийства первого же танка они переставали появляться вновь? во-вторых. появляется где? если в том месте где взорвался танк, то это сложно. как я говорил получение координат танка возможно только посредством изрядного гимора. если в каком-то определенном месте, то это уже проще. в-третьих. надо ли убивать этот самый бонус после взячи? скажем ты взял аптечку, а через некоторое время там новая сгенерится. теперь у объектов есть свойство on_pickup, и поэтому впринципе аптечку сразу после взячи можно убить. только не вздумай убивать пушки - они от этого исчезнут с танка.

Mishkaxxx: а может ли скрипт создания танка (servise("ai"......)) создавать отдельный класс танка (в обычной карте)?

Tigel: В смысле создать класс, которого нет в vehicles?



полная версия страницы