Well, I've come to ask for help from some of you with a system you have in hutommo_ace.
I've been working the Character System moves by coordinate the game mouse, get by even in my game "Scripts".
But if you can not make it work, the configuration is very complex.
Download: link
#==============================================================================
# ◆ Mouse_Position (Input)
#------------------------------------------------------------------------------
# マウスの座標を取得するオブジェクト (Input 内部で使用します。)
#==============================================================================
class Mouse_Position
#--------------------------------------------------------------------------
# ◆ (!※ Sem proibição ※!)
#--------------------------------------------------------------------------
def self.inherited( subclass )
__cannot_inherited( subclass )
end
private_class_method(:inherited)
#--------------------------------------------------------------------------
# ● Variável de instância pública
#--------------------------------------------------------------------------
attr_reader :x # マウス X 座標
attr_reader :y # マウス Y 座標
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@x = -1
@y = -1
@pos = "\x00" * 8
begin
# マウスカーソルの座標を取得
@getmouse = Win32API.new('WFInput','getMouseCursorPos','p','i')
# マウスカーソルをセット
@setmouse = Win32API.new('WFInput','setMouseCursorPos',%w(l l),'i')
# マウスカーソル表示
@show_cursor = Win32API.new('user32', 'ShowCursor', 'l', 'l')
rescue Exception
# 取得失敗
raise( LoadError , "cannot read modules.",caller(0))
end
# 画面外のとき、表示。 画面内のとき、非表示
@showing = true
end
#--------------------------------------------------------------------------
# ● マウスカーソルを表示
#--------------------------------------------------------------------------
def mouse_show
@show_cursor.call(1)
@showing = true
nil
end
#--------------------------------------------------------------------------
# ● マウスカーソルを非表示
#--------------------------------------------------------------------------
def mouse_hide
@show_cursor.call(0)
@showing = false
nil
end
#--------------------------------------------------------------------------
# ● Obter a posição do cursor do mouse
#--------------------------------------------------------------------------
def get_mouse_pos
unless Input.mouse_enabled?
# Quando não estiver usando o mouse
mouse_show
@x = -1
@y = -1
return false
end
unless (@getmouse.call(@pos)).zero?
# Quando há um cursor na tela
@x , @y = @pos.unpack('ll')
mouse_hide
return true
else
# Se não estiver na tela ou inválido
mouse_show
@x = -1
@y = -1
return false
end
end
#--------------------------------------------------------------------------
# ● Definir a posição do cursor do mouse
#--------------------------------------------------------------------------
def set_mouse_pos( x , y )
return false unless Input.mouse_enabled?
get_mouse_pos unless (@setmouse.call( x , y )).zero?
end
end
#==============================================================================
# ◆ Input (再定義) ( Global module )
#------------------------------------------------------------------------------
# 入力の再定義(追加)です。
#==============================================================================
#--------------------------------------------------------------------------
# ● Variável de classe
#--------------------------------------------------------------------------
@@keyboard = "\x00" * 256 # Buffer de chave
@@old_keyboard = @@keyboard.dup # Buffer de chave (entrada anterior)
@@nouse_mouse = "\x00" * 4
@@nouse_mouse2 = "\x00" * 20
# Botão do mouse
@@mouse_input = "\x00" * 20
# Roda
@@wheel = "\x00" * 4
begin
# API para copiar o estado da chave virtual para o buffer especificado
@@keyboard_state = Win32API.new('user32', 'GetKeyboardState', 'p', 'i')
# Aquisição: Teclado GetKeyBoardState (Win32API) Mouse DirectInput8
@@input_state = Win32API.new('WFInput','getInput', %w(p p p),'l')
rescue Exception
# Não foi possível obter
raise( LoadError , "cannot read modules.",caller(0))
end
begin
@@getpad = Win32API.new("winmm","joyGetPosEx", %w(l p), "l")
rescue Exception
# Não foi possível obter
raise( LoadError , "cannot read modules.(winmm.dll)",caller(0))
end
#Estrutura do joypad
@@joyinfo1 = "\x00" * 52
@@joyinfo2 = "\x00" * 52
# O estado do joypad
@@joy1 = []
@@joy2 = []
@@joybtn1 = 0
@@joybtn2 = 0
@@joybtn1p = 0
@@joybtn2p = 0
@@keyrepeat = Hash.new
@@joy1repeat = Hash.new
@@joy2repeat = Hash.new
@@keyrepeat.default = 0
@@joy1repeat.default = 0
@@joy2repeat.default = 0
@@key_repeat_flag = Hash.new
@@joy1_repeat_flag = Hash.new
@@joy2_repeat_flag = Hash.new
# Coordenadas do mouse
@@mouse = Mouse_Position.new
@@mouse_use = false
@@mouse_enabled = false
# A partir deste ponto, definido como uma função de módulo
module_function
end
#--------------------------------------------------------------------------
# ● Julgamento de usabilidade de mouse
#--------------------------------------------------------------------------
def mouse_enabled?
@@mouse_use
end
#--------------------------------------------------------------------------
# ● Julgamento de usabilidade de mouse
#--------------------------------------------------------------------------
def mouse_use=(mouse_use)
@@mouse_use = mouse_use ? true : false
nil
end
#--------------------------------------------------------------------------
# ● Coordenada X do mouse
#--------------------------------------------------------------------------
def mouse_x
@@mouse.x
end
#--------------------------------------------------------------------------
# ● Coordenada Y do mouse
#--------------------------------------------------------------------------
def mouse_y
@@mouse.y
end
#--------------------------------------------------------------------------
# ● Mostrar cursor do mouse
#--------------------------------------------------------------------------
def mouse_show
@@mouse.mouse_show
end
#--------------------------------------------------------------------------
# ● Obter rotação de roda
#--------------------------------------------------------------------------
def wheel_moved?
( self.wheel_move ).zero? ? false : true
end
#--------------------------------------------------------------------------
# ● Obter velocidade de rotação da roda
#--------------------------------------------------------------------------
def wheel_move
(@@wheel.unpack("l")).at(0)
end
#--------------------------------------------------------------------------
# ● Se o botão do mouse foi pressionado
#--------------------------------------------------------------------------
def di_mouse_press?( button )
if rpgvxace?
@@mouse_input[button].unpack("C").at(0) >= 0x92
else
@@mouse_input[button] >= 0x92
end
end
#--------------------------------------------------------------------------
# ● Conjunto de coordenadas do mouse
#--------------------------------------------------------------------------
def set_mouse_pos( x , y )
@@mouse.set_mouse_pos( x , y )
end
#--------------------------------------------------------------------------
# ● Obter status do joypad
#--------------------------------------------------------------------------
def joy_update( player = 0 )
ret = 0
if player.zero?
@@joy1_repeat_flag.clear
@@joybtn1p = @@joybtn1
@@joyinfo1 = [ 52 , 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].pack("I*")
if (ret = @@getpad.call( 0 , @@joyinfo1 )).zero?
@@joy1 = @@joyinfo1.unpack("I*")
btn = joy_cross_value( joy_dir8( 0 , 0))
@@joybtn1 = @@joy1.at(8)
@@joybtn1 |= btn
true
else
false
end
else
@@joy2_repeat_flag.clear
@@joybtn2p = @@joybtn2
@@joyinfo2 = [ 52 , 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].pack("I*")
if (ret = @@getpad.call( 1 , @@joyinfo2 )).zero?
@@joy2 = @@joyinfo2.unpack("I*")
btn = joy_cross_value( joy_dir8( 1 , 0))
@@joybtn2 = @@joy2.at(8)
@@joybtn2 |= btn
true
else
false
end
end
end
#--------------------------------------------------------------------------
# ● Atualização de quadro (teclado / mouse)
# ※ Nota: Existem chaves duplicadas.
#--------------------------------------------------------------------------
def exupdate
@@old_keyboard.replace( @@keyboard ) # 置き換えを強制
@@key_repeat_flag.clear
unless @@mouse.get_mouse_pos
# Rato inválido
if (@@keyboard_state.call( @@keyboard ) ).zero?
@@keyboard.replace( @@old_keyboard )
else
@@keyboard[Mouse::Left , 4 ] = @@nouse_mouse
@@old_keyboard[Mouse::Left , 4 ] = @@nouse_mouse
end
if @@mouse_enabled
@@mouse_enabled = false
@@keyboard[Mouse::Left , 4 ] = @@nouse_mouse
@@old_keyboard[Mouse::Left , 4 ] = @@nouse_mouse
@@wheel[ 0, 4] = @@nouse_mouse
@@mouse_input[0 , 20] = @@nouse_mouse2
end
else
# Mouse é eficaz
unless (@@input_state.call( @@keyboard , @@wheel , @@mouse_input )).zero?
# Não foi possível obter
#
end
@@mouse_enabled = true unless @@mouse_enabled
end
joy_update( 0 )
joy_update( 1 ) if JOYPAD_2P
nil
end
#--------------------------------------------------------------------------
# ● Atualização de quadros
#--------------------------------------------------------------------------
def allupdate
update
end
#--------------------------------------------------------------------------
# ● Se a chave específica do mouse está sendo pressionada (Win32API)
#--------------------------------------------------------------------------
def mouse_press?
return true if vk_press?( Mouse::Left )
return true if vk_press?( Mouse::Right )
return true if vk_press?( Mouse::Middle )
return false
end
#--------------------------------------------------------------------------
# ● Se a tecla específica do joypad está sendo pressionada atualmente
#--------------------------------------------------------------------------
def joy_press?( key , player = 0 )
return false unless JOYPAD[key]
if player.zero?
return (JOYPAD[key] & @@joybtn1).zero? ? false : true
else
return (JOYPAD[key] & @@joybtn2).zero? ? false : true
end
end
#--------------------------------------------------------------------------
# ● Se uma tecla específica do joypad é pressionada novamente
#--------------------------------------------------------------------------
def joy_trigger?( key , player = 0 )
return false unless JOYPAD[key]
if player.zero?
if (JOYPAD[key] & @@joybtn1p).zero?
return (JOYPAD[key] & @@joybtn1).zero? ? false : true
else
return false
end
else
if (JOYPAD[key] & @@joybtn2p).zero?
return (JOYPAD[key] & @@joybtn2).zero? ? false : true
else
return false
end
end
end
#--------------------------------------------------------------------------
# ● Se a tecla específica do joypad está sendo pressionada ou não
#--------------------------------------------------------------------------
def joy_repeat?( key , player = 0 )
return false unless JOYPAD[key]
if player.zero?
if (JOYPAD[key] & @@joybtn1p).zero?
v = (JOYPAD[key] & @@joybtn1).zero? ? false : true
@@joy1repeat[key] = 0
else
v = (JOYPAD[key] & @@joybtn1).zero? ? false : true
if v
unless @@joy1_repeat_flag[key]
@@joy1repeat[key] += 1
@@joy1_repeat_flag[key] = true
end
else
@@joy1repeat[key] = 0
end
v = repeat_true?( @@joy1repeat[key] , v )
end
else
if (JOYPAD[key] & @@joybtn2p).zero?
v = (JOYPAD[key] & @@joybtn2).zero? ? false : true
@@joy2repeat[key] = 0
else
v = (JOYPAD[key] & @@joybtn2).zero? ? false : true
if v
unless @@joy2_repeat_flag[key]
@@joy2repeat[key] += 1
@@joy2_repeat_flag[key] = true
end
else
@@joy2repeat[key] = 0
end
v = repeat_true?( @@joy2repeat[key] , v )
end
end
v
end
#--------------------------------------------------------------------------
# ● Entrada de 4 vias do joypad
#--------------------------------------------------------------------------
def joy_dir4( player = 0 , axis = 0)
x, y = axis.zero? ? get_xy(player) :
(axis == 1 ? get_zr(player) : get_uv(player))
return 0 if x.abs == y.abs
if x.abs > y.abs
if x > 0
return 6
elsif x < 0
return 4
else
return 0 # x = 0 -> y = 0
end
elsif y > 0
return 2
elsif y < 0
return 8
else
return 0 # y = 0 -> x = 0
end
end
#--------------------------------------------------------------------------
# ● Entrada de direção do Joypad 8
#--------------------------------------------------------------------------
def joy_dir8( player = 0 , axis = 0)
x, y = axis.zero? ? get_xy(player) :
(axis == 1 ? get_zr(player) : get_uv(player))
unless x.zero?
arg = ( Math.atan( y.to_f / x.to_f ) * 8 ) / Math::PI
if arg < -3
return x > 0 ? 8 : 2
elsif arg < -1
return x > 0 ? 9 : 1
elsif arg < 1
return x > 0 ? 6 : 4
elsif arg < 3
return x > 0 ? 3 : 7
else
return x > 0 ? 2 : 8
end
else
if y > 0
return 2
elsif y < 0
return 8
else
return 0
end
end
end
#--------------------------------------------------------------------------
# ● POV O estado
#--------------------------------------------------------------------------
def getpov(player = 0)
player.zero? ? @@joy1.at(10) : @@joy2.at(10)
end
#--------------------------------------------------------------------------
# ● POV Entrada de direção do State Joypad 8
#--------------------------------------------------------------------------
def pov2joy8(player = 0)
pos = getpov(player)
if pos <= 2250
8
elsif pos <= 6750
9
elsif pos <= 11250
6
elsif pos <= 15750
3
elsif pos <= 20250
2
elsif pos <= 24750
1
elsif pos <= 29250
4
elsif pos <= 33750
7
elsif pos < 36000
8
else
0
end
end
#--------------------------------------------------------------------------
# ● Se uma tecla específica no teclado está sendo pressionada atualmente
#--------------------------------------------------------------------------
def vk_press?( key )
if rpgvxace?
@@keyboard[ key ].unpack("C").at(0) >= 0x92
else
@@keyboard[ key ] >= 0x92
end
end
#--------------------------------------------------------------------------
# ● Se uma tecla específica no teclado é pressionada recentemente
#--------------------------------------------------------------------------
def vk_trigger?( key )
if rpgvxace?
unless @@old_keyboard[ key ].unpack("C").at(0) >= 0x92
@@keyboard[ key ].unpack("C").at(0) >= 0x92
else
false
end
else
unless @@old_keyboard[ key ] >= 0x92
@@keyboard[ key ] >= 0x92
else
false
end
end
end
#--------------------------------------------------------------------------
# ● Se uma tecla específica no teclado está sendo pressionada ou não
#--------------------------------------------------------------------------
def vk_repeat?( key )
if rpgvxace?
unless @@old_keyboard[ key ].unpack("C").at(0) >= 0x92
v = @@keyboard[ key ].unpack("C").at(0) >= 0x92
@@keyrepeat[key] = 0
else
v = @@keyboard[ key ].unpack("C").at(0) >= 0x92
if v
unless @@key_repeat_flag[key]
@@keyrepeat[key] += 1
@@key_repeat_flag[key] = true
end
else
@@keyrepeat[key] = 0
end
v = repeat_true?( @@keyrepeat[key] , v )
end
else
unless @@old_keyboard[ key ] >= 0x92
v = @@keyboard[ key ] >= 0x92
@@keyrepeat[key] = 0
else
v = @@keyboard[ key ] >= 0x92
if v
unless @@key_repeat_flag[key]
@@keyrepeat[key] += 1
@@key_repeat_flag[key] = true
end
else
@@keyrepeat[key] = 0
end
v = repeat_true?( @@keyrepeat[key] , v )
end
end
v
end
#--------------------------------------------------------------------------
# ● Se há entrada de teclado
#--------------------------------------------------------------------------
def vk_input?
if rpgvxace?
input_num = -1
until (input_num = @@keyboard.index(VK_INPUT_MATCH),(input_num + 1)).nil?
return true if input_num != '0x19' and input_num.unpack("C").at(0) < 0xf0
end
false
else
input_num = -1
until (input_num = @@keyboard.index(VK_INPUT_MATCH),(input_num + 1)).nil?
return true if input_num != 0x19 and input_num < 0xf0
end
false
end
end
#--------------------------------------------------------------------------
# ● Se há entrada de teclado
#--------------------------------------------------------------------------
def vk_input_num
if rpgvxace?
input_num = -1
until (input_num = @@keyboard.index(VK_INPUT_MATCH),(input_num + 1)).nil?
return input_num if input_num != 0x19 and input_num.unpack("C").at(0) < 0xf0
end
0
else
input_num = -1
until (input_num = @@keyboard.index(VK_INPUT_MATCH),(input_num + 1)).nil?
return input_num if input_num != 0x19 and input_num < 0xf0
end
0
end
end
#--------------------------------------------------------------------------
# ● Entrada de teclado de saída
#--------------------------------------------------------------------------
def vk_input_list
result = []
val = -1
i = 0
until ( val = @@keyboard.index(VK_INPUT_MATCH,(val + 1))).nil?
val = rpgvxace? ? val.unpack("C").at(0) : val
if val >= 0xf0
break
elsif val == 0x19
next
elsif val >= 0x10 and val <= 0x12
# Shift Ctrl Alt caso (Input.VK_press?)
result[i] = val
else
unless @@old_keyboard[ val ] >= 0x92
# Qualquer outra entrada válida (Input.VK_trigger?)
result[i] = val
end
end
i += 1
end
result
end
#--------------------------------------------------------------------------
# ● Caps Lock O estado
#--------------------------------------------------------------------------
def caps_lock?
if rpgvxace?
@@keyboard[ VK_CAPS ].unpack("C").at(0) & 0x01 == 0x01
else
@@keyboard[ VK_CAPS ] & 0x01 == 0x01
end
end
#--------------------------------------------------------------------------
# ● Limpar informações de entrada do teclado
#--------------------------------------------------------------------------
def vk_clear
@@keyboard = "\x00" * 256
@@old_keyboard.replace( @@keyboard ) # Substituição de força
nil
end
#--------------------------------------------------------------------------
# ● Entrar determinação da chave
#--------------------------------------------------------------------------
def decision_trigger?
trigger?(DECISION_KEY)
end
#--------------------------------------------------------------------------
# ● Cancelar determinação da entrada principal
#--------------------------------------------------------------------------
def cancel_trigger?
trigger?(CANCEL_KEY)
end
#--------------------------------------------------------------------------
# ● Chave de decisão ou decisão Determinação de entrada de clique do mouse
#--------------------------------------------------------------------------
def decition_with_mouse?
trigger?(DECISION_KEY) or vk_trigger?(DECISION_MOUSE_CLICK)
end
#--------------------------------------------------------------------------
# ● Cancelar chave ou cancelar o julgamento da entrada do clique do mouse
#--------------------------------------------------------------------------
def cancel_with_mouse?
trigger?(CANCEL_KEY) or vk_trigger?(CANCEL_MOUSE_CLICK)
end
#--------------------------------------------------------------------------
# ◆ Obter coordenadas x, y
#--------------------------------------------------------------------------
def get_xy( player = 0 )
if player.zero?
x = @@joy1.at(2) - 32767
y = @@joy1.at(3) - 32767
else
x = @@joy2.at(2) - 32767
y = @@joy2.at(3) - 32767
end
x = 0 if x.abs < MINIMUM_LEVEL
y = 0 if y.abs < MINIMUM_LEVEL
return x, y
end
#--------------------------------------------------------------------------
# ◆ Obter coordenadas z, r
#--------------------------------------------------------------------------
def get_zr( player = 0 )
if player.zero?
z = @@joy1.at(4) - 32767
r = @@joy1.at(5) - 32767
else
z = @@joy2.at(4) - 32767
r = @@joy2.at(5) - 32767
end
z = 0 if z.abs < MINIMUM_LEVEL
r = 0 if r.abs < MINIMUM_LEVEL
return z, r
end
#--------------------------------------------------------------------------
# ◆ u,v座標を取得
#--------------------------------------------------------------------------
def get_uv( player = 0 )
if player.zero?
u = @@joy1.at(6) - 32767
v = @@joy1.at(7) - 32767
else
u = @@joy2.at(6) - 32767
v = @@joy2.at(7) - 32767
end
u = 0 if u.abs < MINIMUM_LEVEL
v = 0 if v.abs < MINIMUM_LEVEL
return u, v
end
#--------------------------------------------------------------------------
# ◆ x,y,z座標を取得
#--------------------------------------------------------------------------
def get_xyz( player = 0 )
if player.zero?
x = @@joy1.at(2) - 32767
y = @@joy1.at(3) - 32767
z = @@joy1.at(4) - 32767
else
x = @@joy2.at(2) - 32767
y = @@joy2.at(3) - 32767
z = @@joy2.at(4) - 32767
end
p z
x = 0 if x.abs < MINIMUM_LEVEL
y = 0 if y.abs < MINIMUM_LEVEL
z = 0 if z.abs < MINIMUM_LEVEL
return x, y, z
end
#--------------------------------------------------------------------------
# ◆ r,u,v座標を取得
#--------------------------------------------------------------------------
def get_ruv( player = 0 )
if player.zero?
r = @@joy1.at(5) - 32767
u = @@joy1.at(6) - 32767
v = @@joy1.at(7) - 32767
else
r = @@joy2.at(5) - 32767
u = @@joy2.at(6) - 32767
v = @@joy2.at(7) - 32767
end
r = 0 if r.abs < MINIMUM_LEVEL
u = 0 if u.abs < MINIMUM_LEVEL
v = 0 if v.abs < MINIMUM_LEVEL
return r, u, v
end
#--------------------------------------------------------------------------
# ◆ ジョイパッドの方向を変換
#--------------------------------------------------------------------------
def joy_cross_value( value )
case value
when 1
return (JOYPAD[DOWN] | JOYPAD[LEFT])
when 2
return JOYPAD[DOWN]
when 3
return (JOYPAD[DOWN] | JOYPAD[RIGHT])
when 4
return JOYPAD[LEFT]
when 6
return JOYPAD[RIGHT]
when 7
return (JOYPAD[UP] | JOYPAD[LEFT])
when 8
return JOYPAD[UP]
when 9
return (JOYPAD[UP] | JOYPAD[RIGHT])
else
return 0
end
So my game exchange data with server and from what I can understand is that the system interprets the mouse coordinates and moves in such a direction.
#--------------------------------------------------------------------------
# * Checks the status of the directional buttons, translates the data into
# a specialized 4-direction input format, and returns the number pad
# equivalent (2, 4, 6, 8).
#
# If no directional buttons are being pressed (or the equivalent), returns 0.
#--------------------------------------------------------------------------
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 2 if self.press?(KEYMAP[:LETTER_S])
return 4 if self.press?(KEYMAP[:LETTER_A])
return 6 if self.press?(KEYMAP[:LETTER_D])
return 8 if self.press?(KEYMAP[:LETTER_W])
return 0
end
So it would be easier to use this system since the addresses are already being sent to the server when the mouse is pressed in such a coord. it converts the mouse coord into self.dir4.