O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Gab Abstract Mouse

Iniciado por Raizen, 18/12/2012 às 20:04

Em qualquer lugar; Ou se quiser pega o código do Gab com está def aí.

#==============================================================================#
# Gab Mouse Abstract Module                                                    #
# Autor: Gab!                                                                  #
# Data:  13/03/2012                                                            #
#==============================================================================#
# Classe abstrata para adquirir informações do mouse, sendo elas:              #
# - Posição                                                                    #
# - Clique                                                                     #
# - Pressionamento                                                             #
# - Repetição                                                                  #
#                                                                              #
# Utilização:                                                                  #
#                                                                              #
# Mouse.update                # Atualização                                    #
# Mouse.pos                   # Array [Pos x, Pos y]                           #
# Mouse.click?(Mouse::LEFT)   # Clique com botão esquerdo?                     #
# Mouse.press?(Mouse::SCROLL) # Pressionando scroll?                           #
# Mouse.repeat?(Mouse::RIGHT) # Repetindo botão direito?                       #
#                                                                              #
# Constantes indicadores de teclas:                                            #
#                                                                              #
# Mouse::LEFT    - Botão esquerdo                                              #
# Mouse::RIGHT   - Botão direito                                               #
# Mouse::SCROLL  - Botão central                                               #
# Mouse::BUTTON4 - 4º Botão (Mouse Gamer)                                      #
# Mouse::BUTTON5 - 5º Botão (Mouse Gamer)                                      #
#==============================================================================#

module Mouse
  # Declarações de API
  GAME_WINDOW = Win32API.new("user32", "GetActiveWindow",  "v",  "l").call
  GET_RECT    = Win32API.new("user32", "GetWindowRect",    "lp", "l")
  CUR_POS     = Win32API.new("user32", "GetCursorPos",     "p",  "l")
  GET_CLICK   = Win32API.new("user32", "GetAsyncKeyState", "l",  "l")
  
  # Constantes
  LEFT    = 1
  RIGHT   = 2
  SCROLL  = 4
  BUTTON4 = 5
  BUTTON5 = 6
  
  # Auxiliar
  @state  = {LEFT => 0, RIGHT => 0, SCROLL => 0, BUTTON4 => 0, BUTTON5 => 0}
  
  # Métodos
  module_function
  
  # Atualização
  def update
    @state.each{|key, value| 
      @state[key] = (GET_CLICK.call(key) != 0 ? @state[key] + 1 : 0) 
      @state[key] = 15 if @state[key] == 17
    }
  end
  
  # Método para posição em relação à janela
  def pos
    buffer = [[0,0].pack("l*"), [0,0].pack("l*")]
   
    GET_RECT.call(GAME_WINDOW, buffer[0])
    CUR_POS.call(buffer[1])
   
    return buffer[1].unpack("l*").zip(buffer[0].unpack("l*")).map{|a, b| a - b}
  end
  
  # Click único
  def click?(button = LEFT)
    return @state[button] == 1
  end
  
  # Pressionado
  def press?(button = LEFT)
    return @state[button] > 0
  end
  
  # Repetindo
  def repeat?(button = LEFT)
    return @state[button] == 1 || @state[button] == 16
  end
 # área
 def area(object2)
    pos[0] >= object2.x && pos[0] <= object2.bitmpa.width && pos[1] >= object2.y &&  pos[1] <= object2.bitmap.height
  end
end