设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 112|回复: 0

[转载发布] Gamepad Extender (v1.1, 2/20/2015)

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    2026-7-12 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    9071

    主题

    864

    回帖

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    58883
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    68848

    灌水之王

    发表于 2026-8-3 12:59:20 | 显示全部楼层 |阅读模式
    Gamepad Extender
    version 1.1
    by Lone Wolf

    Introduction:
        By default, RGSS3 uses DirectInput to make only 8 buttons available to scripters. This script provides an alternate, XInput-based gamepad interface, giving scripters access to all 16 buttons on a modern gamepad, as well as dual-analog sticks, analog triggers, and force-feedback controls. Also enables multiplayer for up to four players with compatible gamepads.

    Features:

    • Doubles the number of available buttons.
    • Easy access to analog sticks and triggers.
    • Basic force-feedback control.
    • Support for up to four controllers simultaneously.
    • NEW: analog stick directions can now be treated like individual buttons
    Video:

    Spoiler
    https://www.youtube.com/embed/u0hbz9plTlQ






    FAQ:
        Q: What controllers will work?
        A: Any PC-specific USB controller made in the last five years should work without issue. Older controllers, console controller adapters, etc. will need XInput drivers or an XInput emulator. Google is your friend.

        Q: No Guide button?
        A: No Guide button. It uses a separate interface from XInput and is generally reserved by the system.

        Q: Can you make this work in...?
        A: This is the VX Ace version. An outdated VX port can be found here. I am not planning any further ports at this time.

        Q: I installed this script, so why doesn't my gamepad work?
        A: This script adds a new module to handle input from modern gamepads, but doesn't change any of the script core's default button calls. To actually use any of the new possible mappings (or the additional PadConfig module's bindings), you need to manually edit the input related functions in the default scripts (Game_Player and Window_Selectable are good places to start). Comments for specific functions are included in the main script body.

    Credit and Tanks:
        -Lone Wolf
        -An old forum post on Win32API I clearly should have bookmarked.

    Script:
    Spoiler                Code:       
    1. #==============================================================================
    2. # Gamepad Extender v1.1 (2/20/15)
    3. # by Lone Wolf
    4. #------------------------------------------------------------------------------
    5. # This allows scripters to utilize the extra buttons on modern
    6. # XInput-compatible gamepads. It requires DirectX 9.0 or later and
    7. # an XInput compatible gamepad. Incompatible pads will default to
    8. # using the standard Input module functionality.
    9. #
    10. # This is not a plug-and-play script.
    11. # Some knowledge of RGSS is required for proper use.
    12. #
    13. # Instructions:
    14. #     1) Paste in the Materials section
    15. #  2) Replace button calls in (other) scripts to use gamepad buttons as needed
    16. #        (see Command Reference below)
    17. # Optional:
    18. #     2) Use the PadConfig section to specify button differences between
    19. #          Gamepad and Keyboard (for players without gamepads)
    20. #     3) Replace direct button calls in your scripts (and the defaults) with
    21. #          PadConfig calls or these will do nothing
    22. #        (see Command Reference below)
    23. #------------------------------------------------------------------------------
    24. # Command Reference:
    25. #------------------------------------------------------------------------------
    26. # All calls to extended buttons on Pad 1 can be made through the Input module.
    27. # When using multiple pads, send calls to WolfPad with pad number (0...3)
    28. #    as the final parameter. (i.e.  WolfPad.press?(:A, 3)  )
    29. #
    30. # The current list of mappable buttons is as follows:
    31. #
    32. #     :A, :B, :X, :Y     - XBOX 360 standard face buttons.
    33. #     :L1, :L2, :R1, :R2 - Four triggers (LB, LT, RB, RT)
    34. #     :SELECT, :START    - Back and Start buttons
    35. #     :L3, :R3                    - Clickable Analog buttons
    36. #
    37. #     :UP, :DOWN,
    38. #     :LEFT, :RIGHT        - D-Pad buttons
    39. #
    40. #  :L_UP, :L_DOWN
    41. #  :L_LEFT, :L_RIGHT  - Left stick directions
    42. #
    43. #  :R_UP, :R_DOWN
    44. #  :R_LEFT, :R_RIGHT  - Right stick directions
    45. #
    46. # NON-STANDARD MAPPINGS WILL DO NOTHING without a compatible gamepad.
    47. # To that end, use calls to PadConfig to remap non-standard keys into
    48. # the standard domain where possible.
    49. #
    50. #         for example:    Input.trigger?(PadConfig.page_down)
    51. #         will return :R1 if a gamepad is plugged in, but :R otherwise
    52. #
    53. # Analog values can be referenced with the following commands:
    54. #     left_stick
    55. #     right_stick
    56. #     left_trigger
    57. #     right_trigger
    58. #
    59. # Directional values of analog sticks can be referenced with these:
    60. #     lstick4
    61. #     lstick8
    62. #     rstick4
    63. #     rstick8
    64. #
    65. # Controller vibration can be accessed with these:
    66. #     vibrate(left_motor, right_motor, frame_duration)
    67. #     set_motors(left_motor, right_motor)
    68. #
    69. # All functions take an optional gamepad id (0-3) as their final parameter.
    70. #
    71. #------------------------------------------------------------------------------
    72. # Terms of Use:
    73. #------------------------------------------------------------------------------
    74. #     If you use it, give credit. With a few caveats:
    75. #
    76. #     Can't call it alpha nay more, but I consider this script in-development.
    77. #     I make no guarantees of compatibility with other scripts.
    78. #
    79. #  Contact me via PM is you plan on using this in a commercial game.
    80. #  I probably won't charge anything, but I will want to know it's out there.
    81. #
    82. #     This script was posted at the official RPG Maker forums.
    83. #     Do modify or redistribute this script by itself, though you may
    84. #     include a configured version with your own script demos provided
    85. #     you inclide this header in its entirety.
    86. #------------------------------------------------------------------------------
    87. # Contact Info:
    88. #------------------------------------------------------------------------------
    89. # I can be reached via PM only at the RPG Maker Web forums.
    90. #                                                                                     (http://forums.rpgmakerweb.com)
    91. #
    92. # PM'ing the user Lone Wolf at other RPG Maker sites may have...
    93. # unpredicatable results. I made someone really happy the day I registered...
    94. #------------------------------------------------------------------------------
    95. # Credits:
    96. # Lone Wolf (99% of the code)
    97. # raulf17 (directional movement bug fix; now obsolete)
    98. #------------------------------------------------------------------------------
    99. # 翻訳したいんですか?いいんだが、まだ未完成です。
    100. #==============================================================================
    101. module PadConfig
    102.   # Basic configuration settings:
    103.   # static:
    104.   CONTROLLERS = 1 # can be any number from 1-4, higher values may cause errors
    105.   # can be redefined by other scripts and changed in-game:
    106.   def self.deadzone # Deadzone for axis input (%), may require adjusting
    107.     0.1
    108.   end
    109.   def self.move_with_stick  # Use left-analog stick with dir4 and dir8
    110.     true
    111.   end
    112.   def self.enable_vibration # Enable force-feedback
    113.     true
    114.   end
    115.   # Use this section to write flexible button-mappings for your scripts.
    116.   # Add additional methods as needed.
    117.   # Format:   
    118.   #      WolfPad.plugged_in? ? (gamepad binding) : (fallback binding)
    119.   def self.confirm
    120.     WolfPad.plugged_in? ? :A : :C
    121.   end
    122.   def self.cancel
    123.     WolfPad.plugged_in? ? :B : :B
    124.   end
    125.   def self.dash
    126.     WolfPad.plugged_in? ? :X : :A
    127.   end
    128.   def self.menu
    129.     WolfPad.plugged_in? ? :Y : :B
    130.   end
    131.   def self.page_up
    132.     WolfPad.plugged_in? ? :L1 : :L
    133.   end
    134.   def self.page_down
    135.     WolfPad.plugged_in? ? :R1 : :R
    136.   end
    137.   def self.debug
    138.     WolfPad.plugged_in? ? :L2 : :CTRL
    139.   end
    140.   def self.debug2
    141.     WolfPad.plugged_in? ? :R3 : :F9
    142.   end
    143. end
    144. # Main module:
    145. module WolfPad
    146.   def self.update
    147.     for pad_index in 0...PadConfig::CONTROLLERS
    148.       input = get_state(pad_index)
    149.       if @packet[pad_index] == input[0]
    150.       set_holds(pad_index)
    151.       next
    152.       end
    153.       @packet[pad_index] = input[0]
    154.       @buttons[pad_index] = (input[1] | 0x10000).to_s(2)
    155.       @triggers[pad_index] = [input[2], input[3]]
    156.       @lstick[pad_index] = [constrain_axis(input[4]), -constrain_axis(input[5])]
    157.       @rstick[pad_index] = [constrain_axis(input[6]), -constrain_axis(input[7])]
    158.       set_holds(pad_index)
    159.     end
    160.     update_vibration
    161.     # Extra readout functions go here.
    162.     #dircheck
    163.   end
    164.   def self.test # Prints no. of detected controllers (debugging use only)
    165.     detected = 0
    166.     for i in 0...PadConfig::CONTROLLERS
    167.       self.update
    168.       detected += plugged_in?(i) ? 1 : 0
    169.     end
    170.     puts sprintf("%d XInput controller(s) in use.", detected)
    171.   end
    172.   def self.readout # prints a range from the holds table (debugging use only)
    173.     for i in 00...16
    174.       print sprintf(" %d", @holds[0, i])
    175.       print sprintf(" %d", @holds[1, i])
    176.     end
    177.     puts ";"
    178.   end
    179.   def self.dircheck
    180.     for i in 0...PadConfig::CONTROLLERS
    181.       print sprintf(" %d", key_holds(:UP, i))
    182.       print sprintf(" %d", key_holds(:LEFT, i))
    183.       print sprintf(" %d", key_holds(:DOWN, i))
    184.       print sprintf(" %d", key_holds(:RIGHT, i))
    185.       print " : "
    186.     end
    187.     puts ";"
    188.   end
    189.   # Basic vibration call.
    190.   # For simplicity, motor values should be floats from 0.0 to 1.0
    191.   def self.vibrate(left, right, duration, pad_index = 0)
    192.     return unless PadConfig.enable_vibration
    193.     set_motors(left, right, pad_index)
    194.     @vibrations[pad_index] = duration
    195.   end
    196.   # Counts down vibration event timers
    197.   def self.update_vibration
    198.     for pad in 0...PadConfig::CONTROLLERS
    199.        next if @vibrations[pad] == -1
    200.        @vibrations[pad] -= 1
    201.        if @vibrations[pad] == 0
    202.           @vibrations[pad] = -1
    203.           set_motors(0, 0, pad)
    204.        end
    205.     end
    206.   end
    207.   # Set left and right motor speeds. Vibration continues until stopped.
    208.   # Repeated calls with different values can create vibration effects.
    209.   # For simplicity, input values should be floats from 0.0 to 1.0
    210.   def self.set_motors(left, right, pad_index = 0)
    211.     return unless (PadConfig.enable_vibration) || (left == 0 && right == 0)
    212.     left_v = [left * 65535, 65535].min
    213.     right_v = [right * 65535, 65535].min
    214.     vibration = [left_v, right_v].pack("SS")
    215.     @set_state.call(pad_index, vibration)
    216.   end
    217.   def self.press?(button, pad_index = 0)
    218.     key_holds(button, pad_index) > 0
    219.   end
    220.   def self.trigger?(button, pad_index = 0)
    221.     key_holds(button, pad_index) == 1
    222.   end
    223.   def self.repeat?(button, p_i = 0)
    224.     return true if key_holds(button, p_i) == 1
    225.     return true if key_holds(button, p_i) > 30 && key_holds(button, p_i) % 5 == 0
    226.   end
    227.   # Returns left stick as a pair of floats [x, y] between -1.0 and 1.0
    228.   def self.left_stick(pad_index = 0)
    229.     @lstick[pad_index]
    230.   end
    231.   # Returns right stick as a pair of floats [x, y] between -1.0 and 1.0
    232.   def self.right_stick(pad_index = 0)
    233.     @rstick[pad_index]
    234.   end
    235.   # Returns left trigger as float between 0.0 to 1.0
    236.   def self.left_trigger(pad_index = 0)
    237.     @triggers[pad_index][0] / 255.0
    238.   end
    239.   # Returns right trigger as float between 0.0 to 1.0
    240.   def self.right_trigger(pad_index = 0)
    241.     @triggers[pad_index][1] / 255.0
    242.   end
    243.   def self.dir4(p_i = 0)
    244.     return lstick4(p_i) if PadConfig.move_with_stick
    245.     if press?(:UP, p_i)
    246.      8
    247.     elsif press?(:RIGHT, p_i)
    248.      6
    249.     elsif press?(:LEFT, p_i)
    250.      4
    251.     elsif press?(:DOWN, p_i)
    252.      2
    253.     else
    254.      0
    255.     end
    256.   end
    257.   def self.dir8(p_i = 0)
    258.     return lstick8(p_i) if PadConfig.move_with_stick
    259.     if press?(:UP, p_i) and press?(:LEFT, p_i)
    260.      7
    261.     elsif press?(:UP, p_i) and press?(:RIGHT, p_i)
    262.      9
    263.     elsif press?(:DOWN, p_i) and press?(:LEFT, p_i)
    264.      1
    265.     elsif press?(:DOWN, p_i) and press?(:RIGHT, p_i)
    266.      3
    267.     else
    268.      dir4(p_i)
    269.     end
    270.   end
    271.   # Left-stick direction
    272.   def self.lstick8(p_i = 0)
    273.       flags_to_dir8(key_holds(:L_RIGHT, p_i),key_holds(:L_LEFT, p_i),
    274.                     key_holds(:L_DOWN, p_i),key_holds(:L_UP, p_i))
    275.   end
    276.   def self.lstick4(p_i = 0)
    277.       flags_to_dir4(key_holds(:L_RIGHT, p_i),key_holds(:L_LEFT, p_i),
    278.                     key_holds(:L_DOWN, p_i),key_holds(:L_UP, p_i))
    279.   end
    280.   # Right-stick direction
    281.   def self.rstick8(p_i = 0)
    282.       flags_to_dir8(key_holds(:R_RIGHT, p_i),key_holds(:R_LEFT, p_i),
    283.                     key_holds(:R_DOWN, p_i),key_holds(:R_UP, p_i))
    284.   end
    285.   def self.rstick4(p_i = 0)
    286.       flags_to_dir4(key_holds(:R_RIGHT, p_i),key_holds(:R_LEFT, p_i),
    287.                     key_holds(:R_DOWN, p_i),key_holds(:R_UP, p_i))
    288.   end
    289.   def self.plugged_in?(pad_index = 0)
    290.     @packet[pad_index] && @packet[pad_index] > 0
    291.   end
    292.   def self.keyboard_key?(button)
    293.     !@keys.has_key?(button)
    294.   end
    295.   #Helper functions:
    296.   # convert signed half-word axis state to float
    297.   def self.constrain_axis(axis)
    298.     val = axis.to_f / 2**15
    299.     val.abs > PadConfig.deadzone ? val : 0
    300.   end
    301.   # derives a dir8 value from directional hold values
    302.   def self.flags_to_dir8(right, left, down, up)
    303.     x = right == left ? 0 : (right > left ? 1 : 2)
    304.     y = down == up ? 0 : (down > up ? 1 : 2)
    305.     table = [[0, 2, 8],
    306.             [ 6, 3, 9],
    307.             [ 4, 1, 7]]
    308.     return table[x][y]
    309.   end
    310.   # derives a dir4 value from directional hold values
    311.   def self.flags_to_dir4(right, left, down, up)
    312.     selection = [right, left, down, up].max
    313.     table = [0,0,down,0,left,0,right,0,up]
    314.     return table.index(selection)
    315.   end
    316.   # calculates the precise geometric angle from stick axis values [x,y]
    317.   def self.axis_to_angle(axis)
    318.     cy = -axis[1]
    319.     cx = -axis[0]
    320.     return -1 if cy == 0 && cx == 0
    321.     angle = Math.atan2(cx, cy) * 180 / Math::PI
    322.     angle = angle < 0 ? angle + 360 : angle
    323.     return angle
    324.   end
    325.   # Original angle-conversion handlers for analog sticks
    326.   # OBSOLETE: preserved for reference only
    327.   def self.axis_to_dir8(axis)
    328.     angle_to_dir8(axis_to_angle(axis))
    329.   end
    330.   def self.axis_to_dir4(axis)
    331.     angle_to_dir4(axis_to_angle(axis))
    332.   end
    333.   def self.angle_to_dir8(angle)
    334.     return 0 if angle == -1
    335.     d = 0
    336.     if angle < 22.5 || angle >= 337.5
    337.      d = 8
    338.     elsif angle < 67.5
    339.      d = 7
    340.     elsif angle < 112.5
    341.      d = 4
    342.     elsif angle < 157.5
    343.      d = 1
    344.     elsif angle < 202.5
    345.      d = 2
    346.     elsif angle < 247.5
    347.      d = 3
    348.     elsif angle < 292.5
    349.      d = 6
    350.     elsif angle < 337.5
    351.      d = 9
    352.     end
    353.     return d
    354.   end
    355.   def self.angle_to_dir4(angle)
    356.     return 0 if angle == -1
    357.     d = 0
    358.     if angle < 45 || angle >= 315
    359.      d = 8
    360.     elsif angle < 135
    361.      d = 4
    362.     elsif angle < 225
    363.      d = 2
    364.     elsif angle < 315
    365.      d = 6
    366.     end
    367.     return d
    368.   end
    369.   private # methods past here can't be called from outside
    370.   # This hash correlates RM's Input to XInput keys. Experienced Users only!
    371.   # The Input module will handle any keys not listed here (i.e. :CTRL) itself.
    372.   # Integers refer to specific gamepad button IDs.
    373.   @keys = {
    374.     :UP    => 15, #d-pad up
    375.     :DOWN => 14, #d-pad left
    376.     :LEFT => 13, #d-pad down
    377.     :RIGHT => 12, #d-pad right
    378.     :A     => 3, #lower face button
    379.     :B     => 2, #right face button
    380.     :X     => 1, #left face button
    381.     :Y     => 0, #upper face button
    382.     :L1    => 7, #upper left trigger
    383.     :R1    => 6, #upper right trigger
    384.     :START => 11,
    385.     :SELECT => 10,
    386.     :L3    => 9, #left thubstick button
    387.     :R3    => 8, #right thubstick button
    388.     :L2    => 16, #lower left trigger (press only)
    389.     :R2    => 17, #lower right trigger (press only)
    390.     :L_UP    => 21,
    391.     :L_DOWN    => 20,
    392.     :L_LEFT    => 19,
    393.     :L_RIGHT    =>18,
    394.     :R_UP    => 25,
    395.     :R_DOWN    => 24,
    396.     :R_LEFT    => 23,
    397.     :R_RIGHT    => 22
    398.     }
    399.   #Win32API calls. Leave these alone.
    400.   # Calls to XInput9_1_0.dll now only occur if DirectX is missing
    401.   @set_state = Win32API.new("XINPUT1_3", "XInputSetState", "IP", "V") rescue
    402.                 Win32API.new("XINPUT9_1_0", "XInputSetState", "IP", "V")
    403.   @get_state = Win32API.new("XINPUT1_3", "XInputGetState", "IP", "L") rescue
    404.                 Win32API.new("XINPUT9_1_0", "XInputGetState", "IP", "L")
    405.   #Initializers
    406.   # Will store data for number of gamepads in use.
    407.   @packet = Array.new(PadConfig::CONTROLLERS)
    408.   @buttons = Array.new(PadConfig::CONTROLLERS)
    409.   @triggers = Array.new(PadConfig::CONTROLLERS)
    410.   @lstick = Array.new(PadConfig::CONTROLLERS)
    411.   @rstick = Array.new(PadConfig::CONTROLLERS)
    412.   # tracks how long buttons have been pressed
    413.   @holds = Table.new(PadConfig::CONTROLLERS, 26)
    414.   # stores vibration event timers
    415.   @vibrations = Array.new(PadConfig::CONTROLLERS, -1)
    416.   def self.key_holds(symbol, pad_index)
    417.     return 0 if keyboard_key?(symbol)
    418.     @holds[pad_index, @keys[symbol]]
    419.   end
    420.   def self.get_state(pad_index)
    421.     state = "\0" * 16
    422.     @get_state.call(pad_index, state)
    423.     return state.unpack("LSCCssss")
    424.   end
    425.   def self.set_holds(p_i)
    426.     for i in 1...17
    427.      @holds[p_i, i-1] = @buttons[p_i][i].to_i > 0 ? @holds[p_i, i-1] + 1 : 0
    428.     end
    429.     @holds[p_i, 16] = left_trigger(p_i) >= 0.5 ? @holds[p_i, 16]+1 : 0
    430.     @holds[p_i, 17] = right_trigger(p_i) >= 0.5 ? @holds[p_i, 17]+1 : 0
    431.     @holds[p_i, 18] = left_stick(p_i)[0] >= 0.5 ? @holds[p_i, 18]+1 : 0
    432.     @holds[p_i, 19] = left_stick(p_i)[0] <= -0.5 ? @holds[p_i, 19]+1 : 0
    433.     @holds[p_i, 20] = left_stick(p_i)[1] >= 0.5 ? @holds[p_i, 20]+1 : 0
    434.     @holds[p_i, 21] = left_stick(p_i)[1] <= -0.5 ? @holds[p_i, 21]+1 : 0
    435.     @holds[p_i, 22] = right_stick(p_i)[0] >= 0.5 ? @holds[p_i, 22]+1 : 0
    436.     @holds[p_i, 23] = right_stick(p_i)[0] <= -0.5 ? @holds[p_i, 23]+1 : 0
    437.     @holds[p_i, 24] = right_stick(p_i)[1] >= 0.5 ? @holds[p_i, 24]+1 : 0
    438.     @holds[p_i, 25] = right_stick(p_i)[1] <= -0.5 ? @holds[p_i, 25]+1 : 0
    439.   end
    440. end
    441. # Aliases to tie the above into VXAce's Input module
    442. module Input
    443.   class <<self
    444.     alias :vxa_update :update
    445.     alias :vxa_press? :press?
    446.     alias :vxa_trigger? :trigger?
    447.     alias :vxa_repeat? :repeat?
    448.     alias :vxa_dir4 :dir4
    449.     alias :vxa_dir8 :dir8
    450.   end
    451.   def self.update
    452.     WolfPad.update
    453.     vxa_update
    454.   end
    455.   def self.press?(button)
    456.     return vxa_press?(button) if WolfPad.keyboard_key?(button)
    457.     return WolfPad.press?(button) if WolfPad.plugged_in?
    458.     return vxa_press?(button)
    459.   end
    460.   def self.trigger?(button)
    461.     return vxa_trigger?(button) if WolfPad.keyboard_key?(button)
    462.     return WolfPad.trigger?(button) if WolfPad.plugged_in?
    463.     return vxa_trigger?(button)
    464.   end
    465.   def self.repeat?(button)
    466.     return vxa_repeat?(button) if WolfPad.keyboard_key?(button)
    467.     return WolfPad.repeat?(button) if WolfPad.plugged_in?
    468.     return vxa_repeat?(button)
    469.   end
    470.   def self.dir4
    471.     WolfPad.plugged_in? ? WolfPad.dir4 : vxa_dir4
    472.   end
    473.   def self.dir8
    474.     WolfPad.plugged_in? ? WolfPad.dir8 : vxa_dir8
    475.   end
    476. end
    复制代码






    Author's Notes:
        This script is forever a work-in-progress. Feel free to suggest features and fixes.

    Updates:
        (4/12/17) - Corrected top page for the new layout.
        (2/20/15) - First update in two years! Optimized analog stick directional handling.
        (3/8/13) - Script update. Fixed a bug, updated documentation,  cleaned a few typos, and laid groundwork for writing add-ons.
        (1/9/13) - Updated main post. No changes to script.
        (7/25/12) - Fixed input refresh bug on controllers handling update packets correctly. This one's my bad.
        (6/13/12) - Updated main post. No changes to script.
        (4/10/12) - Fixed a bug with multiple controllers where update_vibration would be skipped if gamepad detection failed.


    本贴来自国际rpgmaker官方论坛作者:Lone Wolf处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/gamepad-extender-v1-1-2-20-2015.1284/
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-8-17 06:16 , Processed in 0.142189 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表