Advertisement
Rafael_Sol_Maker

RAFAEL_SOL_MAKER's VX KEYBOARD INPUT MODULE PT-BR v1.0

Nov 17th, 2011
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 13.14 KB | None | 0 0
  1. #===============================================================================
  2. #                             RAFAEL_SOL_MAKER's
  3. #                     VX KEYBOARD INPUT MODULE PT-BR v1.0
  4. #                    (Baseado no Script 'Keyboard Input')
  5. #              [Feito em uma parceria entre OriginalWij e Yanfly]
  6. #-------------------------------------------------------------------------------
  7. # Descrição:    Módulo de entrada do teclado que permite a captura de teclas
  8. #               adicionais além das padrão, trazendo várias teclas novas de
  9. #               função, teclas alfanuméricas, e acentuações, providenciando a
  10. #               captura de praticamente todas as teclas de um teclado 101/102  
  11. #               teclas com suporte total para layout para Português do Brasil.
  12. #-------------------------------------------------------------------------------
  13. # Modo de usar: Vide abaixo.
  14. #-------------------------------------------------------------------------------
  15. # Agradecimentos Especiais: Yanfly, OriginalWij
  16. #-------------------------------------------------------------------------------
  17.  
  18. #===============================================================================
  19. #-------------------------------------------------------------------------------
  20. #                             INSTRUÇÕES DE USO:
  21. #-------------------------------------------------------------------------------
  22. #===============================================================================
  23. #   Para aqueles curiosos que desejam saber como receber certas letras enquanto
  24. #   codificando seus comandos de entrada, use o seguinte como referência:
  25. #  
  26. #   REFERÊNCIA: Teclas-padrão que já acompanham o RPG Maker VX:
  27. #     DOWN, LEFT, RIGHT, UP, A, B, C, X, Y, Z, L, R,
  28. #     SHIFT, CTRL, ALT, F5, F6, F7, F8, F9
  29. #
  30. #   KEYS::A até KEYS::Z e KEYS::Ç
  31. #     Retorna 'true'(verdadeiro) se a tecla da respectiva letra for pressionada.
  32. #
  33. #   NUMS[0] até NUMS[9]
  34. #     Retorna 'true'(verdadeiro) se a tecla do respectivo número da fileira do
  35. #     topo for pressionada. Não inclui os números no teclado numérico.
  36. #  
  37. #   NUMPAD[0] até NUMPAD[9]
  38. #     Retorna 'true'(verdadeiro) se a tecla do respectivo número do teclado
  39. #     numérico for pressionada. Não inclui os números na fileira do topo do
  40. #     teclado.
  41. #
  42. #   F1 até F12
  43. #     Retorna 'true'(verdadeiro) se a respectiva tecla de função for
  44. #     pressionada. Incluem-se aqui as teclas F1, F2 e F12 que são reservadas
  45. #     para uso no RPG Maker, o uso dessas não é recomendado.
  46. #
  47. #   Abaixo se encontra uma lista de referência das outras teclas presentes:
  48. #
  49. #   Símbolos:
  50. #      (NOME) |(TECLA)
  51. #     USCORE  |  -
  52. #     EQUALS  |  =
  53. #     COMMA   |  ,
  54. #     PERIOD  |  .
  55. #     SCOLON  |  ;
  56. #     QUOTE   |  '
  57. #     SLASH   |  /
  58. #     BSLASH  |  \
  59. #     LBRACE  |  [
  60. #     RBRACE  |  ]
  61. #     TILDE   |  ~
  62. #     ACCENT  |  ´
  63. #     NMUL    |  * (do teclado numérico)
  64. #     NPLUS   |  + (do teclado numérico)
  65. #     NSEP    |  , (do teclado numérico)
  66. #     NMINUS  |  - (do teclado numérico)
  67. #     NDECI   |  . (do teclado numérico)
  68. #     NDIV    |  / (do teclado numérico)
  69. #
  70. #   Teclas de Comando:
  71. #      (NOME) |(TECLA)
  72. #     BACK    |  Backspace
  73. #     ENTER   |  Enter/Return
  74. #     SPACE   |  Barra de Espaço
  75. #     ESC     |  Escape(ESC)
  76. #     APPS    |  Tecla Aplicações (Menu)
  77. #     PSCREEN |  Print Screen
  78. #     PAUSE   |  Pause
  79. #     INSERT  |  Insert
  80. #     DELETE  |  Delete
  81. #     PGUP    |  Page Up
  82. #     PGDOWN  |  Page Down
  83. #     HOME    |  Home
  84. #     ENDKEY  |  End
  85. #     LWIN    |  Tecla Windows(esquerda)
  86. #     RWIN    |  Tecla Windows(direita)
  87. #     LSHIFT  |  Shift(esquerda)
  88. #     RSHIFT  |  Shift(direita)
  89. #     LCTRL   |  Control(esquerda)
  90. #     RCTRL   |  Control(direita)
  91. #     LALT    |  Tecla Menu/Alt(esquerda)
  92. #     ALTGR   |  Tecla Menu/Alt Gr(direita)
  93. #  
  94. #   Teclas de "Trava":
  95. #      (NOME) |(TECLA)
  96. #     CAPS    |  Caps Lock
  97. #     NUM     |  Numeric Lock
  98. #     SCROLL  |  Scroll Lock
  99. #
  100. #   Métodos Novos do Módulo:
  101. #     Input.typing?
  102. #       Para checar se há alguma digitação ocorrendo. Retorna verdadeiro ou falso.
  103. #     Input.key_type
  104. #       Returns whatever key is being used to type as a string.
  105. #     Exemplo:
  106. #     if Input.typing?
  107. #       string += Input.key_type
  108. #     end
  109. #     upcase?  caps? num? scroll?
  110. #
  111. #-------------------------------------------------------------------------------
  112. #===============================================================================
  113.  
  114. #===============================================================================
  115. # Input
  116. #===============================================================================
  117. class << Input  
  118.   #--------------------------------------------------------------------------
  119.   # Aliases (Ligadas ao Módulo)
  120.   #--------------------------------------------------------------------------
  121.   alias rsm_keybd_press press? unless $@
  122.   alias rsm_keybd_trigger trigger? unless $@
  123.   alias rsm_keybd_repeat repeat? unless $@
  124.   alias rsm_keybd_update update unless $@
  125. end
  126.  
  127. module Input
  128.   #--------------------------------------------------------------------------
  129.   # Constantes do Módulo
  130.   #--------------------------------------------------------------------------
  131.   module KEYS
  132.     A = 65; B = 66; C = 67; D = 68; E = 69; F = 70; G = 71; H = 72; I = 73;
  133.     J = 74; K = 75; L = 76; M = 77; N = 78; O = 79; P = 80; Q = 81; R = 82;
  134.     S = 83; T = 84; U = 85; V = 86; W = 87; X = 88; Y = 89; Z = 90; Ç = 186
  135.   end
  136.  
  137.   NUMS =   [48, 49, 50, 51, 52, 53, 54, 55, 56, 57]
  138.   NUMPAD = [96, 97, 98, 99, 100, 101, 102, 103, 104, 105]  
  139.   F1  = 112; F2  = 113; F3  = 114; F4 = 115
  140.   F10 = 121; F11 = 122; F12 = 123  
  141.   CAPS   = 320; NUM   = 144; SCROLL = 145
  142.   BACK   = 308; TAB   = 309; ENTER  = 313; ESC    = 327; SPACE  = 332  
  143.   APPS = 93; PSCREEN = 44; PAUSE = 19; INSERT = 45; DELETE = 46
  144.   PGUP = 33; PGDOWN  = 34; HOME  = 36; ENDKEY   = 35; KEYEND   = 35
  145.   LWIN  = 91;  RWIN = 92;   LSHIFT = 160; RSHIFT = 161
  146.   LCTRL = 162; RCTRL = 163; LALT   = 164; ALTGR  = 165
  147.   NMUL   = 106; NPLUS  = 107; NSEP   = 108; NMINUS = 109
  148.   NDECI  = 110; NDIV   = 111  
  149.   EQUALS = 187; COMMA = 188;  USCORE = 189; PERIOD = 190
  150.   SCOLON = 191; TILDE  = 222; QUOTE  = 192; ACCENT = 219
  151.   LBRACE = 221; RBRACE = 220; SLASH  = 193; BSLASH = 226
  152.  
  153.   Extras =
  154.   [EQUALS, COMMA, USCORE, PERIOD, SCOLON, TILDE,
  155.    QUOTE, ACCENT, LBRACE, RBRACE, SLASH, BSLASH,
  156.    NMUL, NPLUS, NSEP, NMINUS, NDECI, NDIV]    
  157.  
  158.   #--------------------------------------------------------------------------
  159.   # Configuração inicial do Módulo
  160.   #--------------------------------------------------------------------------
  161.   GetKeyState  = Win32API.new("user32", "GetAsyncKeyState", "i", "i")
  162.   GetLocksState = Win32API.new("user32", "GetKeyState", "i", "i")
  163.   KeyRepeatCounter = {}
  164.   module_function
  165.  
  166.   #--------------------------------------------------------------------------
  167.   # método 'aliased': update
  168.   #--------------------------------------------------------------------------
  169.   def update
  170.     rsm_keybd_update
  171.     for key in KeyRepeatCounter.keys
  172.       if (GetKeyState.call(key).abs & 0x8000 == 0x8000)
  173.         KeyRepeatCounter[key] += 1
  174.       else
  175.         KeyRepeatCounter.delete(key)
  176.       end
  177.     end
  178.   end
  179.  
  180.   #--------------------------------------------------------------------------
  181.   # método 'aliased': press?
  182.   #--------------------------------------------------------------------------
  183.   def press?(key)
  184.     return rsm_keybd_press(key) if key < 30
  185.     adjusted_key = adjust_key(key)
  186.     return true unless KeyRepeatCounter[adjusted_key].nil?
  187.     return key_pressed?(adjusted_key)
  188.   end
  189.  
  190.   #--------------------------------------------------------------------------
  191.   # método 'aliased': trigger?
  192.   #--------------------------------------------------------------------------
  193.   def trigger?(key)
  194.     return rsm_keybd_trigger(key) if key < 30
  195.     adjusted_key = adjust_key(key)
  196.     count = KeyRepeatCounter[adjusted_key]
  197.     return ((count == 0) or (count.nil? ? key_pressed?(adjusted_key) : false))
  198.   end
  199.  
  200.   #--------------------------------------------------------------------------
  201.   # método 'aliased': repeat?
  202.   #--------------------------------------------------------------------------
  203.   def repeat?(key)
  204.     return rsm_keybd_repeat(key) if key < 30
  205.     adjusted_key = adjust_key(key)
  206.     count = KeyRepeatCounter[adjusted_key]
  207.     return true if count == 0
  208.     if count.nil?
  209.       return key_pressed?(adjusted_key)
  210.     else
  211.       return (count >= 23 and (count - 23) % 6 == 0)
  212.     end
  213.   end
  214.  
  215.   #--------------------------------------------------------------------------
  216.   # novo método: adjust_key
  217.   #--------------------------------------------------------------------------
  218.   def adjust_key(key)
  219.     key -= 300 if key > 300
  220.     return key
  221.   end
  222.  
  223.   #--------------------------------------------------------------------------
  224.   # novo método: key_pressed?
  225.   #--------------------------------------------------------------------------
  226.   def key_pressed?(key)
  227.     if (GetKeyState.call(key).abs & 0x8000 == 0x8000)
  228.       KeyRepeatCounter[key] = 0
  229.       return true
  230.     end
  231.     return false
  232.   end
  233.  
  234.   #--------------------------------------------------------------------------
  235.   # novo método: typing?
  236.   #--------------------------------------------------------------------------
  237.   def typing?
  238.     return true if repeat?(SPACE)
  239.     return true if repeat?(186)
  240.     for i in 65..90
  241.       return true if repeat?(i)
  242.     end    
  243.     for i in 0...NUMS.size
  244.       return true if repeat?(NUMS[i])
  245.       return true if repeat?(NUMPAD[i])
  246.     end
  247.     for key in Extras
  248.       return true if repeat?(key)
  249.     end
  250.     return false
  251.   end
  252.   #--------------------------------------------------------------------------
  253.   # novo método: key_type
  254.   #--------------------------------------------------------------------------
  255.   def key_type
  256.     return " " if repeat?(SPACE)
  257.     return (upcase? ? "Ç" : "ç") if repeat?(186)
  258.     n = 65
  259.     for i in 'A'..'Z'
  260.       next unless repeat?(n)
  261.       return upcase? ? i.upcase : i.downcase
  262.        n += 1
  263.     end    
  264.     for i in 0...NUMS.size
  265.       return i.to_s if repeat?(NUMPAD[i])
  266.       if !press?(SHIFT)
  267.         if press?(ALTGR) and repeat?(NUMS[i])
  268.           case i
  269.             when 1; return "¹"
  270.             when 2; return "²"
  271.             when 3; return "³"
  272.             when 4; return "£"
  273.             when 5; return "¢"
  274.             when 6; return "¬"
  275.             when 7..9, 0; return ""
  276.           end
  277.         end
  278.         return i.to_s if repeat?(NUMS[i])
  279.       elsif repeat?(NUMS[i])
  280.         case i
  281.           when 1; return "!"
  282.           when 2; return "@"
  283.           when 3; return "#"
  284.           when 4; return "$"
  285.           when 5; return "%"
  286.           when 6; return "¨"
  287.           when 7; return "&"
  288.           when 8; return "*"
  289.           when 9; return "("
  290.           when 0; return ")"
  291.         end
  292.       end
  293.     end       #"§" "ª" "º" "°"
  294.               #=[]/
  295.     for key in Extras
  296.       next unless repeat?(key)
  297.       case key      
  298.         when EQUALS; return press?(SHIFT) ? "+" : "="
  299.         when COMMA;  return press?(SHIFT) ? "<" : ","
  300.         when USCORE; return press?(SHIFT) ? "_" : "-"
  301.         when PERIOD; return press?(SHIFT) ? ">" : "."
  302.          
  303.         when LBRACE; return press?(SHIFT) ? "{" : "["
  304.         when RBRACE; return press?(SHIFT) ? "}" : "]"
  305.         when SLASH;  return press?(SHIFT) ? "?" : "/"
  306.         when BSLASH; return press?(SHIFT) ? "|" : "\\"
  307.         when SCOLON; return press?(SHIFT) ? ":" : ";"
  308.         when QUOTE;  return press?(SHIFT) ? "\"" : "'"
  309.         when ACCENT; return press?(SHIFT) ? "`" : "´"
  310.         when TILDE;  return press?(SHIFT) ? "^" : "~"
  311.        
  312.         when NMUL;   return "*"
  313.         when NPLUS;  return "+"
  314.         when NSEP;   return ","
  315.         when NMINUS; return "-"
  316.         when NDECI;  return "."
  317.         when NDIV;   return "/"
  318.       end
  319.     end
  320.     return ""
  321.   end
  322.  
  323.   #--------------------------------------------------------------------------
  324.   # novo método: upcase?
  325.   #--------------------------------------------------------------------------
  326.   def upcase?
  327.     return !press?(SHIFT) if caps?
  328.     return true if press?(SHIFT)
  329.     return false
  330.   end
  331.  
  332.   #--------------------------------------------------------------------------
  333.   # novo método: caps?
  334.   #--------------------------------------------------------------------------
  335.   def caps?
  336.     return true if GetLocksState.call(adjust_key(CAPS)) == 1
  337.     return false
  338.   end
  339.  
  340.   #--------------------------------------------------------------------------
  341.   # novo método: num?
  342.   #--------------------------------------------------------------------------  
  343.   def num?
  344.     return true if GetLocksState.call(NUM) == 1
  345.     return false
  346.   end
  347.  
  348.   #--------------------------------------------------------------------------
  349.   # novo método: scroll?
  350.   #--------------------------------------------------------------------------  
  351.   def scroll?
  352.     return true if GetLocksState.call(SCROLL) == 1
  353.     return false
  354.   end
  355.  
  356. end # Input
  357.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement