Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Как создать свой интерфейс?

Как создать свой интерфейс? 8 года 10 мес. назад #88816

  • ierecumi
  • ierecumi аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
Доброго времени суток уважаемые RPGшники!
Хочу научиться делать небольшие моды для своих игр.
И для этого начал изучать скриптописание для [ACE].

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

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

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

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

Новичек 8 года 10 мес. назад #88817

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • Проект месяца 3 место3 место ГотвПрограммист JavaScript Победитель Сбитой кодировкиОрганизатор конкурсовПисатель 3 место2 место Проект месяца 2 место2 место Сбитая кодировка3 место
Новый пункт меню проще всего добавить в add_original_commands в Scene_Menu. Только используйте alias, чтобы не нарушать совместимость. Для создания окна проще всего прошерстить код по Ctrl+Shift+F на предмет слова Window - примеров будет достаточно.
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: ierecumi

Новичек 8 года 10 мес. назад #88821

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Программист RubyУчительПроект месяца 1 местоОрганизатор конкурсовВетеран3 местоПроект месяца 2 место1 место в ГотвПисатель 3 место
Первое и главное - читай встроенные скрипты. Из них ты почерпнешь большую часть того, что тебе нужно знать, чтобы писать свои дополнения к 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

Как создать свой интерфейс? 8 года 10 мес. назад #88829

  • DesKarD
  • DesKarD аватар
  • Вне сайта
  • Заблокирован
  • Очередной шутнечок...
  • Сообщений: 300
  • Спасибо получено: 191
Не знаю в тему ли...
Я тут нашёл уголок обучения Ruby
( на английском правда, надеюсь не будет трудностью )

https://www.codecademy.com

Если интересно там внизу найдёшь уроки скриптописания руби...
Золотой сборник цитат Светлой [ Нажмите, чтобы развернуть ]

Помогите Юриолю потушить его попчанский [ Нажмите, чтобы развернуть ]
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #88891

  • ierecumi
  • ierecumi аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
Всем, кто откликнулся большое спасибо!

Кое что я уже начинаю понимать.
Вот например добавил новый пункт во внутренне меню
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

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

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

Как создать свой интерфейс? 8 года 10 мес. назад #88892

  • Amphilohiy
  • Amphilohiy аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 547
  • Спасибо получено: 666
  • 2 место ГотвУчительОраторПобедитель Сбитой кодировкиПрограммист Ruby
Ну в целом можно добавить это так:
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
А потом послушаем цербера, и перепишем все в:
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? Кхм, есть небольшая трабла. Можно запихать метод в класс:
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% случаев это чья-то криворукость.
Последнее редактирование: 8 года 10 мес. назад от Amphilohiy.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Seibur, ierecumi

Как создать свой интерфейс? 8 года 10 мес. назад #88909

  • ierecumi
  • ierecumi аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
Боюсь, что к самостоятельной работе я пока ещё не готов =)

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

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

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

НЕ! Сегодня я уже точно не соображу ни чего.
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #88911

  • Amphilohiy
  • Amphilohiy аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 547
  • Спасибо получено: 666
  • 2 место ГотвУчительОраторПобедитель Сбитой кодировкиПрограммист Ruby
ierecumi пишет:
Я переделал немного твой код:
Ты запихал метод в Scene_Menu, а не в Windows_Mine? Так тоже можно, тогда будет даже чутка проще
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

Как создать свой интерфейс? 8 года 10 мес. назад #88914

  • ierecumi
  • ierecumi аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
Ура!!! :whistle:Ура!!! :whistle:Ура!!! :whistle:
Ура!!! Всё заработало как надо.
Всем огромное спасибо за проделанную работу.
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #88916

  • Amphilohiy
  • Amphilohiy аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 547
  • Спасибо получено: 666
  • 2 место ГотвУчительОраторПобедитель Сбитой кодировкиПрограммист Ruby
Собственно говоря, тебя же еще интересует вывод всякой всячины в окно? У твоего окна есть свойство contents. Это Bitmap, справку по нему ты найдешь в... справке.
Что касается всяких игроков, партий, предметов и прочего, то это смотри в классах, начинающихся с Game_*. Как правило такие классы сразу объявляются в глобальном пространстве, и их имена можно найти в модуле DataManager (метод create_game_objects). Дальше уже по конкретике - что именно и куда именно.
Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #89034

  • ierecumi
  • ierecumi аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
с картинками разобрался
если кому интересно вот!
#====================картинка===================================================
    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
А после закрытия окна всё остаётся черным.
SceneManager.call(Scene_UpWeapon)
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
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #89035

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • Проект месяца 3 место3 место ГотвПрограммист JavaScript Победитель Сбитой кодировкиОрганизатор конкурсовПисатель 3 место2 место Проект месяца 2 место2 место Сбитая кодировка3 место
Потому что надо не только окно закрывать, а ещё и на предыдущую сцену возвращаться - SceneManager.return.
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #89036

  • ierecumi
  • ierecumi аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
Помогите сформулировать выражение правильно
  def update
    super
      if экипировано ID_Weapon
      then
      бла,бла,бла!
    end
  end
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #89038

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • Проект месяца 3 место3 место ГотвПрограммист JavaScript Победитель Сбитой кодировкиОрганизатор конкурсовПисатель 3 место2 место Проект месяца 2 место2 место Сбитая кодировка3 место
Копать в сторону Game_Actor (за свойством "экипировано") и $game_actors либо $game_party (за выбором конкретного персонажа для проверки).
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #89039

  • ierecumi
  • ierecumi аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
Ругается на SceneManager.return
Вложения:
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #89047

  • ierecumi
  • ierecumi аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
видимо потому, что я изменил размеры экрана 640х480
пришлось свой Viewport создавать :laugh:
вот решение:
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
Администратор запретил публиковать записи гостям.

Как создать свой интерфейс? 8 года 10 мес. назад #89048

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Программист RubyУчительПроект месяца 1 местоОрганизатор конкурсовВетеран3 местоПроект месяца 2 место1 место в ГотвПисатель 3 место
Надеюсь, в последствии мы увидим демку. Мне хочется посидеть и вдумчиво поредактировать косяки ^_^
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.263 секунд