Войти на сайт

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

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

[VX Ace] Фикс скрипта мыши 2 мес. 4 дн. назад #121717

  • Phileas
  • Phileas аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 60
  • Спасибо получено: 78
  • Проект месяца 3 место
Некоторым людям, особенно после выхода 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

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


Если у вас что-то не получается, что-то не работает - пишите в этой теме, постараюсь помочь.
Мой проект:
Эпидемия Магии

In my humble opinion [ Нажмите, чтобы развернуть ]


Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy, DarchanKaen, WhitePaper

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

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

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

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

Вариант 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. Дешёвый и сердитый. Просто переименуйте игру, чтобы в названии была одна латиница.

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