¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3930 miembros registrados.
El último usuario registrado es LKendo.

Nuestros miembros han publicado un total de 83411 mensajes en 11868 argumentos.
Navega con Google Chrome
[DESCARGA]

(Ayuda con script) Desactivar flechas direccionales y usar WASD

 :: RPG Maker :: Scripts :: Pedidos

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP (Ayuda con script) Desactivar flechas direccionales y usar WASD

Mensaje por PowerGames el 2017-06-16, 16:44

Hola Mundo Maker rolleyes ,

Este es mi primer post en este foro y lo usaré para pedir ayuda en relación a un script.

Mi problema es el que sigue:

En el proyecto que estoy desarrollando quiero desactivar las flechas direccionales, las cuales no usaré ni para el movimiento del jugador ni para ninguna otra función, es decir quiero eliminarlas del código. Para sustituirlas usaré las teclas WASD para el movimiento.

Puede parecer trivial, pero después de pelearme un rato con scripts y engines me he topado algunos problemas.
Incialmente, el problema parecía resuelto usando el siguiente script de configuración de teclado cuya autoría desconozco;
Código:
#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}
#==============================================================================
# CONFIGURACION DE BOTONES
#==============================================================================
  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['Z']]
  Y = [Key['X']]
  Z = [Key['V']]
  L = [Key['B'], Key['Page Down']]
  R = [Key['G'], 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']]
#==============================================================================
# All keys
  ALL_KEYS = (0...256).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" * 256
  @triggered = Array.new(256, false)
  @pressed = Array.new(256, false)
  @released = Array.new(256, false)
  @repeated = Array.new(256, 0)
  #----------------------------------------------------------------------------
  # update
  #  Updates input.
  #----------------------------------------------------------------------------
  def self.update
    # get current language layout
    @language_layout = GetKeyboardLayout.call(0)
    # get new keyboard state
    GetKeyboardState.call(@state)
    # for each key
    ALL_KEYS.each {|key|
        # if pressed state
        if @state[key] & 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
          else
            # not triggered anymore
            @triggered[key] = false
          end
          # update of repeat counter
          @repeated[key] < 17 ? @repeated[key] += 1 : @repeated[key] = 15
        # 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
            @repeated[key] = 0
            @released[key] = true
          end
        else
          # not released anymore
          @released[key] = false
        end}
  end
  #----------------------------------------------------------------------------
  # dir4
  #  4 direction check.
  #----------------------------------------------------------------------------
  def Input.dir4
    return 2 if Input.press?(DOWN)
    return 4 if Input.press?(LEFT)
    return 6 if Input.press?(RIGHT)
    return 8 if Input.press?(UP)
    return 0
  end
  #----------------------------------------------------------------------------
  # dir8
  #  8 direction check.
  #----------------------------------------------------------------------------
  def Input.dir8
    down = Input.press?(DOWN)
    left = Input.press?(LEFT)
    return 1 if down && left
    right = Input.press?(RIGHT)
    return 3 if down && right
    up = Input.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 Input.trigger?(keys)
    keys = [keys] unless keys.is_a?(Array)
    return keys.any? {|key| @triggered[key]}
  end
  #----------------------------------------------------------------------------
  # press?
  #  Test if key is being pressed.
  #----------------------------------------------------------------------------
  def Input.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 Input.repeat?(keys)
    keys = [keys] unless keys.is_a?(Array)
    return keys.any? {|key| @repeated[key] == 1 || @repeated[key] == 16}
  end
  #----------------------------------------------------------------------------
  # release?
  #  Test if key was released.
  #----------------------------------------------------------------------------
  def Input.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 2 bytes (Unicode)
    result = "\0" * 2
    # get input string from Win32 API
    length = ToUnicodeEx.call(vk, vsc, @state, result, 2, 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
  #----------------------------------------------------------------------------
  # get_input_string
  #  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 = ''
    string.unpack('S*').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
        # the rest are 3 byte characters
        else
          result += (0xE0 | (c >> 12)).chr
          result += (0x80 | ((c >> 12) & 0x3F)).chr
          result += (0x80 | (c & 0x3F)).chr
        end}
    return result
  end
  
end

#==============================================================================
# Numeric
#------------------------------------------------------------------------------
#  This class serves as superclass for all numbers. It was enhanced with a
#  utility method.
#==============================================================================

class Numeric
  
  #--------------------------------------------------------------------------
  # sgn
  #  Returns the sign of the number or 0 if the number is 0.
  #--------------------------------------------------------------------------
  def sgn
    return (self == 0 ? 0 : self / self.abs)
  end
  
end

#==============================================================================
# Array
#------------------------------------------------------------------------------
#  This class handles array data structures. It was modified to support the
#  utility operations sum and squares.
#==============================================================================

class Array
  
  #----------------------------------------------------------------------------
  # sum
  #  Sums up all the numeric values of the array.
  #----------------------------------------------------------------------------
  def sum
    # initialize
    sum = 0
    # add each element that's a number to sum
    self.each {|i| sum += i if i.is_a?(Numeric)}
    # return sum as float
    return sum
  end
  
end

#==============================================================================
# Hash
#------------------------------------------------------------------------------
#  This class handles hash data structures. It was modified to support the
#  utility operations sum and squares.
#==============================================================================

class Hash
  
  #----------------------------------------------------------------------------
  # sum
  #  Sums up all the numeric values of the array.
  #----------------------------------------------------------------------------
  def sum
    # initialize
    sum = 0
    # add each element that's a number to sum
    self.each_value {|i| sum += i if i.is_a?(Numeric)}
    # return sum as float
    return sum
  end
  
end

Y substituyendo en las líneas 39 a 42 lo de 'Arrow Up'... por WASD, respectivamente. Esto logró el efecto deseado, las flechas de dirección ya no sirven y únicamente se puede usar WASD para moverse. No obstante, el problema es que al querer incorporar el movimiento de 8 direcciones, es decir en diagonal, mediante un sencillo engine de condiciones y efectos y movimiento del personaje, no sirve. Y no es problema del engine, el cual he probado en un nuevo proyecto para asegurarme.

Resumiendo, ¿alguien sabe donde se define en el código de RTP Input.dir4 para poder modificar las flechas por WASD? Por más que he buscado no he encontrado tal referencia. Alternativamente, si alguien tiene alguna solución diferente, lo agradecería también.

Gracias por la lectura y espero interactuar más con esta comunidad en el futuro!
avatar
PowerGames
Iniciado
Iniciado

0/3

Créditos 8

Gracias : 4

Volver arriba Ir abajo

RPG Maker XP Re: (Ayuda con script) Desactivar flechas direccionales y usar WASD

Mensaje por Wecoc el 2017-06-16, 17:05

Yo creo que es mejor mantener las flechas por si acaso, ya que en escenas como el menú es más normal usarlas en vez de WASD. En ese caso la modificación que hiciste no sirve, sinó que tienes que hacerla a nivel de Input.dir4 y Input.dir8 que estan en las líneas 124-149 del script.

Ahí habría que cambiar:
Input.press?(UP) --> Input.press?(Key['W'])
Input.press?(LEFT) --> Input.press?(Key['A'])
Input.press?(DOWN) --> Input.press?(Key['S'])
Input.press?(RIGHT) --> Input.press?(Key['D'])

Si por lo contrario quieres que siempre sean las WASD las de dirección, incluyendo las escenas, ya hiciste el cambio bien.

Aún así dejando ese detalle de lado, es raro que el engine no te funcione. Antes que hacer esos cambios yo de tí probaría el engine con éste script integrado pero tal cual, es decir con las flechas en vez de WASD. Si ya de ese modo no funciona bien seguramente tendrás que buscar otro script de Input distinto, como el de vgvgf o el de Glitchfinder (son los más usados). El autor del que has puesto creo que es Blizzard pero no estoy seguro.
avatar
Wecoc
Administrador
Administrador



Créditos 8988

Gracias : 442

Volver arriba Ir abajo

RPG Maker XP Re: (Ayuda con script) Desactivar flechas direccionales y usar WASD

Mensaje por PowerGames el 2017-06-16, 22:45

Gracias Wecoc,

El problema realmente es el del impedimento al movimiento en 8 direcciones, pero creo que si indago más en los scripts que has mencionado, podré dar con una solución.
avatar
PowerGames
Iniciado
Iniciado

0/3

Créditos 8

Gracias : 4

Volver arriba Ir abajo

RPG Maker XP Re: (Ayuda con script) Desactivar flechas direccionales y usar WASD

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 :: RPG Maker :: Scripts :: Pedidos

Permisos de este foro:
No puedes responder a temas en este foro.