Войти на сайт

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

ТЕМА: [VX Ace] Фикс скрипта мыши

[VX Ace] Фикс скрипта мыши 3 года 1 мес. назад #121717

  • Phileas
  • Phileas аватар
  • Вне сайта
  • Мастер
  • Сообщений: 180
  • Спасибо получено: 269
  • Проект месяца 1 местоПроект месяца 3 местоВетеранПроект месяца 2 место
Некоторым людям, особенно после выхода MV, стало не хватать возможности манипулирования курсором мыши в проектах на VX Ace.

Однако многие скрипты мышей вызывают исключение при выходе на титульник через f12, потому что f12 просто вызывает скрипт Main, в котором вызывается SceneManager.run, где заново инициализируется вся база данных, что приводит к обращению переменной мыши в nil.

Выше был краткий пересказ проблемы, теперь расскажу, как я это вылечил.

Лечил я только 1 скрипт (под авторством Shaz), однако аналогичное решение должно помочь и другим таким скриптам.

Сначала приведу код самого скрипта (исправленный):
скрипт мыши [ Нажмите, чтобы развернуть ]


В скрипте я просто добавил в 130 строчку вот это:
return if $mouse == nil
Ещё я такой же код добавил в 208 строчку, но это, скорее всего, лишнее (данная функция вообще не должна вызваться, если переменная мыши не проинициализирована).

Однако это позволяет лишь избежать исключения. Как же нам "воскресить" мышь при перезапуске игры? Очень просто, надо всего лишь вызвать конструктор заново.

Заходим в SceneManager (в скриптах в самом верху списка), находим self.run.
Там добавляем одну строчку:
def self.run
    $mouse = Sprite_Mouse.new
    DataManager.init
    Audio.setup_midi if use_midi?
    @scene = first_scene_class.new
    @scene.main while @scene
  end

На всякий случай, уточню, я добавил вот эту строчку:
$mouse = Sprite_Mouse.new


UPD! (04.12.2022)
По просьбе форумчанина, добавил ещё вот такой код в скрипт:
module SceneManager
  def self.snapshot_for_background
    flag = $mouse.enabled?
    $mouse.enabled = false
    @background_bitmap.dispose if @background_bitmap
    @background_bitmap = Graphics.snap_to_bitmap
    @background_bitmap.blur
    $mouse.enabled = flag
  end
end

Он убирает курсор со скриншота экрана, который ставится фоном игрового меню. Может возникнуть конфликт с другим скриптом, который тоже переопределяет этот метод.

Также добавил исправление от Dmy, которое решает проблему игр с кириллицей в названии.


Собственно, всё. Вот пустой проект, в котором демонстрируется работа исправленного скрипта:
проект


Если у вас что-то не получается, что-то не работает - пишите в этой теме, постараюсь помочь.
Последнее редактирование: 1 год 4 мес. назад от Phileas.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy, DarchanKaen, Jas6666, WhitePaper

[VX Ace] Фикс скрипта мыши 3 года 1 мес. назад #121737

А какими припарками лечить вот такую ошибку? Ситуация одинаковая и в чистых проектах, и в тех, в которых есть другие скрипты. Преследует не только с этим скриптом, но и с аналогичным от Falcao. В чужих проектах всё нормально, но при перенесении в мои всё ломается.
Вложения:
Последнее редактирование: 3 года 1 мес. назад от Местами человек.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy

[VX Ace] Фикс скрипта мыши 3 года 1 мес. назад #121739

  • Dmy
  • Dmy аватар
  • Вне сайта
  • Заблокирован
  • Сообщений: 1142
  • Спасибо получено: 2477
  • Проект месяца 3 местоРазработчикУчительОраторЗа 2 место на конкурсе маппингаПаладинВетеранПрограммист RubyДаритель СтимкеяПоддержка Фонда
Местами человек пишет:
А какими припарками лечить вот такую ошибку? Ситуация одинаковая и в чистых проектах, и в тех, в которых есть другие скрипты.
У меня сейчас мейкера нет под рукой, но попробуйте такое:

Вариант 1. Не обещаю, что поможет, не проверял ещё. Проверил, работает.

Найдите вот этот отрезок кода:
  def self.hwnd
    if @hwnd.nil?
      title = "\0" * 256
      Readini.call('Game', 'Title', '', title, 255, '.\\Game.ini')
      title.delete!("\0")
      @hwnd = Findwindow.call('RGSS Player', title) 
      ShowCursor.call(0)
    end
    return @hwnd
  end

и перед строчкой title.delete!("\0") добавьте такую строчку:
title.force_encoding("ASCII-8bit")

Чтобы получилось вот так:
  def self.hwnd
    if @hwnd.nil?
      title = "\0" * 256
      Readini.call('Game', 'Title', '', title, 255, '.\\Game.ini')
      title.force_encoding("ASCII-8bit")
      title.delete!("\0")
      @hwnd = Findwindow.call('RGSS Player', title) 
      ShowCursor.call(0)
    end
    return @hwnd
  end

Не могу обещать, что это сработает, но попробовать стоит. Я проверил: это работает. @Phileas, если вам не сложно, добавьте и это исправление в свою версию скрипта?

Для других скриптов надо сделать похожие исправления (но вместо title там будет что-то другое). Лучше создайте отдельную тему для этой ошибки (или по отдельной теме на каждый скрипт) и укажите в ней сам скрипт (ещё лучше, если получится приложить проект-пример), я отвечу.

Вариант 2. Дешёвый и сердитый. Просто переименуйте игру, чтобы в названии была одна латиница.

Эта ошибка возникает из-за того, что авторы скрипта не тестировали его на названиях проектов, где есть какие-то буквы, кроме английской латиницы.
Последнее редактирование: 3 года 1 мес. назад от Dmy.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Jas6666, Cabbit, Phileas, Alx_Yago, Местами человек

[VX Ace] Фикс скрипта мыши 1 год 4 мес. назад #128444

  • Phileas
  • Phileas аватар
  • Вне сайта
  • Мастер
  • Сообщений: 180
  • Спасибо получено: 269
  • Проект месяца 1 местоПроект месяца 3 местоВетеранПроект месяца 2 место
Dmy, прошу прощения, я увидел новые сообщения в теме только сейчас) Мне почему-то не приходят письма о новых сообщениях.

Добавил ваше исправление.

Также, по просьбе одного форумчанина, убрал "призрак" курсора с фона игрового меню.

Обновил шапку темы и проект по ссылке.

Также рекомендую, по возможности, переходить на MV/MZ, где всё это работает из коробки. Ну а графику курсора можно поменять всякими плагинами, например, от DK. MZ всё ещё поддерживается разработчиками, а вот VX Ace со всеми своими проблемами безнадёжно в прошлом.
Последнее редактирование: 1 год 4 мес. назад от Phileas.
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.553 секунд