ГлавнаяФорумRPG MakerСкрипты/ПлагиныRPG Maker XPИзменённые системы сообщенийAdvanced Message Window v1.0
Войти на сайт
×
ТЕМА: Advanced Message Window v1.0
Advanced Message Window v1.0 15 года 10 мес. назад #24668
|
Advanced Message Window v1.0
Предисловие: Данный скрипт, расширяющий доступные методы вывода сообщения в RPG Maker XP, как и все, что вышло из под моей клавиатуры, является сырым и некачественным, изобилующим глюками и недоработками. Однако, оные звери достаточно успешно прячутся от моего взора, а потому обо всех найденных экземплярах следует немедленно сообщать - буду истреблять. Описание: Данный скрипт представляет собой новый класс для вывода текстовых сообщений. Умеет показывать лица любых размеров, как из файла, так и из набора лиц, а так же выводить имя говорящего. Кроме того самостоятельно переносит не помещающиеся строки и оборудован прокруткой содержимого окна, так что в теории вы можете запихнуть в него текста на 65535 пикселей по высоте. Теоретически, потому что используется мой кривенький метод переноса из библиотеки EKLib, который все еще не научился быстро работать с большими объемами текста. Поэтому строго рекомендуется не выводить с помощью данного скрипта сообщения, длина которых превышает пять стандартных - будут заметные задержки. Ну, а если вы попытаетесь впихнуть сюда Войну и Мир, то игра благополучно закроется через десять секунд простоя. Кроме того, даже если в последствии скрипты будут модернизированы и задержки не будет, все же не рекомендуется собирать через чур длинные сообщения - это плохо скажется на динамичности игры. Теперь о грустном. Пока не реализована система замен и управления текстом (вернее, замены на каком то этапе, вдруг, перестали работать). А так же еще часть мелких, нужных в хозяйстве деталей. Все это обязательно появится, как только появится свободное время. Особенности: В следствии довольно сложных настроек данного скрипта, которых в будущем станет еще больше, пришлось написать отдельную программу, генерирующую код для вставки в Script... события. Программа не требует установки и проста в управлении. Умеет запоминать настройки, в неограниченном количестве, так что в целом использовать ее должно быть удобно. Любые предложения, как по скрипту, так и по проге будут рассмотрены и, возможно, реализованы (для особо внимательных: да, скриншоты от разных версий, но снимать заново было лень ^^). В следующих версиях планирую:
Требования:
Установка: В редакторе скриптов:
Настройка окна сообщений: В Script... события вставить следующий код (генерируется с помощью "Dialogue Builder.exe"): ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] $advance_message_window.set(ширина_окна, высота_окна, отступ_от_края, горизонтальное_положение, вертикальное_положение, высота_строк, непрозрачность_фона, массив_параметров_шрифта, имя_говорящего_или_индекс_персонажа, лицо_говорящего_или_индекс_в_пакете_лиц) (строго не рекомендуется вбивать руками) Вывод окна сообщений: В Script... события вставить следующий код (генерируется с помощью "Dialogue Builder.exe"): ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] $advance_message_window.open (массив_абзацев) (так же не рекомендуется вбивать руками) Внимание: В случае, если данное сообщение, идет в событии последним, что бы его закрытие не спровоцировало повторное обращение к событию, обязательно добавьте после вызова скрипта что-нибудь еще. К примеру, ожидание в течении одного кадра (wait 1). Связанные ссылки: Dialogue Bilder v1.3: Демоверсия: EKLib v2.1 EKLib Addon - Window Double v1.0 Скрипт: ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] class Window_Dialogue_Advance < Window_Base
#----------------------------------------------------------------------------
attr_accessor :text
#----------------------------------------------------------------------------
def initialize
super(20, 460 - 20, 600, 20)
self.z = 9998
self.back_opacity = 200
@align = 1
@v_align = 2
@width = 600
@height = 240
@string_height = 2
@font = Font.new
@font.change (24, false, true, Color.new(255, 255, 255), ["Times New Roman", "Arial"])
@name = ""
@face = nil
@number = nil
@choice = nil
@speaker_name = Window_Double.new(0, 0, 300, 32, 8, 4)
@speaker_face = Sprite.new
@speaker_name.visible = false
@speaker_face.visible = false
self.visible = false
self.active = false
end
#----------------------------------------------------------------------------
def dispose
@speaker_name.dispose
@speaker_face.dispose
super
end
#----------------------------------------------------------------------------
def set (width = 600, height = 240, space = 20, align = 1, v_align = 2,
s_height = 20, back_opacity = 200,
font = [24, false, true, Color.new(255, 255, 255), ["Times New Roman", "Arial"]],
name = "", face = nil, number = nil, choice = nil)
self.width = width # Ширина окна
self.back_opacity = back_opacity # Непрозрачность
@align = align # Горизонтальное положение окна
@v_align = v_align # Вертикальное положение окна
@height = height # Высота окна
@string_height = s_height # Высота строк
@font = Font.new # Шрифт
@font.change (font[0], font[1], font[2], font[3], font[4])
@number = number # Ввод номера
@choice = choice # Выбор
case @align # Горизонтальное положение окна
when 0 # Слева
self.x = space
when 1 # Посередине
self.x = 320 - self.width / 2
when 2 # Справа
self.x = 640 - self.width - space
end
case @v_align # Вертикальное положение окна
when 0 # Сверху
self.y = space
when 1 # Посередине
self.y = 240 - @height / 2
when 2 # Снизу
self.y = 480 - @height - space
end
if name.is_a?(Integer) # Имя по неомеру
@name = $game_actors[name].name
elsif name.is_a?(String)
@name = name # Имя по строке
end
if face.is_a?(Integer) # Лицо из пакета лиц по номеру
temp = []
temp.push_image_fragments ("Graphics/Faces/faces.png", face, 100, 100)
@face = temp[0]
elsif face.is_a?(String) # Лицо по названию файла
@face = face != "" ? Bitmap.new("Graphics/Faces/" + face) : ""
end
end
#----------------------------------------------------------------------------
def open (text, hyphen = true)
self.pause = true
@text = text
replace
$game_temp.message_window_showing = true
if hyphen
new_y = self.y
new_text = []
temp = Bitmap.new(@width - 32, 460 - 32)
temp.font = @font
for string in @text
hyphen_calc = temp.hyphen_draw_text (string, @width - 32, 0, 0, -1, true)
new_y += hyphen_calc[1]
for i in 0...hyphen_calc[0].size
new_text.push(hyphen_calc[0][i])
end
end
if @string_height < @font.size / 2 then @string_height = hyphen_calc[2] end
@text = new_text
end
clear
draw_text
self.visible = true
while self.height < @height
self.height += 10
Graphics.update
end
if @name
@speaker_name.contents.clear
@speaker_name.contents.font = @font
@speaker_name.width = @speaker_name.contents.text_size(@name).width + @speaker_name.x_space * 2
@speaker_name.height = @speaker_name.contents.text_size(@name).height + @speaker_name.y_space * 2
@speaker_name.x = @align != 2 ? self.x : self.x + self.width - @speaker_name.width
@speaker_name.y = @v_align != 0 ? self.y - @speaker_name.height : self.y + self.height
@speaker_name.back_opacity = self.back_opacity
@speaker_name.contents.draw_text(0, 0, @speaker_name.contents.width, @speaker_name.contents.height, @name)
@speaker_name.update
@speaker_name.visible = true
end
if @face
@speaker_face.bitmap = @face
@speaker_face.x = @align != 2 ? self.x : self.x + self.width - @speaker_face.bitmap.width
@speaker_face.mirror = @align != 2 ? false : true
@speaker_face.y = @v_align != 0 ? self.y - @speaker_face.bitmap.height : self.y + self.height
@speaker_face.y -= @speaker_name.height if @speaker_name.visible && @v_align != 0
@speaker_face.y += @speaker_name.height if @speaker_name.visible && @v_align == 0
@speaker_face.visible = true
end
self.active = true
update
end
#----------------------------------------------------------------------------
def close
@speaker_name.visible = false
@speaker_face.visible = false
self.active = false
self.pause = false
y = self.y
while self.height > 32
self.height -= 10
self.y += 10
Graphics.update
end
self.visible = false
self.y = y
self.ox = 0
self.oy = 0
$game_temp.message_window_showing = false
end
#----------------------------------------------------------------------------
def replace
for string in @text
string.gsub!(/\\[Nn]\[([0-9]+)\]/) do
$game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
end
string.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
string.gsub!(/\\[Ee]\[([0-9]+)\]/) do
$data_enemies[$1.to_i] != nil ? $data_enemies[$1.to_i].name : ""
end
string.gsub!(/\\[Qq]\[([0-9]+)\]/) do
$data_classes[$data_actors[$1.to_i].class_id] != nil ?
$data_classes[$data_actors[$1.to_i].class_id].name : ""
end
string.gsub!(/\\[Uu]/) do
$game_map.name != nil ? $game_map.name : ""
end
end
end
#----------------------------------------------------------------------------
def clear
@text.delete("\260")
@text.delete("\n")
end
#----------------------------------------------------------------------------
def draw_text
self.contents = Bitmap.new(self.width - 32, @string_height * @text.size)
self.contents.font = @font
for i in 0...@text.size
if @string_height < (@font.size.to_f / 1.2).to_f
@string_height = self.contents.text_size(@text[i]).height
end
self.contents.draw_text (0, 0 + @string_height * i, 600, @string_height, @text[i])
end
end
#----------------------------------------------------------------------------
def update
return unless $game_temp.message_window_showing
loop do
Graphics.update
Input.update
super
if Input.trigger?(Input::C)
close
break
elsif Input.repeat?(Input::DOWN)
if self.oy < (@string_height * @text.size - self.height / 1.2)
self.oy += @string_height
end
elsif Input.repeat?(Input::UP)
if self.oy > 0
self.oy -= @string_height
end
end
end
end
#----------------------------------------------------------------------------
end P.S.Прикрепленная "демоверсия", с которой были сняты скриншоты, являлась местом разработки скрипта, притензии по ней не принимаются(к примеру, невозможность войти в меню[исправлено]). Кстати, она является тем самым примером "как не надо делать", и показывает - что будет, если впихнуть слишком длинное сообщение. P.P.S. Со следующей версией скрипт переоформлю в своем традиционном стиле, с подробными комментариями, etc. P.P.P.S. Идеи, пожелания, багрепорты приветствуются. |
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто. В Ничто ты войди, во тьму, и пойми: Пока ты во тьме, не может она быть Ничем - ведь там ты.
Последнее редактирование: 15 года 10 мес. назад от Equilibrium Keeper.
Администратор запретил публиковать записи гостям.
|
Модераторы: NeKotZima
Время создания страницы: 0.480 секунд