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

Вопросы по скриптам

Киллер: Задавайте вопросы по скриптовому языку ЗОД и ждите скорейшего ответа на них!

Ответов - 285, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

Morse: Да там лучше даже не "фтыкать". От рекурсивных вызовов непонятных функций у любого парсера крыша съедет. И вообще весь этот код вызовет жгучую зависть у любого индуса. Попробуй как-нибудь так (луа у меня нету, за правильность не отвечаю, наверняка где-нибудь слажал, но идея должна быть ясна): [pre]function user.ChangeDiff() local botdiff = 2 local levelname = ["Easy","Normal","Advanced","Hard","Impossible"] while (button != 3) service("msgbox", {---Черт вас в душу разберет что тут теперь писать надо---}) if ((button==1)and(botdiff > 1)) then botdiff -= 1 end if ((button==2)and(botdiff < 5)) then botdiff += 1 end end user.Diff(botdiff) end [/pre]

VIRUS: Anti_Killer пишет: а тут у тебя в on_select рекурсия и user.ChangeDifficult вызывается всегда по новой, т.е. заново создается и msgbox У тебя в скрипте также, тоже создает каждый раз новое. Попробую разобраться

Anti_Killer: У тебя в скрипте также, тоже создает каждый раз новое. Попробую разобраться ну ненадо же все подчистую слизывать с меня у меня там в скрипте идет вполне логичное исключение "if n ~= 3 then" т.е. 3 вариант ответа исключен и продолжения при нем нет.


VIRUS: Anti_Killer пишет: у тебя так вообще ни одна кнопка в user.Options не будет работать т.к. ты не передаешь n т.е. n у тебя всегда ==nil Все работает кроме "Назад"

Anti_Killer: user.menuservice.on_select="user.MenuOpt(n)" Так у тебя же меню настроек user.Options() т.е. вместо user.menuservice.on_select="user.MenuOpt(n)" надо user.menuservice.on_select="user.Options(n)" ну и function user.Options() исправить на function user.Options(n)

VIRUS: Anti_Killer пишет: user.menuservice.on_select="user.MenuOpt(n)" надо user.menuservice.on_select="user.Options(n)" А я смотрю смотрю и не замечаю --- Вот нашел ошибку как исправить не знаю. Когда нажимаю на кнопку меню, нажатие как бы дублируется в открывшемся меню. --- А можно ли создать локальную переменную в одной функции, а использовать её в другой. Пример: function primer() local nyk if not exits "eto" then nyk="1" end end function primer2() if nyk=="1" then actor("water"{name="eto"}) end end Возможно тут есть ошибки но мысль понятна

VIRUS: Если боту сказать ехать с клетки 1/1 на клетку 1/500 он поедет через стену?

slava98: Попробуй . Мне кажется, нет.

VIRUS: slava98 Я пробую. У меня бот едет к точке а потом куда хочет. VIRUS пишет: Вот нашел ошибку как исправить не знаю. Когда нажимаю на кнопку меню, нажатие как бы дублируется в открывшемся меню. --- А можно ли создать локальную переменную в одной функции, а использовать её в другой. Пример: function primer() local nyk if not exits "eto" then nyk="1" end end function primer2() if nyk=="1" then actor("water"{name="eto"}) end end Возможно тут есть ошибки но мысль понятна Помогите

Anti_Killer: Дам еще один мини урок. смотри мою последнюю версию скрипта The Race (от 18 числа) , я там очень сильно все переделал в плане переменных, фактически все заново переписал . Глобальных там теперь почти нет , практически все и сплошь локальное как функции так и переменные. Основное правило Все глобальные переменные нужно помещать в табличку user, иначе будут проблемы с загрузкой/сохранением. То же самое касается функций, например function new() - неправильно Надо писать чтобы ф-ция была доступна для обработчиков событий объектов (on_select, on_damage, on_die и т.д.) function user.new() либо если нигде объектом не обрабатывается то local function new() Локальные переменные работают в рамках своего end'a в твоем примере так работать не будет , надо делать глобальную user.nyk либо в самом начале скрипта (вообще до начала публикаций функций и т.д. её задать) написать local nyk т.е. сработает только так local nyk function primer() if not exits "eto" then nyk="1" end end function primer2() if nyk=="1" then actor("water"{name="eto"}) end end с локальными функциями также, Если одна локальная ф-ция используется другой, то локальная функция должна быть обязательно задана вышей той что её вызывает Ну и надо не забывать что по умолчанию все переменные являются глобальными и надо приписывать везде либо user. либо делать local , ну у тебя вроде в этом плане нормально про меню это нужен весь код. Но возможно у тебя все в одной функции идет и ты где то что то случайно повторно вызываешь или еще чего.

VIRUS: Вотъ [pre]--функции меню-- user.menuservice = service("menu",{title="gui_splash",name="menu",names="Игра|Настройки|О кампании",on_select="user.Menu(n)"}) ---------------------------------------------- function user.Menu(n) if n == 1 then user.Game(n) elseif n == 2 then user.Options(n) elseif n == 3 then user.About() end end function user.About() service("msgbox", {text="Кампания Snake созданна как модификация танков\nКампания создавалась на основе неофициальной версии\n(c)\n Автор VIRUS\n Версия 1.0"}) end function user.Rm() service("msgbox", {text="К сожалению эта функция еще не реализована\n Ждите релиза в следующих версиях"}) end function user.Refresh() if exists(user.menuservice.name)==true then --фактически пересоздаем меню если нам надо посмотреть изменения user.menuservice.open=1 user.menuservice.open=1 end end function user.Options(n) user.menuservice.names="Сложность|Режим|Назад" user.menuservice.on_select="user.Options(n)" user.Refresh() --для обновления меню if n == nil then return end if n == 1 then user.ChangeDifficult() elseif n == 2 then user.Rm() else user.menuservice.names="Игра|Настройки|О кампании" user.menuservice.on_select="user.Menu(n)" user.Refresh() end end function user.Game(n) user.menuservice.names="Старт|Карта|Назад" user.menuservice.on_select="user.Game(n)" user.Refresh() if n == nil then return end if n == 1 then user.Start() elseif n == 2 then user.ChangeMap() else user.menuservice.names="Игра|Настройки|О кампании" user.menuservice.on_select="user.Menu(n)" user.Refresh() end end function user.ChangeDifficult(n) botreduce = botreduce or 2 -- По умолчанию средняя сложность if n==1 then botreduce=botreduce-1 -- Если нажали "Понизить"- понижается elseif n==2 then botreduce=botreduce+1 --Аналогично end local levelname -- levelname локальный, а не глобальный if botreduce==0 then botreduce=botreduce+1 -- Если сложность ниже 1 возвращается на 1 elseif botreduce==1 then levelname="Лёгкий" elseif botreduce==2 then levelname="Средний" elseif botreduce==3 then levelname="Выше среднего" elseif botreduce==4 then levelname="Сложный" elseif botreduce==5 then levelname="Очень сложный" elseif botreduce==6 then botreduce=botreduce-1 -- Если выше, то на 5 end if n ~= 3 then service("msgbox", {text="Настройка уровня сложности\n Уровень сложности: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.ChangeDifficult(n)",option1="Понизить",option2="Повысить",option3="Закрыть"}) if levelname=="Лёгкий" then user.Diff1() -- Если сложнось лёгкая переходит на user.Diff1() Там хранятся классы для лёгкого режима elseif levelname=="Средний" then user.Diff2() elseif levelname=="Выше среднего" then user.Diff3() elseif levelname=="Сложный" then user.Diff4() elseif levelname=="Очень сложный" then user.Diff5() end end end local levelid function user.ChangeMap(n) botreduce = botreduce or 1 if n==1 then botreduce=botreduce-1 elseif n==2 then botreduce=botreduce+1 end local levelname if botreduce==0 then botreduce=botreduce+1 elseif botreduce==1 then levelname="Без лабиринта" elseif botreduce==2 then levelname="Квадрат" elseif botreduce==3 then levelname="Квадрат внутри" elseif botreduce==4 then levelname="Паралели и перпендекуляр" elseif botreduce==5 then levelname="Комнаты" elseif botreduce==6 then botreduce=botreduce-1 end if n ~= 3 then service("msgbox", {text="Выбор карты для игры\n Карта: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.ChangeMap(n)",option1="Предыдущая",option2="Следующая",option3="Закрыть"}) if levelname=="Без лабиринта" then levelid="1" elseif levelname=="Квадрат" then levelid="2" elseif levelname=="Квадрат внутри" then levelid="3" elseif levelname=="Паралели и перпендекуляр" then levelid="4" elseif levelname=="Комнаты" then levelid="5" end end end function user.Start() if levelid=="1" then user.LoadLevel1() elseif levelid=="2" then user.LoadLevel2() elseif levelid=="3" then user.LoadLevel3() elseif levelid=="4" then user.LoadLevel4() elseif levelid=="5" then user.LoadLevel5() end end[/pre]

Anti_Killer: function user.Menu(n) if n == 1 then user.Game(n) elseif n == 2 then user.Options(n) elseif n == 3 then user.About() end end зачем здесь передавать n ? проверь везде. Т.е. он у тебя тут автоматом кудато лезть сразу же будет в user.Game(1) в user.Options(2)

VIRUS: Anti_Killer не понял --- А понял, все же так просто

VIRUS: Как можно сделать что бы можно было выбирать левела и при нажатии на кнопку старт выбранный левел запускался?

slava98: VIRUS пишет: function user.Rm() service("msgbox", {text="К сожалению эта функция еще не реализована\n Ждите релиза в следующих версиях"}) end Интересно, как это закрыть.

VIRUS: slava98 легко.

VIRUS: Похоже я Anti_Killerа уже достал. Но вот как сделать ПРАВИЛЬНО не пойму. [pre]local levelid function user.ChangeMap(n) botreduce = botreduce or 1 if n==1 then botreduce=botreduce-1 elseif n==2 then botreduce=botreduce+1 end local levelname if botreduce==0 then botreduce=botreduce+1 elseif botreduce==1 then levelname="Без лабиринта" elseif botreduce==2 then levelname="Квадрат" elseif botreduce==3 then levelname="Квадрат внутри" elseif botreduce==4 then levelname="Паралели и перпендекуляр" elseif botreduce==5 then levelname="Комнаты" elseif botreduce==6 then botreduce=botreduce-1 end if n ~= 3 then service("msgbox", {text="Выбор карты для игры\n Карта: \n\n\n\n ["..levelname.."]\n\n\n\n",on_select="user.ChangeMap(n)",option1="Предыдущая",option2="Следующая",option3="Закрыть"}) if levelname=="Без лабиринта" then levelid="1" elseif levelname=="Квадрат" then levelid="2" elseif levelname=="Квадрат внутри" then levelid="3" elseif levelname=="Паралели и перпендекуляр" then levelid="4" elseif levelname=="Комнаты" then levelid="5" end end end function user.Start() if levelid=="1" then user.LoadLevel1() elseif levelid=="2" then user.LoadLevel2() elseif levelid=="3" then user.LoadLevel3() elseif levelid=="4" then user.LoadLevel4() elseif levelid=="5" then user.LoadLevel5() end end[/pre]

Anti_Killer: Да помогу пока настроение есть 1. не ставь числа в ковычки вроде "1" 2. end не там где надо поставил . Ставь до if levelname=="Без лабиринта" then levelid="1" и убирай один снизу. 3. функция user.Start() у тебя нигде не прописана. Т.е. ее не что не вызывает

VIRUS: Anti_Killer пишет: 3. функция user.Start() у тебя нигде не прописана. Т.е. ее не что не вызывает Там есть скрипт что её вызывает

VIRUS: А можно ли писать так pushcmd( function() service ("player_local", {name"snake1", nick="Змея", class="user.Class"}) end, 1) ------------------------------------------------------------------------------------------------------------↑ это функция



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