- Сообщений: 65
- Спасибо получено: 34
Как из скрипта назначить глобальную переменную?
$yres = 576 (где yres - имя переменной)
- не прокатывает. Глобальная переменная, которая назначается из эвента (или сама является ключом для эвента) - не меняется.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
$game_variables[1] = $yres
так как в руби = не просто оператор присваивания, но и оператор связывания.
при изменении $yres будет изменяться и $game_variables[1] (элемент класса глобального массива переменных).
вот именно в таких случаях появляются расхождения с оригинальным Ruby и RGSS, хотя один сделан из ребра другого.

+ теперь можно присваивать и не только числа (как это было в самом мейкере)!
$yres = 576
$game_variables[1] = $yres
$yres = "something"
$yres = Array.new(1,2,3)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Alexeyus пишет: $yres = 576
$game_variables[1] = $yres
так как в руби = не просто оператор присваивания, но и оператор связывания.
при изменении $yres будет изменяться и $game_variables[1] (элемент класса глобального массива переменных).
вот именно в таких случаях появляются расхождения с оригинальным Ruby и RGSS, хотя один сделан из ребра другого.
+ теперь можно присваивать и не только числа (как это было в самом мейкере)!
$yres = 576
$game_variables[1] = $yres
$yres = "something"
$yres = Array.new(1,2,3)
Что-то тут не пашет.
Я сделал ивент, который выводит текстом значения переменных - они равны нулю, то есть скрипт не смог назначить переменную.
Разобрался.
Оказывается, у меня в скрипте был порядок "назначить переменную и начать игру" - переменная обнулялась )
Правильный порядок - начать игру и назначить переменную.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
любые переменные, создаваемые в ивенте, являются локальными и исключительно локальными (и мейкеру плевать, хоть сто $ поставь вначале имени).
обращение к любой глобальной переменной, созданной заранее, приведет к этой глобальной переменной.
если глобальная переменная связана со значением локальной, то после очистки последней, скорее всего, просто обнулится.
да и вообще, зачем оно надо?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
DeadElf79 пишет: выведено однажды опытным путем.
любые переменные, создаваемые в ивенте, являются локальными и исключительно локальными (и мейкеру плевать, хоть сто $ поставь вначале имени).
обращение к любой глобальной переменной, созданной заранее, приведет к этой глобальной переменной.
если глобальная переменная связана со значением локальной, то после очистки последней, скорее всего, просто обнулится.
да и вообще, зачем оно надо?
Объясню. переменная yres это не что иное как разрешение экрана по у.
У меня есть разрешения 576 по у и 768. И если мне надо отобразить в углу экрана рисунок (бюст героя), то привязка координаты по у зависит от разрешения в игре.
Данная проблема решена.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Вот мой скрипт. В нем есть красный и зеленый блоки. Если yres равен 768 - должен выполняться красный.
Если равен 576 или 0 - должен выполняться зеленый блок.
Однако на деле ВСЕГДА выполняется красный, в игре всегда 0 и 1, а не 1 и 0. То есть структура блоков тут не как в паскале.
Где моя ошибка?
def command_new_game
if $yres = 768 then DataManager.setup_new_game
$game_variables[4981] = 0
$game_variables[4982] = 1
end
if $yres != 768 then DataManager.setup_new_game
$game_variables[4982] = 0
$game_variables[4981] = 1
end
close_command_window
fadeout_all
$game_map.autoplay
SceneManager.goto(Scene_Map)
end
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
DeadElf79 пишет: if $yres==768
Не канает. Причина совсем не в этом. Я же написал выше - дело в блоках. Руби не считает
if $yres = 768 then DataManager.setup_new_game
$game_variables[4982] = 1
$game_variables[4981] = 0
end
блоком. В приведенной ниже конструкции всегда срабатывает нижнее условие. Если поменять местами - начнет срабатывать все равно нижнее.
Вопрос был, как заставить синие команды НЕ ВЫПОЛНЯТЬСЯ, если условие не выполнено. С точки зрения Руби, синие строчки не имеют отношения к красной.
def command_new_game
if $yres == 768 then DataManager.setup_new_game
$game_variables[4982] = 0
$game_variables[4981] = 1
end
if $yres = 768 then DataManager.setup_new_game
$game_variables[4982] = 1
$game_variables[4981] = 0
end
close_command_window
fadeout_all
$game_map.autoplay
SceneManager.goto(Scene_Map)
end
Вот тут всегда выполняется нижнее действие.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
greyf24 пишет: Не канает.
Без разницы какой порядок - всегда выполняется условие переменная=768.
Это
При сравнении пользуйтесь ==
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
1) Присваивает переменной $yres значение 768.
2) Проверяет, не равен ли нулю результат (а он заведомо не равен).
3) Если не равен - исполняет команды, стоящие после if. Если равен - пропускает их.
Поэтому - всё-таки причина в этом.
Жуть болотная, на лапках, в тапках и с пулемётом...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Спасибо
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Многие наверное знаю скрипт FA Interactive System 2.0.
Там есть оружие Hookshot, длину которого можно задавать в 241-ой строчке скрипта, т.е. HookLong = 11.
Как сделать, чтобы это значение было не фиксированное число, а задавалось переменной?
Вот сам скрипт yadi.sk/d/DLufmr4Xajah6
А вот - демка автора этого скрипта yadi.sk/d/7s7k7YQnajXxn
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Или вопрос с подвохом?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Мне надо, чтобы в игре было что-то вроде прокачки этого Hookshotа. То есть например сначала берешь его и его длина действия составляет 3 клетки. Затем че-нить подобрал и его длина стала 4 клетки и тд.
Подумал, что неплохо было бы, чтоб длина задавалась переменной, а не числом. Тогда можно будет в игре создавать события, активирую которые переменная увеличивалась на одну единицу.
Знаю, что переменная в скриптах задается как $game_variables[n], где n - номер переменной. В скриптах полный ноль, поэтому действовал методом тыка.
Попытался тупо приравнять HookLong = $game_variables[1], но вылетает ошибка.
Тогда изменил эту строчку на $HookLong = $game_variables[1],
1130-ую строчку изменил на for i in 1..$HookLong
1202-ую строчку изменил на if !hook_moving? and @showing_hook and hook.index == $HookLong and
Ошибка не выдавалась, но HookShot вообще перестал работать
Тогда попробовал другой способ -
1130-ую строчку изменил на for i in 1..$game_variables[HookLong]
1202-ую строку - на if !hook_moving? and @showing_hook and hook.index == $game_variables[HookLong] and
Ну и 241-ую строку изменил на HookLong = 1
Ошибки тоже нету, но снова не работает
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
строка 1130. управление теперь передано целиком на переменную 100, hooklong игнорится, ибо не нужен. не забудь назначить что-нибудь этой переменной в авторане!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Изменение в 1130 строке цикла (for) то же мало что даст, так как этот участок кода инициализация переменных. То есть даже если это часть кода сработает после полной инициализации game_variables и даже будет дано значение той самой game_variables[100], то этот клок кода срабатывает один раз.
То есть при каждом новом вызове (при изменении game_variables[100]) нужно будет (скорее всего
) заново вызывать initialize_int_tools. Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Или я просто не понимаю значение этой фразы "не забудь назначить что-нибудь этой переменной в авторане!".
Надо как-то это в скрипте сделать? А то я просто через событие приравнял переменную к трем.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
То есть всё намного сложнее и проще бросить эту затею?
P.S. сорри за два сообщения подряд, голова совсем уже не варит
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
