Правила раздела:
1 Задавайте конкретные вопросы. Для болтовни есть свободный раздел.
2 По возможности давайте конкретные ответы.
3 Один вопрос=одна тема. Если хотите задать ещё вопрос, то начинайте новую тему.
4 Название темы должно составлять сам вопрос, и быть максимально конкретным. Рекомендуется начинать тему словами "Как", "Что", "Почему". А первый пост повторяет вопрос и даёт расширенные сведения.
5 Рекомендуется указывать версию мейкера (2000, 2003, RMXP, RMVX, ACE, IGM, и.т.д.. Это важно, и всё равно ведь спросят.
6 Темы "Пара вопросов", "Помогите", и подобные им - самый лёгкий путь к бану.
7 Поиск находится вверху справа.
А. Названия подразделов этого раздела уточняются. Советы принимаются.

Копия скрипта

Больше
8 года 4 мес. назад #101490 от Paranoid
Paranoid создал тему: Копия скрипта
Помогите плез. Нужно размножить один скрипт, то бишь запихнуть его копию в один проект. Но как вы наверное догадались возникает "stack level too deep". Как это побороть? Что конкретно надо переименовать? Скрипт конечно прилагаю.
Ace если что.

Скрипт
Спасибо сказали: Dmy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Даритель Стимкея Учитель Организатор конкурсов 2 место Программист JavaScript Оратор
Больше
8 года 4 мес. назад #101493 от Mur
Mur ответил в теме Копия скрипта

Paranoid пишет: Нужно размножить один скрипт, то бишь запихнуть его копию в один проект.


Эммм,… а можно по шагам расписать, что ты хочешь сделать? Вот честно никак не могу понять что значит «размножить» и «запихнуть»? :unsure:

Или имеется ввиду «один проект» = «этот же самый проект?»
Спасибо сказали: Dmy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
8 года 4 мес. назад #101496 от Paranoid
Paranoid ответил в теме Копия скрипта
Вот есть у меня скрипт, он показывает окошко с иконкой. А мне нужно еще одно окошко с иконкой. Но этот же самый скрипт нельзя просто скопировать, иначе ничего не работает. А вот мне надо чтобы работало.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Ветеран Поддержка Фонда Разработчик Проект месяца 3 место Учитель Оратор Даритель Стимкея 2 место За 2 место на конкурсе маппинга Программист Ruby Паладин
Больше
8 года 4 мес. назад - 8 года 4 мес. назад #101498 от Dmy
Dmy ответил в теме Копия скрипта
Я сначала опишу то, о чём просили, а потом опишу правильный способ. :mad:

Переполнение стека вызывается из-за алиасов:
Code:
alias start_window start alias term_window terminate alias update_window update

Нужно, чтобы первое название было разным во всех скриптах. То есть лучше заменить start_window на что-то типа start_hand_window_2 и так далее (а также в других местах).

Пояснение, почему так происходит и как работает alias


Дальше. Другие вещи, которые надо поменять.

Список вещей, которые надо поменять в скрипте, чтобы его размножить


В результате код принимает такой вид:
Рабочий скрипт, но с дублированием классов


И это работает, всё хорошо, но проблема в том, что код класса Window_Hand2 почти полностью дублирует код класса Window_Hand. Поэтому вот...

ПРАВИЛЬНЫЙ СПОСОБ.

Правильным способом будет переделать код Window_Hand, чтобы его можно было использовать и для правой, и для левой руки. Тогда это будет не дубликат скрипта, а один скрипт для двух рук. Так делать правильно, потому что:
  • Его можно будет легко адаптировать и для трёх рук, и для пяти :),
  • Если нужно будет поменять механизм работы, можно поменять его сразу для обеих рук.

Для этого нужно передавать параметры в функцию initialize. Мы будем передавать те параметры, которыми руки отличаются друг от друга:
  • item_var_id — номер переменной, из которой мы будем брать предмет,
  • icon_var_id — номер переменной, в которую мы будем записывать индекс значка,
  • x — количество пикселей от края экрана (у первой руки это 0 — ну, или Graphics.width-Win_w*4.93; у второй руки это Win_w)
  • window_text — текст в окне ('Hand1:', 'Hand2:', etc.)

      Параметры передаются в скобках, так что допишем после функции initialize скобки:
    Code:
    def initialize(x, item_var_id, icon_var_id, window_text) # код пропущен end

    x используется прямо здесь — он передаётся в функцию initialize верхнего уровня (суперкласса) с помощью super, поэтому первая строчка примет такой вид:
    Code:
    super(x, Graphics.height-Win_h, Win_w, Win_h)

    Другие параметры (item_var_id, icon_var_id, window_text) используются не в функции initialize, а в другой функции, draw_window_content. Чтобы они там были доступны, сохраним их как переменные объекта (перед переменными объекта пишется знак @):
    Code:
    @item_var_id = item_var_id @icon_var_id = icon_var_id @window_text = window_text

    В результате функция initalize примет такой вид:
    Code:
    def initialize(x, item_var_id, icon_var_id, window_text) super(x, Graphics.height-Win_h, Win_w, Win_h) @item_var_id = item_var_id @icon_var_id = icon_var_id @window_text = window_text create_contents self.visible = Win_vis refresh end

    Так как в функции initialize теперь есть параметры, эти параметры нужно передавать при создании Window_Hand — не
    Code:
    @winhand = Window_Hand.new

    а
    Code:
    @winhand = Window_Hand.new(0, 1, 2, 'Hand1:')

    Это будет в функции start класса Scene_Map, внизу. Ну и, так как рук у нас теперь 2, создадим сразу два окна:
    Code:
    @winhand1 = Window_Hand.new(0, 1, 2, 'Hand1:') @winhand2 = Window_Hand.new(Win_w, 1, 2, 'Hand2:')

    Во второй руке нужно заменить 1 и 2 на номера других переменных, иначе оба окна будут показывать одно и то же.

    В других местах @winhand.dispose и @winhand.update тоже нужно заменить на две строчки, одну с @winhand1, вторую с @winhand2.


    Ну и нужно поменять саму функцию draw_window_content в классе Window_Hand, чтобы она учитывала @item_var_id, @icon_var_id, @window_text:
    Code:
    def draw_window_content var = $game_variables[@item_var_id] if var == 0 var = 20 end if var < $data_items.length then $game_variables[@icon_var_id] = $data_items[var].icon_index @last_icon = $game_variables[@icon_var_id] draw_text_ex(0, 0, @window_text + '\I[\V[' + @icon_var_id.to_s + ']]') else draw_text_ex(0, 0, @window_text) end end

    Так как @icon_var_id — это число, а не строка, превратим его в строку с помощью to_s.

    Результат получается таким:
    Рабочий скрипт без дублирования классов


    Всё бы хорошо, но чтобы настроить скрипт, придётся редактировать строчки
    Code:
    @winhand1 = Window_Hand.new(0, 1, 2, 'Hand1: ') @winhand2 = Window_Hand.new(Win_w, 1, 2, 'Hand2: ')
    в середине кода. Считается дурным тоном заставлять людей редактировать строчки в середине кода. Лучше вынести их наверх — тем более, что у нас уже есть module Hand_setting ... end для хранения настроек.

    В результате код получается таким:
    Code:
    module Hand_setting # ширина окона Win_w = 120 # высота окон Win_h = 50 # непрозрачность окон Win_vis = 255 # Номер переменной, где хранится предмет правой руки Right_hand_var_id = 1 # Номер переменной, куда запишется значок предмета из правой руки Right_hand_icon_id = 2 # Текст перед значком предмета левой руки: Right_hand_window_text = 'Hand1: ' # Номер переменной, где хранится предмет левой руки Left_hand_var_id = 3 # Номер переменной, куда запишется значок предмета из левой руки Left_hand_icon_id = 4 # Текст перед значком предмета левой руки: Left_hand_window_text = 'Hand2: ' # Номер предмета, который будет показан, если рука пустая Hand_empty_item_id = 20 end include Hand_setting class Window_Hand < Window_Base def initialize(x, item_var_id, icon_var_id, window_text) super(x, Graphics.height-Win_h, Win_w, Win_h) @item_var_id = item_var_id @icon_var_id = icon_var_id @window_text = window_text create_contents self.visible = Win_vis refresh end def refresh self.contents.clear contents.clear draw_window_content end # Рисуем текст def draw_window_content var = $game_variables[@item_var_id] if var == 0 var = Hand_empty_item_id end if var < $data_items.length then $game_variables[@icon_var_id] = $data_items[var].icon_index @last_icon = $game_variables[@icon_var_id] draw_text_ex(0, 0, @window_text + '\I[\V[' + @icon_var_id.to_s + ']]') else draw_text_ex(0, 0, @window_text) end end # Обновить def update super return if @last_icon != $game_variables[@icon_var_id] refresh end end # Scene_Map Class, For keeping it on the map class Scene_Map < Scene_Base alias start_window start alias term_window terminate alias update_window update def start start_window @winhand1 = Window_Hand.new(0, Right_hand_var_id, Right_hand_icon_id, Right_hand_window_text) @winhand2 = Window_Hand.new(Win_w, Left_hand_var_id, Left_hand_icon_id, Left_hand_window_text) update end def terminate @winhand1.dispose @winhand2.dispose term_window end def update update_window @winhand1.update if @winhand1 @winhand2.update if @winhand2 end end

    Я проверял и у меня всё работает, но если что-то не работает — пиши, исправлю. Или если что-то непонятно. Удачи!
Последнее редактирование: 8 года 4 мес. назад пользователем Dmy.
Спасибо сказали: Cabbit, Mur, Paranoid, Snake Fightin

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
8 года 4 мес. назад #101499 от Paranoid
Paranoid ответил в теме Копия скрипта
О, спасибо большое, все как мне надо. Только строчку
@winhand2 = Window_Hand.new(Win_w, Left_hand_var_id, Left_hand_icon_id, Left_hand_window_text)
Заменил на
@winhand2 = Window_Hand.new(Graphics.width-Win_w, Left_hand_var_id, Left_hand_icon_id, Left_hand_window_text)
Так как на разных частях экрана должны быть.

Ну и раз уж вы такой умелец, может прикрутите возможность прятать этот худ свитчом №1. А то я так и не добился с этим приемлемых результатов.
Спасибо сказали: Dmy

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Ветеран Поддержка Фонда Разработчик Проект месяца 3 место Учитель Оратор Даритель Стимкея 2 место За 2 место на конкурсе маппинга Программист Ruby Паладин
Больше
8 года 4 мес. назад #101512 от Dmy
Dmy ответил в теме Копия скрипта

Paranoid пишет: возможность прятать этот худ свитчом №1. А то я так и не добился с этим приемлемых результатов.

Не уверен, что у меня оптимальный вариант, но вот такой код работает:
Code:
module Hand_setting # ширина окона Win_w = 120 # высота окон Win_h = 50 # непрозрачность окон Win_vis = 255 # Номер переменной, где хранится предмет правой руки Right_hand_var_id = 1 # Номер переменной, куда запишется значок предмета из правой руки Right_hand_icon_id = 2 # Текст перед значком предмета правой руки: Right_hand_window_text = 'Hand1: ' # Свитч, который включает показ окна для правой руки (или false, если показывать всегда) Right_hand_enabler_switch = 1 # Номер переменной, где хранится предмет левой руки Left_hand_var_id = 3 # Номер переменной, куда запишется значок предмета из левой руки Left_hand_icon_id = 4 # Текст перед значком предмета левой руки: Left_hand_window_text = 'Hand2: ' # Свитч, который включает показ окна для левой руки (или false, если показывать всегда) Left_hand_enabler_switch = 1 # Номер предмета, который будет показан, если рука пустая Hand_empty_item_id = 20 end include Hand_setting class Window_Hand < Window_Base def initialize(x, item_var_id, icon_var_id, window_text, enabler_switch_id) super(x, Graphics.height-Win_h, Win_w, Win_h) @item_var_id = item_var_id @icon_var_id = icon_var_id @window_text = window_text @enabler_switch_id = enabler_switch_id create_contents self.visible = Win_vis refresh end def refresh self.contents.clear contents.clear draw_window_content end # Рисуем текст def draw_window_content var = $game_variables[@item_var_id] if var == 0 var = Hand_empty_item_id end if var < $data_items.length then $game_variables[@icon_var_id] = $data_items[var].icon_index @last_icon = $game_variables[@icon_var_id] draw_text_ex(0, 0, @window_text + '\I[\V[' + @icon_var_id.to_s + ']]') else draw_text_ex(0, 0, @window_text) end end # Обновить def update super if @enabler_switch_id then if $game_switches[@enabler_switch_id] then show else hide end end return if @last_icon != $game_variables[@icon_var_id] refresh end end # Scene_Map Class, For keeping it on the map class Scene_Map < Scene_Base alias start_window start alias term_window terminate alias update_window update def start start_window @winhand1 = Window_Hand.new(0, Right_hand_var_id, Right_hand_icon_id, Right_hand_window_text, Right_hand_enabler_switch) @winhand2 = Window_Hand.new(Win_w, Left_hand_var_id, Left_hand_icon_id, Left_hand_window_text, Left_hand_enabler_switch) update end def terminate @winhand1.dispose @winhand2.dispose term_window end def update update_window @winhand1.update if @winhand1 @winhand2.update if @winhand2 end end

Если нужно, можно сделать для разных рук разные свитчи, поменяв Left_hand_enabler_switch и Right_hand_enabler_switch.
Спасибо сказали: Cabbit, Mur

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.099 секунд
Работает на Kunena форум