Добро пожаловать,
Гость
|
ТЕМА: [RMXP] -HtMaL(AG47)- (Test Name)
[RMXP] -HtMaL(AG47)- (Test Name) 29.04.2013 19:47 #3707
|
А, вот как, ясненько)
Ну, тебе право виднее, у меня сложилось впечатление, что игра ближе не к РПГ, а к визуальной новелле. Сейчас, когда уже есть наработки, это звучит даже не как предложение перехода на другой двиг, а просто как мысль удивления! |
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 29.04.2013 21:37 #3710
|
Не совсем понял, что требуется, но...
Набросал небольшой скриптик вывода диалоговых сообщений. Вывод сообщений: if $scene2 == nil
$scene2 = DialogMessageScene.new
end
$scene2.show_msg("Greetings", -1) Соответственно "Greetings" это имя блока. -1 - параметр. Если 1-й параметр -1, то выводятся все сообщения блока по очереди. Если 1-й параметр nil, то выводится случайное сообщение из набора. Если 1-й параметр -- что-то другое, то выводится сообщение с соответствующим ключом. Если 1-й параметр циферка которая больше или равна нулю, то выводится сообщение с порядковым номером в списке блока, смотря какая цифра. Ключ - то, что до знака равно. Например: "block_name=Greetings" Ключ - "block_name" В функцию show_msg ключ передается обязательно в кавычках. Т.к. строка. Или без кавычек, если как цифра-порядковый номер. 1-й записью каждого блока должно быть: "block_name=имя блока сообщений" Под спойлером код. По этой ссылке есть проект с демонстрацией, если нужно. Возможно код кривоват. Но работать должен. ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] Раздел "Блоки с сообщениями" (тут задаются блоки сообщений) class DialogMessageContainer
DIALOGS = [
[ "block_name=Greetings",
"hello=Привет",
"good_af=Добрый день.",
"weather=Отличная погодка. Не правда ли?",
"where_go=Доброго дня. Куда направляетесь?"
],
[ "block_name=Story",
"About me=Я простой воин. Я ничего не знаю!",
"About region=Какой регион? Где мы вообще?"
]
];
end class DialogMessageContainer
def initialize
@active_blockname = nil
@data = Hash.new
load_blocks()
end
def split_pair_str(str)
pair = ["", ""]
c = 0
for i in 0...str.length
if str[i].chr == "=" and c < 1
c += 1
else
pair[c] += str[i].chr
end
end
return pair
end
# Загрузка диалогов из массива DIALOGS
def load_blocks
for block in DIALOGS
for param in block
pair = split_pair_str(param)
if(pair[0] == "block_name")
add_block(pair[1])
@active_blockname = pair[1]
elsif @active_blockname != nil and @active_blockname.is_a?(String)
add_msg(@active_blockname, pair[0], pair[1])
end
end
@active_blockname = nil
end
end
def add_block(block_id)
@data[block_id] = Hash.new
end
def add_msg(block_id, msg_id, msg)
if @data.has_key?(block_id)
@data[block_id][msg_id] = msg
else
add_block(block_id)
@data[block_id][msg_id] = msg
end
end
def get_msg(block_id, msg_id)
if [email protected]_key?(block_id) or !@data[block_id].has_key?(msg_id)
return nil
else
return @data[block_id][msg_id]
end
end
def get_msg_by_index(block_id, index)
if [email protected]_key?(block_id) or @data[block_id].values.size <= index
return nil
else
return @data[block_id].values[index]
end
end
def get_msg_rand(block_id)
if @data.has_key?(block_id)
msg_ind = rand(@data[block_id].size)
return get_msg_by_index(block_id, msg_ind)
else
return nil
end
end
end class DialogMessageScene
def initialize
@mode = 0
@index = 0
@hidden = true
@dlg_container = DialogMessageContainer.new
end
def show_msg(block_id, key)
if @hidden == true
if key == nil
$game_temp.message_text = @dlg_container.get_msg_rand(block_id)
elsif key == -1
@mode = 1 # Вывод всего блока по порядку
$game_temp.message_text = @dlg_container.get_msg_by_index(block_id, @index)
@index += 1
if $game_temp.message_text != nil
return
end
switch_msg
else
if key.is_a?(Integer)
$game_temp.message_text = @dlg_container.get_msg_by_index(block_id, key)
elsif key.is_a?(String)
$game_temp.message_text = @dlg_container.get_msg(block_id, key)
end
end
@hidden = false
else
switch_msg
end
end
def switch_msg
if @mode == 1
@mode = 0
@index = 0
else
$game_temp.message_text = nil
end
$scene2 = nil
end
end |
Последнее редактирование: 29.04.2013 21:41 от Lekste.
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 29.04.2013 22:05 #3711
|
Ты всё ещё неправильно понял концепт, Lekste.
Для того, чтобы сделать всё необходимое, мне нужно запускать сообщения из-под конкретной сцены, сделанной на базе Window_Command. К примеру, вот схема выбора блока сообщений: ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #===============================================================================
# ** Talk
#-------------------------------------------------------------------------------
# This script contains "Talk" Access.
#===============================================================================
class Scene_Talk
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Не обязательный элемент (необходим для создания прозрачности и ликвидации чарсетов с бэкграунда)
@map_battleback = Spriteset_Map.new
@map_battleback.delete_characters if REMOVE_CLASSES.size > 0
# Make command window
s1 = "Один"
s2 = "Два"
s3 = "Три"
@command_window = Window_Command.new(240, [s1, s2, s3])
@command_window.x = 660 - @command_window.width / 2
@command_window.y = 400 - @command_window.height / 2
@command_window.back_opacity = 200
# Execute transition
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame Update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of window
@map_battleback.dispose
@command_window.dispose
# If switching to title screen
if $scene.is_a?(Scene_Title)
# Fade out screen
Graphics.transition
Graphics.freeze
end
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update command window
@command_window.update
# If B button was pressed
if Keys.trigger?(0x32)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
elsif Keys.trigger?(0x1B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
end
# If C button was pressed
if Keys.trigger?(0x0D)
# Branch by command window cursor position
case @command_window.index
when 0 #1
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Отсюда должен запускаться блок 1
$scene = Scene_Map.new
when 1 #2
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Отсюда должен запускаться блок 2
$scene = Scene_Map.new
when 2 #3
# Play decision SE
$game_system.se_play($data_system.decision_se)
$scene = Scene_Map.new
end
return
end
end Но проблема в том, что сообщения из-под сцен не запускаются. Я уже пыталась попробовать запускать их через параллельный коммон-ивент после выбора команды, однако это потерпело неудачу. Твоя схема тоже не возымела действия - она направлена на запуск с игрового поля, но не со скрипта, а сама схема больше напоминает систему скриптовых сокращений запуска диалогов в игре, а не запуска самих сообщений скриптом. Возможно, что ты не до конца меня понял, но это нормально. А пока - небольшой апдейт скриншотами - обработанная и модифицированная для проекта Scene_Name: Теперь в проекте можно легко печатать имена при помощи клавиатуры - также этот скрипт поддерживает часть символики, однако существует одна весомая проблема, которая мной не может быть решена - это переход между русской раскладкой и английской. Если найдётся человек, который будет способен доработать эту систему, то я буду очень благодарна. |
Проект-HtMaL(AG47)-
NST: Серьёзные недоработки в активном интерфейсе. PST: Системный сбой. Критическое состояние. PDT: Анонс маловероятен. Yin
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 30.04.2013 15:14 #3720
|
Похоже я наконец понял что имелось ввиду.
Т.е. нужно перенести обработку и обновление диалогового окна в сцену, код которой под спойлером? Или сделать отдельную сцену, которая будет отображать сообщения? Через параллельный ивент сообщения не показываются, т.к. диалоговое окно обрабатывается в Scene_Map, а у вас значение переменной $scene заменяется на Scene_Talk. Т.е. Scene_Map перестает функционировать. Также есть такой вариант: # Отсюда должен запускаться блок 1 $scene = Scene_Map.new # Вывод сообщений Насчет переключения раскладки. Возможно смогу чем-то помочь, но нужно взглянуть на код. Здесь или по почте: Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript |
Последнее редактирование: 30.04.2013 15:16 от Lekste.
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 30.04.2013 15:31 #3721
|
Т.е. нужно перенести обработку и обновление диалогового окна в сцену, код которой под спойлером? Или сделать отдельную сцену, которая будет отображать сообщения? Рассматривается оба варианта, но второй с точки моего зрения предпочтительнее - однако здесь возникает вопрос в том, способна ли будет написанная система будет гармонировать с модифицированными системами сообщений. Насчет переключения раскладки. Возможно смогу чем-то помочь, но нужно взглянуть на код. Само собой: ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==============================================================================
# Modified Scene_Name
#==============================================================================
#==============================================================================
# ** Window_Instructions
#------------------------------------------------------------------------------
# This window displays full status specs on the status screen.
#==============================================================================
class Window_Instruction < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
#--------------------------------------------------------------------------
def initialize
super(0, 298, 800, 48)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.name = "Bangkok"
self.contents.font.size = 14
self.contents.font.color = normal_color
if Font.method_defined? :outline=
self.contents.font.outline = true
end
#Change this text to whatever instructions u want to have!
self.contents.draw_text(44, -8, 500, 32, "abc... = Ввод Текста")
self.contents.draw_text(186, -8, 500, 32, "Backspace = Удалить")
self.contents.draw_text(330, -8, 500, 32, "Space = Пробел")
self.contents.draw_text(440, -8, 500, 32, "Shift = Заглавная буква")
self.contents.draw_text(604, -8, 500, 32, "Enter = Завершить")
end
end
#==============================================================================
# ** Window_TextName
#------------------------------------------------------------------------------
# super (224, 32, 224, 80)
#==============================================================================
class Window_TextName < Window_Base
def initialize
super (290, 96, 220, 64)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
def refresh
self.contents.clear
self.contents.font.name = "Bangkok"
if Font.method_defined? :outline=
self.contents.font.outline = true
end
self.contents.font.size = 24
self.contents.font.color = normal_color
if $game_variables[245] == 0
self.contents.draw_text(-20, 0, 220, 32, "Ваше имя:", 1)
elsif $game_variables[245] == 1
self.contents.draw_text(-16, 0, 220, 32, "Ваша фамилия:", 1)
elsif $game_variables[245] == 2
self.contents.draw_text(-16, 0, 220, 32, "Имя дочери:", 1)
end
end
end
#==============================================================================
# ** Window_NameEdit
#------------------------------------------------------------------------------
# This window is used to edit your name on the input name screen.
#==============================================================================
class Window_NameEdit < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
# max_char : maximum number of characters
#--------------------------------------------------------------------------
def initialize(actor, max_char)
super(0, 236, 800, 64)
self.contents = Bitmap.new(width - 32, height - 32)
@actor = actor
@name = actor.name
@max_char = max_char
# Fit name within maximum number of characters
name_array = @name.split(//)[0...@max_char]
@name = ""
for i in 0...name_array.size
@name += name_array[i]
end
@default_name = @name
@index = name_array.size
refresh
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Return to Default Name
#--------------------------------------------------------------------------
def restore_default
@name = @default_name
@index = @name.split(//).size
refresh
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Add Character
# character : text character to be added
#--------------------------------------------------------------------------
def add(character)
if @index < @max_char and character != ""
@name += character
@index += 1
refresh
update_cursor_rect
end
end
#--------------------------------------------------------------------------
# * Delete Character
#--------------------------------------------------------------------------
def back
if @index > 0
# Delete 1 text character
name_array = @name.split(//)
@name = ""
for i in 0...name_array.size-1
@name += name_array[i]
end
@index -= 1
refresh
update_cursor_rect
end
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# Draw name
self.contents.font.size = 36
if Font.method_defined? :outline=
self.contents.font.outline = true
end
name_array = @name.split(//)
for i in 0...@max_char
c = name_array[i]
if c == nil
c = "_"
end
x = 400 - @max_char * 14 + i * 24
self.contents.draw_text(x, 0, 28, 42, c, 1)
end
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
x = 400 - @max_char * 14 + @index * 24
self.cursor_rect.set(x, 32, 20, 3)
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_cursor_rect
end
end
#==============================================================================
# ** Window_NameInput
#------------------------------------------------------------------------------
# This window is used to select text characters on the input name screen.
#==============================================================================
class Window_NameInput < Window_Base
CHARACTER_TABLE =
[
"", ""
]
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 128, 640, 0)
self.contents = Bitmap.new(width - 32, height - 32)
@index = 0
refresh
end
#--------------------------------------------------------------------------
# * Text Character Acquisition
#--------------------------------------------------------------------------
def character
return CHARACTER_TABLE[@index]
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
end
end
#==============================================================================
# ** Scene_Name
#------------------------------------------------------------------------------
# This class performs name input screen processing.
#==============================================================================
class Scene_Name
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Get actor
@actor = $game_actors[$game_temp.name_actor_id]
# Make windows
@edit_window = Window_NameEdit.new(@actor, $game_temp.name_max_char)
@edit_window.back_opacity = 160
@input_window = Window_NameInput.new
@inst_window = Window_Instruction.new
@inst_window.back_opacity = 160
@nametext_window = Window_TextName.new
@nametext_window.back_opacity = 160
@sprite = Sprite.new
@sprite.bitmap = RPG::Cache.title('Title0')
# Execute transition
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of windows
@edit_window.dispose
@input_window.dispose
@nametext_window.dispose
@inst_window.dispose
@spriteset.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update windows
@edit_window.update
@input_window.update
@nametext_window.update
@inst_window.update
# If C button was pressed
if Input.trigger?(Input::C)
# If cursor position is at [OK]
if @input_window.character == nil
# If name is empty
if @edit_window.name == ""
# If name is empty
if @edit_window.name == ""
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
return
end
# Change actor name
@actor.name = @edit_window.name
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to map screen
$scene = Scene_Map.new
return
end
# If cursor position is at maximum
if @edit_window.index == $game_temp.name_max_char
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# If text character is empty
if @input_window.character == ""
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Add text character
@edit_window.add(@input_window.character)
return
end
end
end
#==============================================================================
# ** Scene_Name Letters Modification
#------------------------------------------------------------------------------
# Makes you input stuff with the keyboard
#==============================================================================
class Scene_Name
alias name_input_update update
def update
(65...91).each{|i|
if Input.trigger?(i)
$game_system.se_play($data_system.decision_se)
let = Input::Key.index(i)
let = let.downcase unless Input.press?(Input::Key['Shift'])
@edit_window.add(let)
end}
(48...58).each{|i|
if Input.trigger?(i)
$game_system.se_play($data_system.decision_se)
let = Input::Key.index(i)
@edit_window.add(let)
end}
(186...192).each{|i|
if Input.trigger?(i)
$game_system.se_play($data_system.decision_se)
let = Input::Key.index(i)
@edit_window.add(let)
end}
(219...222).each{|i|
if Input.trigger?(i)
$game_system.se_play($data_system.decision_se)
let = Input::Key.index(i)
@edit_window.add(let)
end}
if Input.trigger?(Input::Key['Backspace'])
@edit_window.back
end
if Input.trigger?(Input::Key['Enter'])
# If name is empty
if @edit_window.name == ""
# Return to default name
@edit_window.restore_default
# If name is empty
if @edit_window.name == ""
# Play buzzer SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Play decision SE
$game_system.se_play($data_system.decision_se)
return
end
# Change actor name
@actor.name = @edit_window.name
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Switch to map screen
$scene = Scene_Map.new
end
if Input.trigger?(Input::Key['Space'])
@actor.name = @edit_window.name
$game_system.se_play($data_system.decision_se)
@edit_window.add(" ")
end
name_input_update
end
end Здесь используется стандарная схема управления от Близзарда, которая является частью ToA. ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] #==============================================================================
# Custom Game Controls
# Version: 4.1
#==============================================================================
# module Input
#==============================================================================
module Input
#----------------------------------------------------------------------------
# Simple ASCII table
#----------------------------------------------------------------------------
Key = {'A' => 65, 'B' => 66, 'C' => 67, 'D' => 68, 'E' => 69, 'F' => 70,
'G' => 71, 'H' => 72, 'I' => 73, 'J' => 74, 'K' => 75, 'L' => 76,
'M' => 77, 'N' => 78, 'O' => 79, 'P' => 80, 'Q' => 81, 'R' => 82,
'S' => 83, 'T' => 84, 'U' => 85, 'V' => 86, 'W' => 87, 'X' => 88,
'Y' => 89, 'Z' => 90,
'0' => 48, '1' => 49, '2' => 50, '3' => 51, '4' => 52, '5' => 53,
'6' => 54, '7' => 55, '8' => 56, '9' => 57,
'NumberPad 0' => 45, 'NumberPad 1' => 35, 'NumberPad 2' => 40,
'NumberPad 3' => 34, 'NumberPad 4' => 37, 'NumberPad 5' => 12,
'NumberPad 6' => 39, 'NumberPad 7' => 36, 'NumberPad 8' => 38,
'NumberPad 9' => 33,
'F1' => 112, 'F2' => 113, 'F3' => 114, 'F4' => 115, 'F5' => 116,
'F6' => 117, 'F7' => 118, 'F8' => 119, 'F9' => 120, 'F10' => 121,
'F11' => 122, 'F12' => 123,
';' => 186, '=' => 187, ',' => 188, '-' => 189, '.' => 190, '/' => 220,
'\\' => 191, '\'' => 222, '[' => 219, ']' => 221, '`' => 192,
'Backspace' => 8, 'Tab' => 9, 'Enter' => 13, 'Shift' => 16,
'Left Shift' => 160, 'Right Shift' => 161, 'Left Ctrl' => 162,
'Right Ctrl' => 163, 'Left Alt' => 164, 'Right Alt' => 165,
'Ctrl' => 17, 'Alt' => 18, 'Esc' => 27, 'Space' => 32, 'Page Up' => 33,
'Page Down' => 34, 'End' => 35, 'Home' => 36, 'Insert' => 45,
'Delete' => 46, 'Arrow Left' => 37, 'Arrow Up' => 38,
'Arrow Right' => 39, 'Arrow Down' => 40,
'Mouse Left' => 1, 'Mouse Right' => 2, 'Mouse Middle' => 4,
'Mouse 4' => 5, 'Mouse 5' => 6}
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# START Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
UP = [Key['Arrow Up']]
LEFT = [Key['Arrow Left']]
DOWN = [Key['Arrow Down']]
RIGHT = [Key['Arrow Right']]
A = [Key['Shift']]
B = [Key['Esc'], Key['NumberPad 0'], Key['X']]
C = [Key['Space'], Key['Enter'], Key['C']]
X = [Key['A']]
Y = [Key['S']]
Z = [Key['D']]
L = [Key['Q'], Key['Page Down']]
R = [Key['W'], Key['Page Up']]
F5 = [Key['F5']]
F6 = [Key['F6']]
F7 = [Key['F7']]
F8 = [Key['F8']]
F9 = [Key['F9']]
SHIFT = [Key['Shift']]
CTRL = [Key['Ctrl']]
ALT = [Key['Alt']]
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# All keys
KEY_COUNT = 256
ALL_KEYS = (0...KEY_COUNT).to_a
# Win32 API calls
GetKeyboardState = Win32API.new('user32', 'GetKeyboardState', 'P', 'I')
GetKeyboardLayout = Win32API.new('user32', 'GetKeyboardLayout', 'L', 'L')
MapVirtualKeyEx = Win32API.new('user32', 'MapVirtualKeyEx', 'IIL', 'I')
ToUnicodeEx = Win32API.new('user32', 'ToUnicodeEx', 'LLPPILL', 'L')
# some other constants
DOWN_STATE_MASK = 0x80
DEAD_KEY_MASK = 0x80000000
# data
@state = "\0" * KEY_COUNT
@triggered = Array.new(KEY_COUNT, false)
@pressed = Array.new(KEY_COUNT, false)
@released = Array.new(KEY_COUNT, false)
@repeatedKey = -1
@repeatedCount = 0
#----------------------------------------------------------------------------
# update
# Updates input.
#----------------------------------------------------------------------------
def self.update
# prevents usage with Blizz-ABS
if $BlizzABS
# error message
raise 'Blizz-ABS was detected! Please turn off Custom Controls in Tons of Add-ons!'
end
# get current language layout
@language_layout = GetKeyboardLayout.call(0)
# get new keyboard state
GetKeyboardState.call(@state)
# this special code is used because Ruby 1.9.x does not return a char
# when using String#[] but another String
key = 0
@state.each_byte {|byte|
# if pressed state
if (byte & DOWN_STATE_MASK) == DOWN_STATE_MASK
# not released anymore
@released[key] = false
# if not pressed yet
if !@pressed[key]
# pressed and triggered
@pressed[key] = true
@triggered[key] = true
@repeatedKey = key
@repeatedCount = 0
else
# not triggered anymore
@triggered[key] = false
end
# update of repeat counter
if key == @repeatedKey
@repeatedCount < 17 ? @repeatedCount += 1 : @repeatedCount = 15
end
# not released yet
elsif !@released[key]
# if still pressed
if @pressed[key]
# not triggered, pressed or repeated, but released
@triggered[key] = false
@pressed[key] = false
@released[key] = true
if key == @repeatedKey
@repeatedKey = -1
@repeatedCount = 0
end
end
else
# not released anymore
@released[key] = false
end
key += 1}
end
#----------------------------------------------------------------------------
# dir4
# 4 direction check.
#----------------------------------------------------------------------------
def self.dir4
return 2 if self.press?(DOWN)
return 4 if self.press?(LEFT)
return 6 if self.press?(RIGHT)
return 8 if self.press?(UP)
return 0
end
#----------------------------------------------------------------------------
# dir8
# 8 direction check.
#----------------------------------------------------------------------------
def self.dir8
down = self.press?(DOWN)
left = self.press?(LEFT)
return 1 if down && left
right = self.press?(RIGHT)
return 3 if down && right
up = self.press?(UP)
return 7 if up && left
return 9 if up && right
return 2 if down
return 4 if left
return 6 if right
return 8 if up
return 0
end
#----------------------------------------------------------------------------
# trigger?
# Test if key was triggered once.
#----------------------------------------------------------------------------
def self.trigger?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @triggered[key]}
end
#----------------------------------------------------------------------------
# press?
# Test if key is being pressed.
#----------------------------------------------------------------------------
def self.press?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @pressed[key]}
end
#----------------------------------------------------------------------------
# repeat?
# Test if key is being pressed for repeating.
#----------------------------------------------------------------------------
def self.repeat?(keys)
keys = [keys] unless keys.is_a?(Array)
return (@repeatedKey >= 0 && keys.include?(@repeatedKey) &&
(@repeatedCount == 1 || @repeatedCount == 16))
end
#----------------------------------------------------------------------------
# release?
# Test if key was released.
#----------------------------------------------------------------------------
def self.release?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @released[key]}
end
#----------------------------------------------------------------------------
# get_character
# vk - virtual key
# Gets the character from keyboard input using the input locale identifier
# (formerly called keyboard layout handles).
#----------------------------------------------------------------------------
def self.get_character(vk)
# get corresponding character from virtual key
c = MapVirtualKeyEx.call(vk, 2, @language_layout)
# stop if character is non-printable and not a dead key
return '' if c < 32 && (c & DEAD_KEY_MASK != DEAD_KEY_MASK)
# get scan code
vsc = MapVirtualKeyEx.call(vk, 0, @language_layout)
# result string is never longer than 4 bytes (Unicode)
result = "\0" * 4
# get input string from Win32 API
length = ToUnicodeEx.call(vk, vsc, @state, result, 4, 0, @language_layout)
return (length == 0 ? '' : result)
end
#----------------------------------------------------------------------------
# get_input_string
# Gets the string that was entered using the keyboard over the input locale
# identifier (formerly called keyboard layout handles).
#----------------------------------------------------------------------------
def self.get_input_string
result = ''
# check every key
ALL_KEYS.each {|key|
# if repeated
if self.repeat?(key)
# get character from keyboard state
c = self.get_character(key)
# add character if there is a character
result += c if c != ''
end}
# empty if result is empty
return '' if result == ''
# convert string from Unicode to UTF-8
return self.unicode_to_utf8(result)
end
#----------------------------------------------------------------------------
# unicode_to_utf8
# string - string in Unicode format
# Converts a string from Unicode format to UTF-8 format as RGSS does not
# support Unicode.
#----------------------------------------------------------------------------
def self.unicode_to_utf8(string)
result = ''
# L* format means a bunch of 4-byte wide-chars
string.unpack('L*').each {|c|
# characters under 0x80 are 1 byte characters
if c < 0x0080
result += c.chr
# other characters under 0x800 are 2 byte characters
elsif c < 0x0800
result += (0xC0 | (c >> 6)).chr
result += (0x80 | (c & 0x3F)).chr
# other characters under 0x10000 are 3 byte characters
elsif c < 0x10000
result += (0xE0 | (c >> 12)).chr
result += (0x80 | ((c >> 6) & 0x3F)).chr
result += (0x80 | (c & 0x3F)).chr
# other characters under 0x200000 are 4 byte characters
elsif c < 0x200000
result += (0xF0 | (c >> 18)).chr
result += (0x80 | ((c >> 12) & 0x3F)).chr
result += (0x80 | ((c >> 6) & 0x3F)).chr
result += (0x80 | (c & 0x3F)).chr
# other characters under 0x4000000 are 5 byte characters
elsif c < 0x4000000
result += (0xF8 | (c >> 24)).chr
result += (0x80 | ((c >> 18) & 0x3F)).chr
result += (0x80 | ((c >> 12) & 0x3F)).chr
result += (0x80 | ((c >> 6) & 0x3F)).chr
result += (0x80 | (c & 0x3F)).chr
# other characters under 0x80000000 are 6 byte characters
elsif c < 0x80000000
result += (0xFC | (c >> 30)).chr
result += (0x80 | ((c >> 24) & 0x3F)).chr
result += (0x80 | ((c >> 18) & 0x3F)).chr
result += (0x80 | ((c >> 12) & 0x3F)).chr
result += (0x80 | ((c >> 6) & 0x3F)).chr
result += (0x80 | (c & 0x3F)).chr
end}
return result
end
end |
Проект-HtMaL(AG47)-
NST: Серьёзные недоработки в активном интерфейсе. PST: Системный сбой. Критическое состояние. PDT: Анонс маловероятен. Yin
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 05.05.2013 21:52 #3761
|
Возможно поздно, но как-то так работает.
class Scene_Message
def initialize(block_id, key)
@mode = nil # режим показа сообщений
@key = key # идентификатор текущего сообщения
@block_id = block_id # идентификатор блока сообщений
$game_temp.message_text = nil
# Фоновое изображение
@bkgnd = Sprite.new(Viewport.new(0, 0, 640, 480))
#@bkgnd.bitmap = RPG::Cache.picture("pic")
@bkgnd.x = 0
@bkgnd.y = 0
# Объект-контейнер для блоков сообщений
@dlg_container = DialogMessageContainer.new
@mode = setup_mode(@key)
end
def setup_mode(key)
if key == nil
return 0
elsif key == -1
@key = 0
return 1
elsif key.is_a?(Integer)
return 2
elsif key.is_a?(String)
return 3
else
close
end
end
def execute
case @mode
when 0:
$game_temp.message_text = @dlg_container.get_msg_rand(@block_id)
when 1:
$game_temp.message_text = @dlg_container.get_msg_by_index(@block_id, @key)
if $game_temp.message_text == nil
close
end
when 2:
$game_temp.message_text = @dlg_container.get_msg_by_index(@block_id, @key)
when 3:
$game_temp.message_text = @dlg_container.get_msg(@block_id, @key)
end
end
# Команда "Показать след. сообщение"
# Если режим подразумевает лишь 1 сообщение, остановить показ
def next_msg
case @mode
when 1:
@key += 1
execute
return
end
close
end
def close
$scene = Scene_Map.new
end
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
@msg_win = Window_Message.new
# Execute transition
Graphics.transition
# Main loop
execute
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of windows
@msg_win.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update windows
@msg_win.update
update_key
end
def update_key
if Input.trigger?(Input::C)
next_msg
end
end
end Параметры вывода задаются как в пред. варианте, но передаются при создании SceneMessage. Например: $scene = Scene_Message.new("Greetings", nil) Результат: Выведется 1 случайное сообщение из блока "Greetings". К сожалению, я так и не вспомнил, как отключал очистку карты при смене сцены. Если вспомню, допишу. Насчет подсистемы ввода имени. Как называется система, из которой взят скрипт? |
Последнее редактирование: 05.05.2013 21:55 от Lekste.
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 06.05.2013 07:12 #3763
|
Возможно поздно, но как-то так работает. Никак не поздно - я всё равно сейчас занята написанием и модификацией интерфейса магазина под небольшой кастомный скрипт. Сегодня посмотрю и проверю работу внутри проекта. Насчет подсистемы ввода имени. Как называется система, из которой взят скрипт? Я не поняла основу вопроса. Этот скрипт полный и включает в себя все системы. Во втором скрипте - система управления и написания сообщений. |
Проект-HtMaL(AG47)-
NST: Серьёзные недоработки в активном интерфейсе. PST: Системный сбой. Критическое состояние. PDT: Анонс маловероятен. Yin
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 06.05.2013 18:47 #3768
|
Насчет подсистемы ввода имени.
Предлагаю такой вариант: 1) В модуль Input добавляем ассоциативный массив, содержащий символы языка. Например: KeyRus = {'A' => 'Ф', 'R' => 'К' } В данном случае, английской букве 'A' соответствует русская 'Ф' и т д. 2) В измененный Scene_Name добавляем функции инициализации и преобразования символа в активный язык: def initialize
@langs = ["RU", "EN"]
@active_lang_id = 0
end
def getActiveLangLetter(let)
case @langs[@active_lang_id]
when "RU":
new_let = Input::RusKey[let]
if new_let != nil
return new_let
end
end
return let
end Здесь, массив @langs содержит идентификаторы доступных языков, а @active_lang_id указывает номер текущего активного языка. Функция преобразования в зависимости от активного языка (проверка по идентификатору из массива), заменяет английский символ на, соответствующий ему, символ активного языка. Если соответствие не найдено (т.е. в данном случае, не найдено соответствие в массиве Input::RusKey), то вернется исходный англ. символ. В ином случае, вернется соответствующий русский символ. Таким образом, нет необходимости определять соответствие для всех клавиш, если их значение на текущем языке совпадает с англ. значением. Например, можно не определять соответствие для "C", т.к. на клавиатуре англ. "С" и русский "С" расположены на одной клавише и не отличаются по внешнему виду. Также не приходится переопределять спецсимволы такие, как #, $ и т д. Ну, и добавим комбинацию клавиш для переключения языка. Для этого добавим следующие строчки в функцию "update". if Input.press?(Input::Key['Shift'])
if Input.trigger?(Input::Key['Ctrl'])
@active_lang_id += 1
@active_lang_id %= @langs.size
end
end Например, после: if Input.trigger?(Input::Key['Backspace'])
@edit_window.back
end У меня все. Надеюсь, помог. |
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 07.05.2013 17:30 #3774
|
Я уже пробовала осуществлять сходную модель переключения между массивами, но это оказалось неработоспособным. Причина скорее всего кроется в этой части кода:
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] (65...91).each{|i|
if Input.trigger?(i)
$game_system.se_play($data_system.decision_se)
let = Input::Key.index(i)
let = let.downcase unless Input.press?(Input::Key['Shift'])
@edit_window.add(let)
end}
(48...58).each{|i|
if Input.trigger?(i)
$game_system.se_play($data_system.decision_se)
let = Input::Key.index(i)
@edit_window.add(let)
end}
(186...192).each{|i|
if Input.trigger?(i)
$game_system.se_play($data_system.decision_se)
let = Input::Key.index(i)
@edit_window.add(let)
end}
(219...222).each{|i|
if Input.trigger?(i)
$game_system.se_play($data_system.decision_se)
let = Input::Key.index(i)
@edit_window.add(let)
end} И кодом здесь: def getActiveLangLetter(let)
case @langs[@active_lang_id]
when "RU":
new_let = Input::RusKey[let]
if new_let != nil
return new_let
end
end
return let
end |
Проект-HtMaL(AG47)-
NST: Серьёзные недоработки в активном интерфейсе. PST: Системный сбой. Критическое состояние. PDT: Анонс маловероятен. Yin
Последнее редактирование: 07.05.2013 17:41 от Yin.
Администратор запретил публиковать записи.
|
[RMXP] -HtMaL(AG47)- (Test Name) 07.05.2013 17:45 #3775
|
Так мы же заменим "let = Input::Key.index(i)"
на "let = getActiveLangLetter(Input::Key.index(i))". Таким образом, полученный символ передастся в функцию и, в переменную let попадет измененный символ. Про "Больше букв". Так ведь на клавиатуре части русских букв соответствуют другие символы в англ. разметке. Думаю, единственная особенность здесь будет в двойном указании соответствия (для заглавной и строчной буквы) Например: '>' => 'Ю' '.' => 'ю' |
Последнее редактирование: 07.05.2013 17:52 от Lekste.
Администратор запретил публиковать записи.
|
Время создания страницы: 0.191 секунд