Плохо! Плохо!:  0
Показано с 1 по 1 из 1

Тема: Gamepad Extender

  1. #1
    Маститый Аватар для Seibur
    Информация о пользователе
    Регистрация
    07.01.2012
    Адрес
    Изумрудный город
    Сообщений
    1,121
    Записей в дневнике
    86
    Репутация: 58 Добавить или отнять репутацию

    По умолчанию Gamepad Extender

    Gamepad Extender
    Автор: Lone Wolf
    Версия: 1.0a
    Тип: Расширение возможностей управления



    Описание:
    По умолчанию для управления используется DirectInput и доступно лишь 8 кнопок у джойстика. Этот скрипт позволяет использовать расширенный интерфейс XInput, дающий скриптерам и игрокам доступ к 16 кнопкам на геймпаде, а также к аналоговым стикам, триггерам и вибрации. Также позволяет создать мультиплеер на четырех игроков с помощью совместимых геймпадов.

    Особенности:


    • Удваивает количество доступных кнопок
    • Легкий доступ к аналоговым стикам и триггерам
    • Базовое управление обратной отдачей (вибрацией)
    • Поддержка до четырех контроллеров одновременно


    Использование:

    Вставить в материалы и настроить по своему вкусу.

    Работать должны все USB контроллеры подключаемые к компьютеру.
    Единственное условие — обычный джойстик с 16 кнопками (например джойстик для PS3 или XBOX).
    Это бета-версия скрипта, он находится в разработке.

    Скрипт:

    Спойлер VX:
    Код:
    #==============================================================================
    # Gamepad Extender VX v1.0a (7/25/12)
    # by Lone Wolf
    #------------------------------------------------------------------------------
    # This allows scripters to utilize the extra buttons on modern
    # XInput-compatible gamepads. It requires DirectX 9.0 or later and
    # an XInput compatible gamepad. Incompatible pads will default to
    # using the standard Input module functionality.
    #
    # This is not a plug-and-play script.
    #
    # Instructions:
    # - Paste in the Materials section.
    # - Use the PadConfig section to specify button differences between
    #        Gamepad and Keyboard (optional but recommended)
    #        (Replace direct button calls in your scripts (and the defaults) with
    #        PadConfig calls or these will do nothing.)
    #------------------------------------------------------------------------------
    # Command Reference:
    #------------------------------------------------------------------------------
    # All calls to extended buttons on Pad 1 can be made through the Input module.
    # Pass WolfPad::BUTTON for pad calls, Input::BUTTON for keyboard calls.
    # When using multiple pads, send calls directly to WolfPad with pad number
    # as the final parameter.
    #
    # The current list of mappable buttons is as follows:
    #
    # A, B, X, Y     - XBOX 360 standard face buttons.
    # L1, L2, R1, R2 - Four triggers (LB, LT, RB, RT)
    # SELECT, START - Back and Start buttons
    # L3, R3                 - Clickable Analog buttons
    #
    # UP, DOWN,
    # LEFT, RIGHT            - D-Pad buttons
    #
    # NON-STANDARD MAPPINGS WILL DO NOTHING without a compatible gamepad.
    # To that end, use calls to PadConfig to remap non-standard keys into
    # the standard domain where possible.
    #
    #       for example: "Input.trigger?(PadConfig.page_down)"
    #       will return WolfPad::R1 if a gamepad is plugged in, but Input::R otherwise
    #
    # Analog values can be referenced with the following commands:
    # left_stick
    # right_stick
    # left_trigger
    # right_trigger
    #
    # Directional values of analog sticks can be referenced with these:
    # lstick4
    # lstick8
    # rstick4
    # rstick8
    #
    # Controller vibration can be accessed with these:
    # vibrate(left_motor, right_motor, frame_duration)
    # set_motors(left_motor, right_motor)
    #
    #
    # All functions take an optional gamepad ID as their final parameter.
    #------------------------------------------------------------------------------
    # Terms of Use:
    #------------------------------------------------------------------------------
    # If you use it, give credit. With a few caveats:
    #
    # This is an alpha version of a script in development.
    # I make no guarantees of compatibility with other scripts.
    #
    # This is a VX port of an RGSS3 script. Some features may behave differently,
    #
    # This script was posted at the official RPG Maker forums.
    # Do modify or redistribute this script by itself, though you may
    # include a configured version with your own script demos provided
    # you include this header in its entirety.
    #------------------------------------------------------------------------------
    # Contact Info:
    #------------------------------------------------------------------------------
    # I can be reached via PM only at the RPG Maker Web forums.
    #       (http://forums.rpgmakerweb.com)
    #
    # PM'ing the user Lone Wolf at other RPG Maker sites may have...
    # unpredicatable results. I made someone really happy the day I registered...
    #------------------------------------------------------------------------------
    # Credits:
    # Lone Wolf
    #------------------------------------------------------------------------------
    # 翻訳したいんですか?いいんだが、まだ完成していない。
    #==============================================================================
    module PadConfig
    # Basic configuration settings:
    DEADZONE = 0.05 # Deadzone for axis input (%)
    CONTROLLERS = 1 # Number of controllers to use (from 1 - 4)
    MOVE_WITH_STICK = true # Use left-analog stick with dir4 and dir8
    # Use this section to write flexible button-mappings for your scripts.
    # Add additional methods as needed.
    def self.confirm
            WolfPad.plugged_in? ? WolfPad::A : Input::C
    end
    def self.cancel
            WolfPad.plugged_in? ? WolfPad::B : Input::B
    end
    def self.dash
            WolfPad.plugged_in? ? WolfPad::X : Input::A
    end
    def self.menu
            WolfPad.plugged_in? ? WolfPad::Y : Input::B
    end
    def self.page_up
            WolfPad.plugged_in? ? WolfPad::L1 : Input::L
    end
    def self.page_down
            WolfPad.plugged_in? ? WolfPad::R1 : Input::R
    end
    def self.debug
            WolfPad.plugged_in? ? WolfPad::L2 : Input::CTRL
    end
    def self.debug2
            WolfPad.plugged_in? ? WolfPad::R3 : Input::F9
    end
    end
    # Main module:
    module WolfPad
    
    # Button constants. Do NOT modify these unless you know what you're doing.
    
    UP = 45 #d-pad up
    DOWN = 44 #d-pad left
    LEFT = 43 #d-pad down
    RIGHT = 42 #d-pad right
    A = 33 #lower face button
    B = 32 #right face button
    X = 31 #left face button
    Y = 30 #upper face button
    L1 = 37 #upper left trigger
    R1 = 36 #upper right trigger
    START = 41
    SELECT = 40
    L3 = 39 #left thubstick button
    R3 = 38 #right thubstick button
    L2 = 46 #lower left trigger (press only)
    R2 = 47 #lower right trigger (press only)
    
    def self.update
            for pad_index in 0...PadConfig::CONTROLLERS
             input = get_state(pad_index)
             if @packet[pad_index] == input[0]
             set_holds(pad_index)
             next
             end
             @packet[pad_index] = input[0]
             @buttons[pad_index] = (input[1] | 0x10000).to_s(2)
             @triggers[pad_index] = [input[2], input[3]]
             @lstick[pad_index] = [constrain_axis(input[4]), -constrain_axis(input[5])]
             @rstick[pad_index] = [constrain_axis(input[6]), -constrain_axis(input[7])]
             set_holds(pad_index)
    end
    update_vibration
    end
    def self.test
            detected = 0
            for i in 0...PadConfig::CONTROLLERS
             self.update
             detected += plugged_in?(i) ? 1 : 0
            end
            puts sprintf("%d XInput controller(s) in use.", detected)
    end
    # Basic vibration call.
    # For simplicity, motor values should be floats from 0.0 to 1.0
    def self.vibrate(left, right, duration, pad_index = 0)
                                    set_motors(left, right, pad_index)
            @vibrations[pad_index] = duration
    end
    # Counts down vibration event timers
    def self.update_vibration
            for pad in 0...PadConfig::CONTROLLERS
             next if @vibrations[pad] == -1
             @vibrations[pad] -= 1
             if @vibrations[pad] == 0
                                            @vibrations[pad] = -1
                                            set_motors(0, 0, pad)
             end
            end
    end
    # Set left and right motor speeds. Vibration continues until stopped.
    # Repeated calls with different values can create vibration effects.
    # For simplicity, input values should be floats from 0.0 to 1.0
    def self.set_motors(left, right, pad_index = 0)
            left_v = [left * 65535, 65535].min
            right_v = [right * 65535, 65535].min
            vibration = [left_v, right_v].pack("SS")
            @set_state.call(pad_index, vibration)
    end
    def self.press?(button, pad_index = 0)
            return key_holds(button, pad_index) > 0
    end
    def self.trigger?(button, pad_index = 0)
            return key_holds(button, pad_index) == 1
    end
    def self.repeat?(button, p_i = 0)
            result = key_holds(button, p_i)
            return true if result == 1
            return true if result > 30 && result % 5 == 0
    end
    # Returns left stick as a pair of floats [x, y] between -1.0 and 1.0
    def self.left_stick(pad_index = 0)
            return @lstick[pad_index]
    end
    # Returns right stick as a pair of floats [x, y] between -1.0 and 1.0
    def self.right_stick(pad_index = 0)
            return @rstick[pad_index]
    end
    # Returns left trigger as float between 0.0 to 1.0
    def self.left_trigger(pad_index = 0)
            return @triggers[pad_index][0] / 255.0
    end
    # Returns right trigger as float between 0.0 to 1.0
    def self.right_trigger(pad_index = 0)
            return @triggers[pad_index][1] / 255.0
    end
    def self.dir4(p_i = 0)
            return lstick4(p_i) if PadConfig::MOVE_WITH_STICK
            if press?(UP, p_i)
             return 8
            elsif press?(RIGHT, p_i)
             return 6
            elsif press?(LEFT, p_i)
             return 4
            elsif press?(DOWN, p_i)
             return 2
            else
             return 0
            end
    end
    def self.dir8(p_i = 0)
            return lstick8(p_i) if PadConfig::MOVE_WITH_STICK
            if press?(UP, p_i) and press?(LEFT, p_i)
             return 7
            elsif press?(UP, p_i) and press?(RIGHT, p_i)
             return 9
            elsif press?(DOWN, p_i) and press?(LEFT, p_i)
             return 1
            elsif press?(DOWN, p_i) and press?(RIGHT, p_i)
             return 3
            else
             return dir4(p_i)
            end
    end
    # Left-stick as numpad direction
    def self.lstick8(p_i = 0)
            return axis_to_dir8(@lstick[p_i])
    end
    def self.lstick4(p_i = 0)
            return axis_to_dir4(@lstick[p_i])
    end
    # Right-stick as numpad direction
    def self.rstick8(p_i = 0)
            return axis_to_dir8(@rstick[p_i])
    end
    def self.rstick4(p_i = 0)
            return axis_to_dir4(@rstick[p_i])
    end
    def self.plugged_in?(pad_index = 0)
            return @packet[pad_index] && @packet[pad_index] > 0
    end
    def self.keyboard_key?(button)
            return button < 30
    end
    #Helper functions:
    # convert signed half-word axis state to float
    def self.constrain_axis(axis)
            val = axis.to_f / 2**15
            return val.abs > PadConfig::DEADZONE ? val : 0
    end
    # convert axis direction to VX Ace direction
    def self.axis_to_dir8(axis)
            return angle_to_dir8(axis_to_angle(axis))
    end
    def self.axis_to_dir4(axis)
            return angle_to_dir4(axis_to_angle(axis))
    end
    def self.axis_to_angle(axis)
            cy = -axis[1]
            cx = -axis[0]
            return 0 if cy == 0 && cx == 0
            angle = Math.atan2(cx, cy) * 180 / Math::PI
            angle = angle < 0 ? angle + 360 : angle
            return angle
    end
    # Please PM me if you have an easier way to write this.
    def self.angle_to_dir8(angle)
            return 0 if angle == 0
            d = 0
            if angle < 22.5 || angle >= 337.5
             d = 8
            elsif angle < 67.5
             d = 7
            elsif angle < 112.5
             d = 4
            elsif angle < 157.5
             d = 1
            elsif angle < 202.5
             d = 2
            elsif angle < 247.5
             d = 3
            elsif angle < 292.5
             d = 6
            elsif angle < 337.5
             d = 9
            end
            return d
    end
    def self.angle_to_dir4(angle)
            return 0 if angle == 0
            d = 0
            if angle < 45 || angle >= 315
             d = 8
            elsif angle < 135
             d = 4
            elsif angle < 225
             d = 2
            elsif angle < 315
             d = 6
            end
            return d
    end private # methods past here can't be called from outside
    #Win32API calls. Leave these alone.
    @set_state = Win32API.new("xinput1_3", "XInputSetState", "IP", "V")
    @get_state = Win32API.new("xinput1_3", "XInputGetState", "IP", "L")
    
    #Initializers
    # Will store data for number of gamepads in use.
    @packet = Array.new(PadConfig::CONTROLLERS)
    @buttons = Array.new(PadConfig::CONTROLLERS)
    @triggers = Array.new(PadConfig::CONTROLLERS)
    @lstick = Array.new(PadConfig::CONTROLLERS)
    @rstick = Array.new(PadConfig::CONTROLLERS)
    # tracks how long buttons have been pressed
    @holds = Table.new(PadConfig::CONTROLLERS, 18)
    # stores vibration event timers
    @vibrations = Array.new(PadConfig::CONTROLLERS, -1)
    def self.key_holds(button_id, pad_index)
            return 0 if keyboard_key?(button_id)
            return @holds[pad_index, button_id - 30]
    end
    def self.get_state(pad_index)
            state = "\0" * 16
            @get_state.call(pad_index, state)
            return state.unpack("LSCCssss")
    end
    def self.set_holds(p_i)
            for i in 1...17
             @holds[p_i, i-1] = @buttons[p_i][i,1].to_i > 0 ? @holds[p_i, i-1]+1 : 0
            end
            @holds[p_i, 16] = (left_trigger(p_i) >= 0.5) ? (@holds[p_i, 16]+1) : 0
            @holds[p_i, 17] = (right_trigger(p_i) >= 0.5) ? (@holds[p_i, 17]+1) : 0
    end
    end# Aliases to tie the above into VXAce's Input module
    module Input
    class <<self
            alias :vxa_update :update
            alias :vxa_press? :press?
            alias :vxa_trigger? :trigger?
            alias :vxa_repeat? :repeat?
            alias :vxa_dir4 :dir4
            alias :vxa_dir8 :dir8
    end
    def self.update
            WolfPad.update
            vxa_update
    end
    def self.press?(button)
            return vxa_press?(button) if WolfPad.keyboard_key?(button)
            return WolfPad.press?(button) if WolfPad.plugged_in?
            return vxa_press?(button)
    end
    def self.trigger?(button)
            return vxa_trigger?(button) if WolfPad.keyboard_key?(button)
            return WolfPad.trigger?(button) if WolfPad.plugged_in?
            return vxa_trigger?(button)
    end
    def self.repeat?(button)
            return vxa_repeat?(button) if WolfPad.keyboard_key?(button)
            return WolfPad.repeat?(button) if WolfPad.plugged_in?
            return vxa_repeat?(button)
    end
    def self.dir4
            WolfPad.plugged_in? ? WolfPad.dir4 : vxa_dir4
    end
    def self.dir8
            WolfPad.plugged_in? ? WolfPad.dir8 : vxa_dir8
    end
    end


    Спойлер VX Ace:
    [CODE]
    #================================================= =============================
    # Gamepad Extender v1.0a (7/25/12)
    # by Lone Wolf
    #------------------------------------------------------------------------------
    # This allows scripters to utilize the extra buttons on modern
    # XInput-compatible gamepads. It requires DirectX 9.0 or later and
    # an XInput compatible gamepad. Incompatible pads will default to
    # using the standard Input module functionality.
    #
    # This is not a plug-and-play script.
    #
    # Instructions:
    # - Paste in the Materials section.
    # - Use the PadConfig section to specify button differences between
    # Gamepad and Keyboard (optional but recommended)
    # (Replace direct button calls in your scripts (and the defaults) with
    # PadConfig calls or these will do nothing.)
    #------------------------------------------------------------------------------
    # Command Reference:
    #------------------------------------------------------------------------------
    # All calls to extended buttons on Pad 1 can be made through the Input module.
    # When using multiple pads, send calls to WolfPad with pad number (0...3)
    # as the final parameter.
    #
    # The current list of mappable buttons is as follows:
    #
    # :A, :B, :X, :Y - XBOX 360 standard face buttons.
    # :L1, :L2, :R1, :R2 - Four triggers (LB, LT, RB, RT)
    # :SELECT, :START - Back and Start buttons
    # :L3, :R3 - Clickable Analog buttons
    #
    # :UP, OWN,
    # :LEFT, :RIGHT - D-Pad buttons
    #
    # NON-STANDARD MAPPINGS WILL DO NOTHING without a compatible gamepad.
    # To that end, use calls to PadConfig to remap non-standard keys into
    # the standard domain where possible.
    #
    # for example: "Input.trigger?(PadConfig.page_down)"
    # will return :R1 if a gamepad is plugged in, but :R otherwise
    #
    # Analog values can be referenced with the following commands:
    # left_stick
    # right_stick
    # left_trigger
    # right_trigger
    #
    # Directional values of analog sticks can be referenced with these:
    # lstick4
    # lstick8
    # rstick4
    # rstick8
    #
    # Controller vibration can be accessed with these:
    # vibrate(left_motor, right_motor, frame_duration)
    # set_motors(left_motor, right_motor)
    #
    #
    # All functions take an optional gamepad id as their final parameter.
    #------------------------------------------------------------------------------
    # Terms of Use:
    #------------------------------------------------------------------------------
    # If you use it, give credit. With a few caveats:
    #
    # This is an alpha version of a script in development.
    # I make no guarantees of compatibility with other scripts.
    #
    # This script was posted at the official RPG Maker forums.
    # Do modify or redistribute this script by itself, though you may
    # include a configured version with your own script demos provided
    # you inclide this header in its entirety.
    #------------------------------------------------------------------------------
    # Contact Info:
    #------------------------------------------------------------------------------
    # I can be reached via PM only at the RPG Maker Web forums.
    # (http://forums.rpgmakerweb.com)
    #
    # PM'ing the user Lone Wolf at other RPG Maker sites may have...
    # unpredicatable results. I made someone really happy the day I registered...
    #------------------------------------------------------------------------------
    # Credits:
    # Lone Wolf
    #------------------------------------------------------------------------------
    # 翻訳したいんですか?いいんだが、 だ完成していない。
    #================================================= =============================
    module PadConfig
    # Basic configuration settings:
    DEADZONE = 0.05 # Deadzone for axis input (%)
    CONTROLLERS = 4 # Number of controllers to use (from 1 - 4)
    MOVE_WITH_STICK = true # Use left-analog stick with dir4 and dir8
    # Use this section to write flexible button-mappings for your scripts.
    # Add additional methods as needed.
    def self.confirm
    WolfPad.plugged_in? ? :A : :C
    end
    def self.cancel
    WolfPad.plugged_in? ? :B : :B
    end
    def self.dash
    WolfPad.plugged_in? ? :X : :A
    end
    def self.menu
    WolfPad.plugged_in? ? :Y : :B
    end
    def self.page_up
    WolfPad.plugged_in? ? :L1 : :L
    end
    def self.page_down
    WolfPad.plugged_in? ? :R1 : :R
    end
    def self.debug
    WolfPad.plugged_in? ? :L2 : :CTRL
    end
    def self.debug2
    WolfPad.plugged_in? ? :R3 : :F9
    end
    end
    # Main module:
    module WolfPad
    def self.update
    for pad_index in 0...PadConfig::CONTROLLERS
    input = get_state(pad_index)
    if @packet[pad_index] == input[0]
    set_holds(pad_index)
    next
    end
    @packet[pad_index] = input[0]
    @buttons[pad_index] = (input[1] | 0x10000).to_s(2)
    @triggers[pad_index] = [input[2], input[3]]
    @lstick[pad_index] = [constrain_axis(input[4]), -constrain_axis(input[5])]
    @rstick[pad_index] = [constrain_axis(input[6]), -constrain_axis(input[7])]
    set_holds(pad_index)
    end
    update_vibration
    end
    def self.test
    detected = 0
    for i in 0...PadConfig::CONTROLLERS
    self.update
    detected += plugged_in?(i) ? 1 : 0
    end
    puts sprintf("%d XInput controller(s) in use.", detected)
    end
    # Basic vibration call.
    # For simplicity, motor values should be floats from 0.0 to 1.0
    def self.vibrate(left, right, duration, pad_index = 0)
    set_motors(left, right, pad_index)
    @vibrations[pad_index] = duration
    end
    # Counts down vibration event timers
    def self.update_vibration
    for pad in 0...PadConfig::CONTROLLERS
    next if @vibrations[pad] == -1
    @vibrations[pad] -= 1
    if @vibrations[pad] == 0
    @vibrations[pad] = -1
    set_motors(0, 0, pad)
    end
    end
    end
    # Set left and right motor speeds. Vibration continues until stopped.
    # Repeated calls with different values can create vibration effects.
    # For simplicity, input values should be floats from 0.0 to 1.0
    def self.set_motors(left, right, pad_index = 0)
    left_v = [left * 65535, 65535].min
    right_v = [right * 65535, 65535].min
    vibration = [left_v, right_v].pack("SS")
    @set_state.call(pad_index, vibration)
    end
    def self.press?(button, pad_index = 0)
    key_holds(button, pad_index) > 0
    end
    def self.trigger?(button, pad_index = 0)
    key_holds(button, pad_index) == 1
    end
    def self.repeat?(button, p_i = 0)
    return true if key_holds(button, p_i) == 1
    return true if key_holds(button, p_i) > 30 && key_holds(button, p_i) % 5 == 0
    end
    # Returns left stick as a pair of floats [x, y] between -1.0 and 1.0
    def self.left_stick(pad_index = 0)
    @lstick[pad_index]
    end
    # Returns right stick as a pair of floats [x, y] between -1.0 and 1.0
    def self.right_stick(pad_index = 0)
    @rstick[pad_index]
    end
    # Returns left trigger as float between 0.0 to 1.0
    def self.left_trigger(pad_index = 0)
    @triggers[pad_index][0] / 255.0
    end
    # Returns right trigger as float between 0.0 to 1.0
    def self.right_trigger(pad_index = 0)
    @triggers[pad_index][1] / 255.0
    end
    def self.dir4(p_i = 0)
    return lstick4(p_i) if PadConfig::MOVE_WITH_STICK
    if press?(:UP, p_i)
    8
    elsif press?(:RIGHT, p_i)
    6
    elsif press?(:LEFT, p_i)
    4
    elsif press?(OWN, p_i)
    2
    else
    0
    end
    end
    def self.dir8(p_i = 0)
    return lstick8(p_i) if PadConfig::MOVE_WITH_STICK
    if press?(:UP, p_i) and press?(:LEFT, p_i)
    7
    elsif press?(:UP, p_i) and press?(:RIGHT, p_i)
    9
    elsif press?(OWN, p_i) and press?(:LEFT, p_i)
    1
    elsif press?(OWN, p_i) and press?(:RIGHT, p_i)
    3
    else
    dir4(p_i)
    end
    end
    # Left-stick direction
    def self.lstick8(p_i = 0)
    axis_to_dir8(@lstick[p_i])
    end
    def self.lstick4(p_i = 0)
    axis_to_dir4(@lstick[p_i])
    end
    # Right-stick direction
    def self.rstick8(p_i = 0)
    axis_to_dir8(@rstick[p_i])
    end
    def self.rstick4(p_i = 0)
    axis_to_dir4(@rstick[p_i])
    end
    def self.plugged_in?(pad_index = 0)
    @packet[pad_index] && @packet[pad_index] > 0
    end
    def self.keyboard_key?(button)
    !@keys.has_key?(button)
    end

    #Helper functions:
    # convert signed half-word axis state to float
    def self.constrain_axis(axis)
    val = axis.to_f / 2**15
    val.abs > PadConfig:EADZONE ? val : 0
    end
    # convert axis direction to VX Ace direction
    def self.axis_to_dir8(axis)
    angle_to_dir8(axis_to_angle(axis))
    end
    def self.axis_to_dir4(axis)
    angle_to_dir4(axis_to_angle(axis))
    end
    def self.axis_to_angle(axis)
    cy = -axis[1]
    cx = -axis[0]
    return 0 if cy == 0 && cx == 0
    angle = Math.atan2(cx, cy) * 180 / Math::PI
    angle = angle < 0 ? angle + 360 : angle
    return angle
    end
    # Please PM me if you have an easier way to write this.
    def self.angle_to_dir8(angle)
    return 0 if angle == 0
    d = 0
    if angle < 22.5 || angle >= 337.5
    d = 8
    elsif angle < 67.5
    d = 7
    elsif angle < 112.5
    d = 4
    elsif angle < 157.5
    d = 1
    elsif angle < 202.5
    d = 2
    elsif angle < 247.5
    d = 3
    elsif angle < 292.5
    d = 6
    elsif angle < 337.5
    d = 9
    end
    return d
    end
    def self.angle_to_dir4(angle)
    return 0 if angle == 0
    d = 0
    if angle < 45 || angle >= 315
    d = 8
    elsif angle < 135
    d = 4
    elsif angle < 225
    d = 2
    elsif angle < 315
    d = 6
    end
    return d
    end
    private # methods past here can't be called from outside
    # This hash correlates RM's Input to XInput keys. Experienced Users only!
    # The Input module will handle any keys not listed here (i.e. :CTRL) itself.
    # Integers refer to specific gamepad button IDs.
    @keys = {
    :UP => 15, #d-pad up
    OWN => 14, #d-pad left
    :LEFT => 13, #d-pad down
    :RIGHT => 12, #d-pad right
    :A => 3, #lower face button
    :B => 2, #right face button
    :X => 1, #left face button
    :Y => 0, #upper face button
    :L1 => 7, #upper left trigger
    :R1 => 6, #upper right trigger
    :START => 11,
    :SELECT => 10,
    :L3 => 9, #left thubstick button
    :R3 => 8, #right thubstick button
    :L2 => 16, #lower left trigger (press only)
    :R2 => 17, #lower right trigger (press only)
    }
    #Win32API calls. Leave these alone.
    @set_state = Win32API.new("xinput1_3", "XInputSetState", "IP", "V")
    @get_state = Win32API.new("xinput1_3", "XInputGetState", "IP", "L")
    #Initializers
    # Will store data for number of gamepads in use.
    @packet = Array.new(PadConfig::CONTROLLERS)
    @buttons = Array.new(PadConfig::CONTROLLERS)
    @triggers = Array.new(PadConfig::CONTROLLERS)
    @lstick = Array.new(PadConfig::CONTROLLERS)
    @rstick = Array.new(PadConfig::CONTROLLERS)
    # tracks how long buttons have been pressed
    @holds = Table.new(PadConfig::CONTROLLERS, 18)
    # stores vibration event timers
    @vibrations = Array.new(PadConfig::CONTROLLERS, -1)
    def self.key_holds(symbol, pad_index)
    return 0 if keyboard_key?(symbol)
    @holds[pad_index, @keys[symbol]]
    end
    def self.get_state(pad_index)
    state = "\0" * 16
    @get_state.call(pad_index, state)
    return state.unpack("LSCCssss")
    end
    def self.set_holds(p_i)
    for i in 1...17
    @holds[p_i, i-1] = @buttons[p_i][i].to_i > 0 ? @holds[p_i, i-1] + 1 : 0
    end
    @holds[p_i, 16] = left_trigger(p_i) >= 0.5 ? @holds[p_i, 16]+1 : 0
    @holds[p_i, 17] = right_trigger(p_i) >= 0.5 ? @holds[p_i, 17]+1 : 0
    end
    end
    # Aliases to tie the above into VXAce's Input module
    module Input
    class <<self
    alias :vxa_update :update
    alias :vxa_press? ress?
    alias :vxa_trigger? :trigger?
    alias :vxa_repeat? :repeat?
    alias :vxa_dir4 :dir4
    alias :vxa_dir8 :dir8
    end
    def self.update
    WolfPad.update
    vxa_update
    end
    def self.press?(button)
    return vxa_press?(button) if WolfPad.keyboard_key?(button)
    return WolfPad.press?(button) if WolfPad.plugged_in?
    return vxa_press?(button)
    end
    def self.trigger?(button)
    return vxa_trigger?(button) if WolfPad.keyboard_key?(button)
    return WolfPad.trigger?(button) if WolfPad.plugged_in?
    return vxa_trigger?(button)
    end
    def self.repeat?(button)
    return vxa_repeat?(button) if WolfPad.keyboard_key?(button)
    return WolfPad.repeat?(button) if WolfPad.plugged_in?
    return vxa_repeat?(button)
    end
    def self.dir4
    WolfPad.plugged_in? ? WolfPad.dir4 : vxa_dir4
    end
    def self.dir8
    WolfPad.plugged_in? ? WolfPad.dir8 : vxa_dir8
    end
    end
    [/COED]
    Последний раз редактировалось Arnon; 05.06.2013 в 20:06. Причина: шаблон, ошибки
    Сгорая сам, свети другим.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •