Advertisement
Zeriab

[RGSS3] WASD movement

Dec 2nd, 2017
7,246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 3.88 KB | None | 0 0
  1. module Input
  2.   class << self
  3.     alias_method :wasd_simple_map_dir4, :dir4
  4.     alias_method :wasd_simple_map_dir8, :dir8
  5.     alias_method :wasd_press, :press?
  6.     alias_method :wasd_trigger, :trigger?
  7.     alias_method :wasd_repeat, :repeat?
  8.  
  9.     KEY_MAP = {}
  10.     KEY_MAP[Input::UP] = Input::R
  11.     KEY_MAP[Input::LEFT] = Input::X
  12.     KEY_MAP[Input::DOWN] = Input::Y
  13.     KEY_MAP[Input::RIGHT] = Input::Z
  14.  
  15.     def press?(key)
  16.       if KEY_MAP.has_key?(key)
  17.         return wasd_press(key) || wasd_press(KEY_MAP[key])
  18.       end
  19.       return wasd_press(key)
  20.     end
  21.     def trigger?(key)
  22.       if KEY_MAP.has_key?(key)
  23.         return wasd_trigger(key) || wasd_trigger(KEY_MAP[key])
  24.       end
  25.       return wasd_trigger(key)
  26.     end
  27.     def repeat?(key)
  28.       if KEY_MAP.has_key?(key)
  29.         return wasd_repeat(key) || wasd_repeat(KEY_MAP[key])
  30.       end
  31.       return wasd_repeat(key)
  32.     end
  33.    
  34.     @initial_dir = 0
  35.     def dir4
  36.       direction = wasd_simple_map_dir4
  37.       if direction == 0
  38.         up_press = Input.press?(Input::R)
  39.         left_press = Input.press?(Input::X)
  40.         down_press = Input.press?(Input::Y)
  41.         right_press = Input.press?(Input::Z)
  42.         count = press_count(up_press, left_press, right_press, down_press)
  43.  
  44.         if count == 3
  45.           # Choose the opposite direction of whichever is not pressed
  46.           if !down_press
  47.             direction = 8
  48.             @initial_dir = direction
  49.           elsif !right_press
  50.             direction = 4
  51.             @initial_dir = direction
  52.           elsif !up_press
  53.             direction = 2
  54.             @initial_dir = direction
  55.           elsif !left_press
  56.             direction = 6
  57.             @initial_dir = direction
  58.           end            
  59.         elsif count == 2
  60.           if (up_press && down_press) || (left_press && right_press)
  61.             # They cancel out eachother
  62.             direction = 0
  63.           else
  64.             # Choose the direction not used last time
  65.             if up_press && @initial_dir != 8
  66.               direction = 8
  67.             elsif left_press && @initial_dir != 4
  68.               direction = 4
  69.             elsif down_press && @initial_dir != 2
  70.               direction = 2
  71.             elsif right_press && @initial_dir != 6
  72.               direction = 6
  73.             end
  74.           end          
  75.         elsif count == 1
  76.           # Choose whichever direction is pressed
  77.           if up_press
  78.             direction = 8
  79.             @initial_dir = direction
  80.           elsif left_press
  81.             direction = 4
  82.             @initial_dir = direction
  83.           elsif down_press
  84.             direction = 2
  85.             @initial_dir = direction
  86.           elsif right_press
  87.             direction = 6
  88.             @initial_dir = direction
  89.           end
  90.         end
  91.         # Both count 0 and count 4 always return 0
  92.      end
  93.       return direction
  94.     end
  95.    
  96.     ##
  97.     # Count number of keys pressed down
  98.     #
  99.     def press_count(up_press, left_press, right_press, down_press)
  100.       count = 0
  101.       count += 1 if up_press
  102.       count += 1 if left_press
  103.       count += 1 if right_press
  104.       count += 1 if down_press
  105.       return count
  106.     end
  107.    
  108.     def dir8
  109.       direction = wasd_simple_map_dir8
  110.       if direction == 0
  111.         if Input.press?(Input::R)
  112.           if Input.press?(Input::X)
  113.             direction = 7
  114.           elsif Input.press?(Input::Z)
  115.             direction = 9
  116.           else
  117.             direction = 8
  118.           end
  119.         elsif Input.press?(Input::Y)
  120.           if Input.press?(Input::X)
  121.             direction = 1
  122.           elsif Input.press?(Input::Z)
  123.             direction = 3
  124.           else
  125.             direction = 2
  126.           end
  127.         elsif Input.press?(Input::X)
  128.           direction = 4
  129.         elsif Input.press?(Input::Z)
  130.           direction = 6
  131.         end
  132.       end
  133.       return direction
  134.     end
  135.   end
  136. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement