[VX Ace] Фикс скрипта мыши

Проект месяца 3 место Проект месяца 1 место Ветеран Проект месяца 2 место Проект года 3 место Разработчик
Больше
5 года 2 мес. назад - 3 года 5 мес. назад #121717 от Phileas
Некоторым людям, особенно после выхода MV, стало не хватать возможности манипулирования курсором мыши в проектах на VX Ace.

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

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

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

Сначала приведу код самого скрипта (исправленный):
скрипт мыши


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

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

Заходим в SceneManager (в скриптах в самом верху списка), находим self.run.
Там добавляем одну строчку:
Code:
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

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


UPD! (04.12.2022)
По просьбе форумчанина, добавил ещё вот такой код в скрипт:
Code:
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, которое решает проблему игр с кириллицей в названии.


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


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

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

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

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

Ветеран Поддержка Фонда Разработчик Проект месяца 3 место Учитель Оратор Даритель Стимкея 2 место За 2 место на конкурсе маппинга Программист Ruby Паладин
Больше
5 года 2 мес. назад - 5 года 2 мес. назад #121739 от Dmy
Dmy ответил в теме [VX Ace] Фикс скрипта мыши

Местами человек пишет: А какими припарками лечить вот такую ошибку? Ситуация одинаковая и в чистых проектах, и в тех, в которых есть другие скрипты.

[strike]У меня сейчас мейкера нет под рукой, но попробуйте такое:[/strike]

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

Найдите вот этот отрезок кода:
Code:
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") добавьте такую строчку:
Code:
title.force_encoding("ASCII-8bit")

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

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

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

Проект месяца 3 место Проект месяца 1 место Ветеран Проект месяца 2 место Проект года 3 место Разработчик
Больше
3 года 5 мес. назад - 3 года 5 мес. назад #128444 от Phileas
Dmy, прошу прощения, я увидел новые сообщения в теме только сейчас) Мне почему-то не приходят письма о новых сообщениях.

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

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

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

Также рекомендую, по возможности, переходить на MV/MZ, где всё это работает из коробки. Ну а графику курсора можно поменять всякими плагинами, например, от DK. MZ всё ещё поддерживается разработчиками, а вот VX Ace со всеми своими проблемами безнадёжно в прошлом.
Последнее редактирование: 3 года 5 мес. назад пользователем Phileas.

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

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