Advertisement
LiTTleDRAgo

[RGSS/2/3] Drago - Custom Input v1.00

May 31st, 2014
402
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 12.21 KB | None | 0 0
  1. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  2. # DRG - Custom Input
  3. # Version 1.00
  4. # Author : LiTTleDRAgo
  5. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  6. #
  7. # How to use :
  8. #   Keyboard.press?(KEY)
  9. #   Keyboard.trigger?(KEY)
  10. #   Keyboard.repeat?(KEY)
  11. #   Keyboard.release?(KEY)
  12. #
  13. #  KEY = Keyboard key (as a string or symbol), look at ASCII table below
  14. #
  15. # Example :
  16. #   Keyboard.press?(:Enter)
  17. #   Keyboard.press?('Enter')
  18. #
  19. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  20. ($imported ||= {})[:drg_custom_input] = 1.00
  21.  
  22. $imported[:drg_core_engine] || raise("This script needs Drago Core Engine")
  23. #==============================================================================
  24. # ** Keyboard
  25. #------------------------------------------------------------------------------
  26. #  
  27. #==============================================================================
  28.  
  29. module Keyboard
  30.   #----------------------------------------------------------------------------
  31.   # * Public Instance Variable
  32.   #----------------------------------------------------------------------------
  33.   class << self
  34.     attr_sec_reader :getkeysta, "Win32API.new('user32','GetKeyboardState','p','i')"
  35.     attr_sec_reader :getkeylay, "Win32API.new('user32','GetKeyboardLayout','l','l')"
  36.     attr_sec_reader :mapvirkey, "Win32API.new('user32','MapVirtualKeyEx','iil','i')"
  37.     attr_sec_reader :tounicode, "Win32API.new('user32','ToUnicodeEx','llppill','l')"
  38.   end
  39.   #----------------------------------------------------------------------------
  40.   # * Simple ASCII table
  41.   #----------------------------------------------------------------------------
  42.   Key = {'A' => 65, 'B' => 66, 'C' => 67, 'D' => 68, 'E' => 69, 'F' => 70,
  43.          'G' => 71, 'H' => 72, 'I' => 73, 'J' => 74, 'K' => 75, 'L' => 76,
  44.          'M' => 77, 'N' => 78, 'O' => 79, 'P' => 80, 'Q' => 81, 'R' => 82,
  45.          'S' => 83, 'T' => 84, 'U' => 85, 'V' => 86, 'W' => 87, 'X' => 88,
  46.          'Y' => 89, 'Z' => 90,
  47.          '0' => 48, '1' => 49, '2' => 50, '3' => 51, '4' => 52, '5' => 53,
  48.          '6' => 54, '7' => 55, '8' => 56, '9' => 57,
  49.          'NumberPad 0' => 45, 'NumberPad 1' => 35, 'NumberPad 2' => 40,
  50.          'NumberPad 3' => 34, 'NumberPad 4' => 37, 'NumberPad 5' => 12,
  51.          'NumberPad 6' => 39, 'NumberPad 7' => 36, 'NumberPad 8' => 38,
  52.          'NumberPad 9' => 33,
  53.          'F1' => 112, 'F2' => 113, 'F3' => 114, 'F4' => 115, 'F5' => 116,
  54.          'F6' => 117, 'F7' => 118, 'F8' => 119, 'F9' => 120, 'F10' => 121,
  55.          'F11' => 122, 'F12' => 123,
  56.          ';' => 186, '=' => 187, ',' => 188, '-' => 189, '.' => 190, '/' => 220,
  57.          '\\' => 191, '\'' => 222, '[' => 219, ']' => 221, '`' => 192,
  58.          'Backspace' => 8, 'Tab' => 9, 'Enter' => 13, 'Shift' => 16,
  59.          'Left Shift' => 160, 'Right Shift' => 161, 'Left Ctrl' => 162,
  60.          'Right Ctrl' => 163, 'Left Alt' => 164, 'Right Alt' => 165,
  61.          'Ctrl' => 17, 'Alt' => 18, 'Esc' => 27, 'Space' => 32, 'Page Up' => 33,
  62.          'Page Down' => 34, 'End' => 35, 'Home' => 36, 'Insert' => 45,
  63.          'Delete' => 46,
  64.          'Arrow Left'  => 37, 'Arrow Up'   => 38, 'Left' => 37,  'Up'   => 38,
  65.          'Arrow Right' => 39, 'Arrow Down' => 40, 'Right' => 39, 'Down' => 40,
  66.          'Mouse Left' => 1, 'Mouse Right' => 2, 'Mouse Middle' => 4,
  67.          'Mouse 4' => 5, 'Mouse 5' => 6}
  68.   #----------------------------------------------------------------------------
  69.   # * Constant
  70.   #----------------------------------------------------------------------------
  71.   KEY_COUNT       = 256
  72.   ALL_KEYS        = (0...KEY_COUNT).to_a
  73.   DOWN_STATE_MASK = 0x80
  74.   DEAD_KEY_MASK   = 0x80000000
  75.   #----------------------------------------------------------------------------
  76.   # * Data
  77.   #----------------------------------------------------------------------------
  78.   @state         = "\0" * KEY_COUNT
  79.   #----------------------------------------------------------------------------
  80.   # * update
  81.   #  Updates input.
  82.   #----------------------------------------------------------------------------
  83.   def self.update
  84.     @language_layout = getkeylay.call(0)
  85.     getkeysta.call(@state)
  86.     key = 0
  87.     @state.each_byte do |byte|
  88.       if (byte & DOWN_STATE_MASK) == DOWN_STATE_MASK  
  89.         (@released||=[])[key] = false                        
  90.         unless (@pressed||=[])[key]
  91.           (@pressed||=[])[key] = (@triggered||=[])[key] = true
  92.           @repeatedKey = key
  93.           @repeatedCount = 0
  94.         else
  95.           (@triggered||=[])[key] = false
  96.         end
  97.         if key == @repeatedKey
  98.           (@repeatedCount||=0) < 17 ? @repeatedCount += 1 : @repeatedCount = 15
  99.         end
  100.       elsif !(@released||=[])[key]
  101.         if (@pressed||=[])[key]
  102.           (@triggered||=[])[key] = (@pressed||=[])[key] = false
  103.           (@released||=[])[key] = true
  104.           key == @repeatedKey && (@repeatedKey = -1) && (@repeatedCount = 0)
  105.         end
  106.       else
  107.         (@released||=[])[key] = false
  108.       end
  109.       key += 1
  110.     end
  111.   end
  112.   #----------------------------------------------------------------------------
  113.   # * dir4
  114.   #  4 direction check.
  115.   #----------------------------------------------------------------------------
  116.   def self.dir4
  117.     return 2 if self.press?(:Down)
  118.     return 4 if self.press?(:Left)
  119.     return 6 if self.press?(:Right)
  120.     return 8 if self.press?(:Up)
  121.     return 0
  122.   end
  123.   #----------------------------------------------------------------------------
  124.   # * dir8
  125.   #  8 direction check.
  126.   #----------------------------------------------------------------------------
  127.   def self.dir8
  128.     down  = self.press?(:Down)
  129.     left  = self.press?(:Left)
  130.     return 1 if down && left
  131.     right = self.press?(:Right)
  132.     return 3 if down && right
  133.     up    = self.press?(:Up)
  134.     return 7 if up && left
  135.     return 9 if up && right
  136.     return 2 if down
  137.     return 4 if left
  138.     return 6 if right
  139.     return 8 if up
  140.     return 0
  141.   end
  142.   #----------------------------------------------------------------------------
  143.   # * trigger?
  144.   #  Test if key was triggered once.
  145.   #----------------------------------------------------------------------------
  146.   def self.trigger?(keys)
  147.     keys = [keys] unless keys.is_a?(Array)
  148.     keys.collect! do |key|
  149.       key.is_a?(String) || key.is_a?(Symbol) ? Key["#{key}"] : key
  150.     end
  151.     return keys.any? {|key| (@triggered||=[])[key]}
  152.   end
  153.   #----------------------------------------------------------------------------
  154.   # * press?
  155.   #  Test if key is being pressed.
  156.   #----------------------------------------------------------------------------
  157.   def self.press?(keys)
  158.     keys = [keys] unless keys.is_a?(Array)
  159.     keys.collect! do |key|
  160.       key.is_a?(String) || key.is_a?(Symbol) ? Key["#{key}"] : key
  161.     end
  162.     return keys.any? {|key| (@pressed||=[])[key]}
  163.   end
  164.   #----------------------------------------------------------------------------
  165.   # * pressed_any?
  166.   #  Test if any key is being pressed
  167.   #----------------------------------------------------------------------------
  168.   def self.pressed_any?
  169.     (@pressed||=[]).any? {|key| key == true}
  170.   end
  171.   #----------------------------------------------------------------------------
  172.   # * repeat?
  173.   #  Test if key is being pressed for repeating.
  174.   #----------------------------------------------------------------------------
  175.   def self.repeat?(keys)
  176.     keys = [keys] unless keys.is_a?(Array)
  177.     keys.collect! do |key|
  178.       key.is_a?(String) || key.is_a?(Symbol) ? Key["#{key}"] : key
  179.     end
  180.     return ((@repeatedKey||=-1) >= 0 && keys.include?(@repeatedKey) &&
  181.         (@repeatedCount == 1 || @repeatedCount == 16))
  182.   end
  183.   #----------------------------------------------------------------------------
  184.   # * release?
  185.   #  Test if key was released.
  186.   #----------------------------------------------------------------------------
  187.   def self.release?(keys)
  188.     keys = [keys] unless keys.is_a?(Array)
  189.     keys.collect! do |key|
  190.       key.is_a?(String) || key.is_a?(Symbol) ? Key["#{key}"] : key
  191.     end
  192.     return keys.any? {|key| (@released||=[])[key]}
  193.   end
  194.   #----------------------------------------------------------------------------
  195.   # * get_character
  196.   #  vk - virtual key
  197.   #  Gets the character from keyboard input using the input locale identifier
  198.   #  (formerly called keyboard layout handles).
  199.   #----------------------------------------------------------------------------
  200.   def self.get_character(vk)
  201.     c = self.mapvirkey.call(vk, 2, @language_layout)
  202.     return '' if c < 32 && (c & DEAD_KEY_MASK) != DEAD_KEY_MASK
  203.     vsc = self.mapvirkey.call(vk, 0, @language_layout)
  204.     length = self.tounicode.call(vk,vsc,@state,(r="\0"*4),4,0,@language_layout)
  205.     return (length == 0 ? '' : r)
  206.   end
  207.   #----------------------------------------------------------------------------
  208.   # * get_input_string
  209.   #  Gets the string that was entered using the keyboard over the input locale
  210.   #  identifier (formerly called keyboard layout handles).
  211.   #----------------------------------------------------------------------------
  212.   def self.get_input_string
  213.     result = ''
  214.     ALL_KEYS.each do |key|
  215.       self.repeat?(key) && (c = self.get_character(key)) != '' && result += c
  216.     end
  217.     return '' if result == ''
  218.     return self.unicode_to_utf8(result)
  219.   end
  220.   #----------------------------------------------------------------------------
  221.   # * unicode_to_utf8
  222.   #  string - string in Unicode format
  223.   #  Converts a string from Unicode format to UTF-8 format as RGSS does not
  224.   #  support Unicode.
  225.   #----------------------------------------------------------------------------
  226.   def self.unicode_to_utf8(string)
  227.     result = ''
  228.     string.unpack('L*').each {|c|
  229.         if c < 0x0080
  230.           result += c.chr
  231.         elsif c < 0x0800
  232.           result += (0xC0 | (c >> 6)).chr
  233.           result += (0x80 | (c & 0x3F)).chr
  234.         elsif c < 0x10000
  235.           result += (0xE0 | (c >> 12)).chr
  236.           result += (0x80 | ((c >> 6) & 0x3F)).chr
  237.           result += (0x80 | (c & 0x3F)).chr
  238.         elsif c < 0x200000
  239.           result += (0xF0 | (c >> 18)).chr
  240.           result += (0x80 | ((c >> 12) & 0x3F)).chr
  241.           result += (0x80 | ((c >> 6) & 0x3F)).chr
  242.           result += (0x80 | (c & 0x3F)).chr
  243.         elsif c < 0x4000000
  244.           result += (0xF8 | (c >> 24)).chr
  245.           result += (0x80 | ((c >> 18) & 0x3F)).chr
  246.           result += (0x80 | ((c >> 12) & 0x3F)).chr
  247.           result += (0x80 | ((c >> 6) & 0x3F)).chr
  248.           result += (0x80 | (c & 0x3F)).chr
  249.         elsif c < 0x80000000
  250.           result += (0xFC | (c >> 30)).chr
  251.           result += (0x80 | ((c >> 24) & 0x3F)).chr
  252.           result += (0x80 | ((c >> 18) & 0x3F)).chr
  253.           result += (0x80 | ((c >> 12) & 0x3F)).chr
  254.           result += (0x80 | ((c >> 6) & 0x3F)).chr
  255.           result += (0x80 | (c & 0x3F)).chr
  256.         end}
  257.     return result
  258.   end
  259. end
  260.  
  261. #==============================================================================
  262. # ** Input
  263. #------------------------------------------------------------------------------
  264. #  This module handles all Input
  265. #==============================================================================
  266. class << Input
  267.   #----------------------------------------------------------------------------
  268.   # * Alias Listing
  269.   #----------------------------------------------------------------------------
  270.   alias_sec_method :drago_input_keyboard_update, :update
  271.   #----------------------------------------------------------------------------
  272.   # * Frame Update
  273.   #----------------------------------------------------------------------------
  274.   def update(*args)
  275.     drago_input_keyboard_update(*args)
  276.     Keyboard.update
  277.   end
  278. end
  279.  
  280. #==============================================================================
  281. # ** Kernel
  282. #------------------------------------------------------------------------------
  283. #  
  284. #==============================================================================
  285. module Kernel
  286.   #-------------------------------------------------------------------------
  287.   # * Overwriten method: press_any_key
  288.   #-------------------------------------------------------------------------
  289.   def press_any_key
  290.     return true if Keyboard.pressed_any?
  291.   end
  292. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement