Как создать свой интерфейс?

Больше
10 года 4 мес. назад - 10 года 4 мес. назад #88816 от ierecumi
Доброго времени суток уважаемые RPGшники!
Хочу научиться делать небольшие моды для своих игр.
И для этого начал изучать скриптописание для [ACE].

Правда сам не очень смог разобраться.

Меня интересуют следующие вопросы:
1) Как создать новый пункт меню?
2) Как создать своё окно, чтобы оно закрывалось по нажатию на ESC?
3) Как в это окно вывести: Картинку, текст, игровые данные(значения переменных, HР, МР, шмотки и т.д.)

Заранее при много благодарен.

PS: ссылки на информацию тоже приветствуются!
Последнее редактирование: 10 года 4 мес. назад пользователем AnnTenna.

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

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 4 мес. назад #88817 от Cerberus
Cerberus ответил в теме Новичек
Новый пункт меню проще всего добавить в add_original_commands в Scene_Menu. Только используйте alias, чтобы не нарушать совместимость. Для создания окна проще всего прошерстить код по Ctrl+Shift+F на предмет слова Window - примеров будет достаточно.

Жуть болотная, на лапках, в тапках и с пулемётом...
Спасибо сказали: ierecumi

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

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
10 года 4 мес. назад #88821 от DeadElf79
DeadElf79 ответил в теме Новичек
Первое и главное - читай встроенные скрипты. Из них ты почерпнешь большую часть того, что тебе нужно знать, чтобы писать свои дополнения к VX Ace.

1. Если в титульный экран, то:
- читай скрипт под названием Window_TitleCommand, метод make_command_list, дополняй по аналогии
- читай скрипт Scene_Title, взгляни на метод create_command_window, дополни строкой по аналогии
- в тот же скрипт добавь собственный метод, который будет выводи на другую сцену (в другое меню, то есть)
Если во внутриигровое меню, то смотреть нужно WindowMenuCommand и Scene_Menu, менять нужно почти то же самое.
2. Для этого тебе нужно создать класс-потомок к методу Scene_MenuBase, чтобы создать собственное меню или Scene_Base, чтобы создать что-то очень специфичное (вот как Scene_Map, например). Читай на все менюшки, попробуй написать функцию, которая сдвигает окошки в меню, а потом берись за что-то более сложное.
3. А вот для этого придется читать Window_Base для начала.

У нас много разных учебников по скриптам, но лучше все-таки поставить какую-то конкретную задачу. Я или другие скриптеры напишем ее решение и поясним. Возможно даже построчно ^_^
Спасибо сказали: ierecumi

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

Больше
10 года 4 мес. назад #88829 от DesKarD
Не знаю в тему ли...
Я тут нашёл уголок обучения Ruby
( на английском правда, надеюсь не будет трудностью )

www.codecademy.com

Если интересно там внизу найдёшь уроки скриптописания руби...

Золотой сборник цитат Светлой

Помогите Юриолю потушить его попчанский

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

Больше
10 года 4 мес. назад #88891 от ierecumi
Всем, кто откликнулся большое спасибо!

Кое что я уже начинаю понимать.
Вот например добавил новый пункт во внутренне меню
Code:
class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # * Add Main Commands to List #-------------------------------------------------------------------------- def add_main_commands add_command(Vocab::item, :item, main_commands_enabled) add_command(Vocab::skill, :skill, main_commands_enabled) add_command(Vocab::equip, :equip, main_commands_enabled) add_command(Vocab::status, :status, main_commands_enabled) add_command("ierecumi", :ierecumi) end end

И создал новую винду
Code:
class Windows_Mine < Window_Base def initialize super(0, 0, 150, 50) end end

подскажите как свою винду вызвать из моего пункта меню?
и что нужно добавить в винду, чтобы она закрывалась при нажатии на ESC?

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

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
10 года 4 мес. назад - 10 года 4 мес. назад #88892 от Amphilohiy
Ну в целом можно добавить это так:
Code:
class Scene_Menu < Scene_MenuBase def create_command_window @command_window = Window_MenuCommand.new @command_window.set_handler(:item, method(:command_item)) @command_window.set_handler(:skill, method(:command_personal)) @command_window.set_handler(:equip, method(:command_personal)) @command_window.set_handler(:status, method(:command_personal)) @command_window.set_handler(:formation, method(:command_formation)) @command_window.set_handler(:save, method(:command_save)) @command_window.set_handler(:game_end, method(:command_game_end)) @command_window.set_handler(:cancel, method(:return_scene)) # В окне есть кнопка, но теперь мы привяжем ее к функционалу сцены @command_window.set_handler(:ierecumi, method(:ierecumi)) end # Это наш функционал сцены def ierecumi @erecumi_window = Windows_Mine.new end end
А потом послушаем цербера, и перепишем все в:
Code:
class Window_MenuCommand < Window_Command alias add_main_commands_ierecumi add_main_commands def add_main_commands add_main_commands_ierecumi add_command("ierecumi", :ierecumi) end end class Windows_Mine < Window_Base def initialize super(0, 0, 150, 50) end end class Scene_Menu < Scene_MenuBase alias create_command_window_ierecumi create_command_window def create_command_window create_command_window_ierecumi @command_window.set_handler(:ierecumi, method(:ierecumi)) end def ierecumi @erecumi_window = Windows_Mine.new end end

Закрыть на ESC? Кхм, есть небольшая трабла. Можно запихать метод в класс:
Code:
class Windows_Mine < Window_Base def initialize super(0, 0, 150, 50) end def update super if Input.trigger?(:B) then close end end end
Но тогда предыдущее окно не активируется. Тут придется придумать костыль, например передать @command_window через конструктор, и вызвать @command_window.activate при закрытии. Справишься?

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Последнее редактирование: 10 года 4 мес. назад пользователем Amphilohiy.
Спасибо сказали: Seibur, ierecumi

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

Больше
10 года 4 мес. назад #88909 от ierecumi
Боюсь, что к самостоятельной работе я пока ещё не готов =)

НО!
Я переделал немного твой код:
Code:
def update super if Input.trigger?(:B) then @ierecumi_window.close end end
А то на просто "Close" он чё то ругался.
И ты прав моё окно закрылось по нажатию на ESC.
Ну а дальше всё зависло.

Я просто пытаюсь понять.
В самой игре это реализовано: нажимаешь ESC открывается основное меню(окно или сцена)я немного запутался в терминах,
и при повторном нажатии на ESC всё закрывается.

Но я так и не сумел найти эти строки кода и понять как это реализуется.

НЕ! Сегодня я уже точно не соображу ни чего.

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

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
10 года 4 мес. назад #88911 от Amphilohiy

ierecumi пишет: Я переделал немного твой код:

Ты запихал метод в Scene_Menu, а не в Windows_Mine? Так тоже можно, тогда будет даже чутка проще
Code:
def update super if !@erecumi_window.nil? and @erecumi_window.active and Input.trigger?(:B) then @erecumi_window.close @command_window.activate end end
Стоит заметить, что мне окно стоило создать заранее, но спрятать. Давненько я мукер не мучал. И кстати, если ты все же определил метод update именно в сцене, то тут уместнее alias, нежели super.

Kian Ni пишет: Я конечно не про, но почему бы не использовать такую конструкцию?

Это синтаксический сахар, так что роли не играет. Можно и так, но по началу может слегка путать.

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Спасибо сказали: ierecumi

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

Больше
10 года 4 мес. назад #88914 от ierecumi
Ура!!! :whistle:Ура!!! :whistle:Ура!!! :whistle:
Ура!!! Всё заработало как надо.
Всем огромное спасибо за проделанную работу.

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

Программист Ruby 2 место Готв Победитель Сбитой кодировки Учитель Оратор
Больше
10 года 4 мес. назад #88916 от Amphilohiy
Собственно говоря, тебя же еще интересует вывод всякой всячины в окно? У твоего окна есть свойство contents. Это Bitmap, справку по нему ты найдешь в... справке.
Что касается всяких игроков, партий, предметов и прочего, то это смотри в классах, начинающихся с Game_*. Как правило такие классы сразу объявляются в глобальном пространстве, и их имена можно найти в модуле DataManager (метод create_game_objects). Дальше уже по конкретике - что именно и куда именно.

Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.

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

Больше
10 года 3 мес. назад #89034 от ierecumi
с картинками разобрался
если кому интересно вот!
Code:
#====================картинка=================================================== bitmap = Bitmap.new("Graphics/Pictures/Pictures.png") src_rect = Rect.new(0, 0, bitmap.width, bitmap.height) ret_rect = Rect.new(0, 0, bitmap.width, bitmap.height) contents.stretch_blt(ret_rect, bitmap, src_rect)

Правда возник один вопрос
Создаю окно и сцену
Вызываю из Event'a
А после закрытия окна всё остаётся черным.
Code:
SceneManager.call(Scene_UpWeapon)
Code:
class Window_UpWeapon < Window_Base def start super #create_background create_windows end #====================Создание окна============================================== def initialize super(0, 0, 640, 480) self.opacity = 0 #==окно прозрачное #====================Текст====================================================== draw_text_ex(0, 0, 'Здесь могла быть Ваша реклама!!!') end end class Scene_UpWeapon < Scene_Base def start @my_window = Window_UpWeapon.new end def update super if !@my_window.nil? and @my_window.active and Input.trigger?(:B) then @my_window.close end end end

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

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 3 мес. назад #89035 от Cerberus
Потому что надо не только окно закрывать, а ещё и на предыдущую сцену возвращаться - SceneManager.return.

Жуть болотная, на лапках, в тапках и с пулемётом...

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

Больше
10 года 3 мес. назад #89036 от ierecumi
Помогите сформулировать выражение правильно
Code:
def update super if экипировано ID_Weapon then бла,бла,бла! end end

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

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 3 мес. назад #89038 от Cerberus
Копать в сторону Game_Actor (за свойством "экипировано") и $game_actors либо $game_party (за выбором конкретного персонажа для проверки).

Жуть болотная, на лапках, в тапках и с пулемётом...

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

Больше
10 года 3 мес. назад #89039 от ierecumi
Ругается на SceneManager.return

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

Больше
10 года 3 мес. назад #89047 от ierecumi
видимо потому, что я изменил размеры экрана 640х480
пришлось свой Viewport создавать :laugh:
вот решение:
Code:
class Scene_UpWeapon < Scene_Base def start super create_main_viewport create_background @viewport = Viewport.new(0, 0, 640, 480) end class Window_UpWeapon < Window_Base #====================Создание окна============================================== def initialize super(0, 0, 640, 480) self.opacity = 0 #==окно прозрачное #====================картинка=================================================== bitmap = Bitmap.new("Graphics/Pictures/UpWeapon_Fon.png") src_rect = Rect.new(0, 0, bitmap.width, bitmap.height) ret_rect = Rect.new(0, 0, bitmap.width, bitmap.height) contents.stretch_blt(ret_rect, bitmap, src_rect) #====================Текст====================================================== draw_text_ex(110, 5, 'Здесь могла быть Ваша реклама!!!') end end def update super if !@my_window.nil? and @my_window.active and Input.trigger?(:B) then @my_window.close SceneManager.goto(Scene_Map) end end def start @my_window = Window_UpWeapon.new @my_window.z = 199 @viewport = Viewport.new end end

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

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
10 года 3 мес. назад #89048 от DeadElf79
Надеюсь, в последствии мы увидим демку. Мне хочется посидеть и вдумчиво поредактировать косяки ^_^

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

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