Suporte no desenvolvimento de jogos


    Input Master

    Valentine
    Valentine
    Administrador
    Administrador

    Medalhas : Input Master 94JxvInput Master ZgLkiRU
    Mensagens : 5021
    Créditos : 1114
    Cash : 0

    Input Master Empty Input Master

    Mensagem por Valentine em Qua Jan 07, 2015 8:53 pm

    Input Master
    Autor: Valentine
    Versão: 1.0.0

    Introdução:
    Eu fiz um pequeno input enquanto estudava algumas funções do Win32API, no entanto, apesar de pouco código, ele tem a maioria das funções de um input qualquer.
    Esta é a primeira versão e a fiz em pouco tempo.
    Sei que usar GetAsyncKeyState não é tão bom quanto GetKeyboardState, mas irei evoluir o código nas próximas versões.
    Por fim, só para deixar claro, o def repeat ainda não está completo.

    Script:
    Código:
    #==============================================================================
    # ** Input Master
    #------------------------------------------------------------------------------
    # Autor: Valentine
    #------------------------------------------------------------------------------
    # Obrigado Blizzard
    #==============================================================================

    module Input
      #----------------------------------------------------------------------------
      # * Teclas
      #----------------------------------------------------------------------------
      Key = {'Mouse Left' => 1, 'Mouse Right' => 2, 'Mouse Middle' => 4, 'Alt' => 18,
             'Caps Lock' => 20, 'Backspace' => 8, 'Tab' => 9, 'Enter' => 13,
             'Shift' => 16, 'Ctrl' => 17, 'Esc' => 27, 'Left' => 37, 'Up' => 38,
             'Right' => 39, 'Down' => 40, 'Space' => 32, 'NumberKey 0' => 48,
             'NumberKey 1' => 49, 'NumberKey 2' => 50, 'NumberKey 3' => 51,
             'NumberKey 4' => 52, 'NumberKey 5' => 53, 'NumberKey 6' => 54,
             'NumberKey 7' => 55, 'NumberKey 8' => 56, 'NumberKey 9' => 57,
             'NumberPad 0' => 96, 'NumberPad 1' => 97, 'NumberPad 2' => 98,
             'NumberPad 3' => 99, 'NumberPad 4' => 100, 'NumberPad 5' => 101,
             'NumberPad 6' => 102, 'NumberPad 7' => 103, 'NumberPad 8' => 104,
             'NumberPad 9' => 105, 'A' => 65, 'B' => 66, 'C' => 67, 'D' => 68,
             'E' => 69, 'F' => 70, 'G' => 71, 'H' => 72, 'I' => 73, 'J' => 74,
             'K' => 75, 'L' => 76, 'M' => 77, 'N' => 78, 'O' => 79, 'P' => 80,
             'Q' => 81, 'R' => 82, 'S' => 83, 'T' => 84, 'U' => 85, 'V' => 86,
             'W' => 87, 'X' => 88, 'Y' => 89, 'Z' => 90, 'F1' => 112, 'F2' => 113,
             'F3' => 114, 'F4' => 115, 'F5' => 116, 'F6' => 117, 'F7' => 118,
             'F8' => 119, 'F9' => 120, 'F10' => 121, 'F11' => 122, 'F12' => 123,
             ';' => 186, '=' => 187, ',' => 188, '-' => 189, '.' => 190, '/' => 193,
             '[' => 219, ']' => 221, 'Page Up' => 33, 'Page Down' => 34, "|" => 220}
      # Teclas padrões
      UP = Key['Up']
      LEFT = Key['Left']
      DOWN = Key['Down']
      RIGHT = Key['Right']
      A = Key['Shift']
      B = Key['Esc']
      C = Key['Enter']
      X = Key['A']
      Y = Key['S']
      Z = Key['D']
      L = Key['Page Down']
      R = Key['Page Up']
      F5 = Key['F5']
      F6 = Key['F6']
      F7 = Key['F7']
      F8 = Key['F8']
      F9 = Key['F9']
      SHIFT = Key['Shift']
      CTRL = Key['Ctrl']
      ALT = Key['Alt']
      # Win32 API
      GetKeyState = Win32API.new('user32', 'GetKeyState', 'I', 'I')
      GetAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'I', 'I')
      #----------------------------------------------------------------------------
      # * Pressionou?
      #----------------------------------------------------------------------------
      def self.trigger?(key)
        return GetAsyncKeyState.call(key) & 0x01 == 1
      end
      #----------------------------------------------------------------------------
      # * Pressionando?
      #----------------------------------------------------------------------------
      def self.pressed?(key)
        return !GetKeyState.call(key).between?(0, 1)
      end
      #--------------------------------------------------------------------------
      # * Repetição (incompleto)
      #--------------------------------------------------------------------------
      def self.repeat?(key)
        return trigger?(key)
      end
      #----------------------------------------------------------------------------
      # * Verificação das 4 direções
      #----------------------------------------------------------------------------
      def self.dir4
        return 2 if pressed?(DOWN)
        return 4 if pressed?(LEFT)
        return 6 if pressed?(RIGHT)
        return 8 if pressed?(UP)
      end
    end

    Créditos:
    Valentine


    Última edição por Valentine em Sex Mar 31, 2017 2:47 pm, editado 15 vez(es)


    _________________
    Input Master AIymW
    Pablo Kawan
    Pablo Kawan
    Experiente
    Experiente

    Mensagens : 481
    Créditos : 158
    Cash : 0

    Input Master Empty Re: Input Master

    Mensagem por Pablo Kawan em Qua Jan 07, 2015 10:12 pm

    Parabêns! espero que termine +1 irá ajudar muita gente Trollface


    _________________
    Assinatura removida pela Staff
    ^ Tenho nova, surprise
    Input Master H2D9a9k
    urbios
    urbios
    Iniciante
    Iniciante

    Mensagens : 74
    Créditos : 21
    Cash : 0

    Input Master Empty Re: Input Master

    Mensagem por urbios em Sex Jan 09, 2015 8:18 pm




    Sr.valentine es compatible con netplay master 4.9?


    _________________
    RPG maker XP in android? Razz :
    Valentine
    Valentine
    Administrador
    Administrador

    Medalhas : Input Master 94JxvInput Master ZgLkiRU
    Mensagens : 5021
    Créditos : 1114
    Cash : 0

    Input Master Empty Re: Input Master

    Mensagem por Valentine em Sex Jan 09, 2015 9:24 pm

    @urbios escreveu:


    Sr.valentine es compatible con netplay master 4.9?
    É preciso adaptar, pois a versão 4.9.1 ainda usa o antigo input do Netplay Plus 1.7 que tem vários defs desnecessários. Além do mais, iria ter que fazer pequenas alterações em alguns scripts, como, por exemplo:
    Ao invés de usar:
    Código:
    Input::O
    Teria que usar:
    Código:
    Input::Key['O']

    Mas não se preocupe, na próxima versão disponibilizarei o NPM com um novo input.


    Última edição por Valentine em Sab Jan 10, 2015 7:44 am, editado 1 vez(es)


    _________________
    Input Master AIymW
    urbios
    urbios
    Iniciante
    Iniciante

    Mensagens : 74
    Créditos : 21
    Cash : 0

    Input Master Empty Re: Input Master

    Mensagem por urbios em Sab Jan 10, 2015 12:43 am

    É uma boa .script. muito obrigado +1


    _________________
    RPG maker XP in android? Razz :
    MalucaoBeleza
    MalucaoBeleza
    Desenvolvedor
    Desenvolvedor

    Medalhas : Input Master ILtUbYveyXDIf
    Mensagens : 724
    Créditos : 58
    Cash : 0

    Input Master Empty Re: Input Master

    Mensagem por MalucaoBeleza em Dom Fev 01, 2015 5:35 pm

    Código:
     if Input.repeat?(Input::RIGHT)

    n deu certo essa condição com ele..
    Valentine
    Valentine
    Administrador
    Administrador

    Medalhas : Input Master 94JxvInput Master ZgLkiRU
    Mensagens : 5021
    Créditos : 1114
    Cash : 0

    Input Master Empty Re: Input Master

    Mensagem por Valentine em Dom Fev 01, 2015 9:04 pm

    @MalucaoBeleza escreveu:
    Código:
     if Input.repeat?(Input::RIGHT)

    n deu certo essa condição com ele..
    Essa função é a única que não está funcionando corretamente, pois eu ainda não terminei ela.


    _________________
    Input Master AIymW
    Komuro Takashi
    Komuro Takashi
    Colaborador
    Colaborador

    Mensagens : 1034
    Créditos : 131
    Cash : 0

    Input Master Empty Re: Input Master

    Mensagem por Komuro Takashi em Seg Fev 02, 2015 1:25 pm

    Esse input se vc olhar o Do Telam vai conseguir evoluir bastante o @Vlad usa esse mesmo tipo na programação só que as funções ele compilou em uma DLL e chamou ela simplificando o máximo o script.

    É isso ai @Val

    Esse é o Metodo usado pelo RM

    Código:

    # A module that handles input data from a gamepad or keyboard.
    #
    # Managed by symbols rather than button numbers in RGSS3. (RGSS3)
    module Input
      Keys = {
          DOWN:     [SDL::Key::DOWN, SDL::Key::S],
          LEFT:     [SDL::Key::LEFT, SDL::Key::A],
          RIGHT:    [SDL::Key::RIGHT, SDL::Key::D],
          UP:       [SDL::Key::UP, SDL::Key::W],
          A:        [SDL::Key::LSHIFT],
          B:        [SDL::Key::X, SDL::Key::ESCAPE],
          C:        [SDL::Key::Z, SDL::Key::RETURN],
          L:        [SDL::Key::PAGEUP],
          R:        [SDL::Key::PAGEDOWN],
          SHIFT:    [SDL::Key::LSHIFT, SDL::Key::RSHIFT],
          CTRL:     [SDL::Key::LSHIFT, SDL::Key::RSHIFT],
          ALT:      [SDL::Key::LSHIFT, SDL::Key::RSHIFT],
          F5:       [SDL::Key::F5],
          F6:       [SDL::Key::F6],
          F7:       [SDL::Key::F7],
          F8:       [SDL::Key::F8],
          F9:       [SDL::Key::F9],
          SHOW_FPS: [SDL::Key::F2],
          RESET:    [SDL::Key::F12]
      }

      Entities = {}

      Keys.each { |key, value|
        const_set(key, key)
        value.each { |entity| Entities[entity] = key }

      }
      @status = {}
      @events = []
      class <<self
        attr_accessor :events

        # Updates input data. As a general rule, this method is called once per frame.

        def update
          RGSS.update
          @status.each { |key, value| @status[key] = value.next }
          while event = events.shift
            key = Entities[event.sym]
            Log.debug('key') { event }
            if event.press
              case key
              when :SHOW_FPS
                RGSS.show_fps = !RGSS.show_fps
              when :RESET
                raise RGSSReset
              else
                @status[key] = 0
              end
            else
              @status.delete key
            end
          end
        end

        # Determines whether the button corresponding to the symbol sym is currently being pressed.
        #
        # If the button is being pressed, returns TRUE. If not, returns FALSE.
        #
        #  if Input.press?(:C)
        #    do_something
        #  end

        def press?(sym)
          @status[sym]
        end

        # Determines whether the button corresponding to the symbol sym is currently being pressed again.
        #
        # "Pressed again" is seen as time having passed between the button being not pressed and being pressed.
        #
        # If the button is being pressed, returns TRUE. If not, returns FALSE.

        def trigger?(sym)
          @status[sym] and @status[sym].zero?
        end

        # Determines whether the button corresponding to the symbol sym is currently being pressed again.
        #
        # Unlike trigger?, takes into account the repeated input of a button being held down continuously.
        #
        # If the button is being pressed, returns TRUE. If not, returns FALSE.

        def repeat?(sym)
          @status[sym] and (@status[sym].zero? or (@status[sym] > 10 and (@status[sym] % 4).zero?))
        end

        # Checks the status of the directional buttons, translates the data into a specialized 4-direction input format, and returns the number pad equivalent (2, 4, 6, 8).
        #
        # If no directional buttons are being pressed (or the equivalent), returns 0.

        def dir4
          case
          when @status[:DOWN]
            2
          when @status[:LEFT]
            4
          when @status[:RIGHT]
            6
          when @status[:UP]
            8
          else
            0
          end
        end

        # Checks the status of the directional buttons, translates the data into a specialized 8-direction input format, and returns the number pad equivalent (1, 2, 3, 4, 6, 7, 8, 9).
        #
        # If no directional buttons are being pressed (or the equivalent), returns 0.

        def dir8
          case
          when @status[:DOWN] && @status[:LEFT]
            1
          when @status[:DOWN] && @status[:RIGHT]
            3
          when @status[:DOWN]
            2
          when @status[:UP] && @status[:LEFT]
            7
          when @status[:UP] && @status[:RIGHT]
            9
          when @status[:UP]
            8
          when @status[:LEFT]
            4
          when @status[:RIGHT]
            6
          else
            0
          end
        end
      end

    end

    Espero que ajude Very Happy


    _________________
    Input Master Takashi_komuro_by_minato8-d51g9o4
    Valentine
    Valentine
    Administrador
    Administrador

    Medalhas : Input Master 94JxvInput Master ZgLkiRU
    Mensagens : 5021
    Créditos : 1114
    Cash : 0

    Input Master Empty Re: Input Master

    Mensagem por Valentine em Seg Jul 04, 2016 8:41 am

    Tópico atualizado.


    _________________
    Input Master AIymW

    Conteúdo patrocinado

    Input Master Empty Re: Input Master

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Qui Dez 05, 2019 12:57 pm