Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

[VX/XP] PedroHLC's Input System (usesDLL+VKList+Window_Edit)

Introduction:
Hello, on Thursday(October 11, 2011) I wanted to practice a little more of using ruby variables on C, so I've done this Input System, it's made of four scripts:
  • Simple Input - A Input class that uses C++ to get all the keys pressed, mouse position, and some joystick buttons.
  • Virtual-Key Codes - A conversion of Microsoft Virtual Key List for Ruby.
  • Check Keys - A function that converts one key pressed into a char. (if needed, I convert it to C too)
  • Window_Edit - A Window to input some information, it has: a cursor, functions for the keys home, end, delete, left, right, and ctr+v if you have Aleworks library(this last function wasn't tested yet).

This Input is an Add-On for Enterbrain's Input, it doesn't remove or substitute any Enterbrain's methods, only add news methods.

Why should you use this?: Because it is fast and gets all the needed variables in only one Win32API command.

Scripts (in English):
Simple Input
Code:
#==============================================================================

# Name: Simple Input

# Description: Add news methods to get any keyboard key, mouse position, and joysticks buttons

#------------------------------------------------------------------------------

# Developed by: PedroHLC

# Version: 1.0

#==============================================================================

 

Graphics.update

$hWnd = Win32API.new('user32', 'GetActiveWindow', '', 'L').call

 

module Input

  @key = Array.new(256, false)

  @old_key = Array.new(256, false)

  @state = Array.new(3, false)

  @joystick = [0, 0, 0, 0] #Buttons, X, Y, POV

  @mousepos = [0, 0] #x, y

  

  @cursor = Sprite.new

  @cursor.z = 99999

  @cursor.bitmap = RPG::Cache.icon('001-Weapon01')

  @cursor_hide = false

  

  GETINPUT = Win32API.new('Input.dll', 'getInput', 'llllll', 'i')

  

  class << self

    alias enterbrain_update update

  end

  

  module_function

   

  def update

    GETINPUT.call(@key.__id__, @old_key.__id__, @state.__id__,

                  @joystick.__id__, @mousepos.__id__, $hWnd)

    enterbrain_update

    

    if @cursor.visible = (!@cursor_hide)

      @cursor.x = @mousepos[0]

      @cursor.y = @mousepos[1]

    end

  end

  

  def getLockKeyState(key)

    case key

    when 0x14

      return @state[0]

    when 0x90

      return @state[1]

    when 0x91

      return @state[2]

    end

    return false

  end

  

  def getKeyState(key)

    return @key[key]

  end

  

  def getLastKeyState(key)

    return @old_key[key]

  end

  

  def getKeyPressed(key)

    return (@key[key] and !@old_key[key])

  end

  

  def getMousePos

    return @mousepos

  end

  

  def getJoystickButtons

    return (@joystick[0].nil? ? @joystick[0] : 0)

  end

  

  def setCursorHide(value)

    @cursor_hide = value

  end

  

  def setCursorBitmap(value)

    @cursor.bitmap = value

  end

  

  def isUpperingCase

    return ( getKeyState(VK::SHIFT) | getLockKeyState(VK::CAPITAL) )

  end

end
Virtual-Key Codes
Code:
#==========================================================================

# Name: Virtual-Key Codes

# Description: List with keyboard keys codes (versão MSDN)

#--------------------------------------------------------------------------

# By: msdn.microsoft.com

# Ripped by: PedroHLC

# Last update: 11/10/10 - 22:00

# Original state:

# [url=http://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx]http://msdn.microsoft.com/en-us/library ... 85%29.aspx[/url]

#==========================================================================

module VK

  

  LBUTTON = 0x01 #Left mouse button

  RBUTTON = 0x02 #Right mouse button

  CANCEL = 0x03 #Control-break processing

  MBUTTON = 0x04 #Middle mouse button (three-button mouse)

  XBUTTON1 = 0x05 #X1 mouse button

  XBUTTON2 = 0x06 #X2 mouse button

  BACK = 0x08 #BACKSPACE key

  TAB = 0x09 #TAB key

  CLEAR = 0x0C #CLEAR key

  RETURN = 0x0D #ENTER key

  SHIFT = 0x10 #SHIFT key

  CONTROL = 0x11 #CTRL key

  MENU = 0x12 #ALT key

  PAUSE = 0x13 #PAUSE key

  CAPITAL = 0x14 #CAPS LOCK key

  KANA = 0x15 #IME Kana mode

  HANGUEL = 0x15 #IME Hanguel mode (maintained for compatibility; use HANGUL)

  HANGUL = 0x15 #IME Hangul mode

  JUNJA = 0x17 #IME Junja mode

  FINAL = 0x18 #IME final mode

  HANJA = 0x19 #IME Hanja mode

  KANJI = 0x19 #IME Kanji mode

  ESCAPE = 0x1B #ESC key

  CONVERT = 0x1C #IME convert

  NONCONVERT = 0x1D #IME nonconvert

  ACCEPT = 0x1E #IME accept

  MODECHANGE = 0x1F #IME mode change request

  SPACE = 0x20 #SPACEBAR

  PRIOR = 0x21 #PAGE UP key

  NEXT = 0x22 #PAGE DOWN key

  KEND = 0x23 #END key

  HOME = 0x24 #HOME key

  LEFT = 0x25 #LEFT ARROW key

  UP = 0x26 #UP ARROW key

  RIGHT = 0x27 #RIGHT ARROW key

  DOWN = 0x28 #DOWN ARROW key

  SELECT = 0x29 #SELECT key

  PRINT = 0x2A #PRINT key

  EXECUTE = 0x2B #EXECUTE key

  SNAPSHOT = 0x2C #PRINT SCREEN key

  INSERT = 0x2D #INS key

  DELETE = 0x2E #DEL key

  HELP = 0x2F #HELP key

  KEY_0 = 0x30 #0 key

  KEY_1 = 0x31 #1 key

  KEY_2 = 0x32 #2 key

  KEY_3 = 0x33 #3 key

  KEY_4 = 0x34 #4 key

  KEY_5 = 0x35 #5 key

  KEY_6 = 0x36 #6 key

  KEY_7 = 0x37 #7 key

  KEY_8 = 0x38 #8 key

  KEY_9 = 0x39 #9 key

  A = 0x41 #A key

  B = 0x42 #B key

  C = 0x43 #C key

  D = 0x44 #D key

  E = 0x45 #E key

  F = 0x46 #F key

  G = 0x47 #G key

  H = 0x48 #H key

  I = 0x49 #I key

  J = 0x4A #J key

  K = 0x4B #K key

  L = 0x4C #L key

  M = 0x4D #M key

  N = 0x4E #N key

  O = 0x4F #O key

  P = 0x50 #P key

  Q = 0x51 #Q key

  R = 0x52 #R key

  S = 0x53 #S key

  T = 0x54 #T key

  U = 0x55 #U key

  V = 0x56 #V key

  W = 0x57 #W key

  X = 0x58 #X key

  Y = 0x59 #Y key

  Z = 0x5A #Z key

  LWIN = 0x5B #Left Windows key (Natural keyboard)

  RWIN = 0x5C #Right Windows key (Natural keyboard)

  APPS = 0x5D #Applications key (Natural keyboard)

  SLEEP = 0x5F #Computer Sleep key

  NUMPAD0 = 0x60 #Numeric keypad 0 key

  NUMPAD1 = 0x61 #Numeric keypad 1 key

  NUMPAD2 = 0x62 #Numeric keypad 2 key

  NUMPAD3 = 0x63 #Numeric keypad 3 key

  NUMPAD4 = 0x64 #Numeric keypad 4 key

  NUMPAD5 = 0x65 #Numeric keypad 5 key

  NUMPAD6 = 0x66 #Numeric keypad 6 key

  NUMPAD7 = 0x67 #Numeric keypad 7 key

  NUMPAD8 = 0x68 #Numeric keypad 8 key

  NUMPAD9 = 0x69 #Numeric keypad 9 key

  MULTIPLY = 0x6A #Multiply key

  ADD = 0x6B #Add key

  SEPARATOR = 0x6C #Separator key

  SUBTRACT = 0x6D #Subtract key

  DECIMAL = 0x6E #Decimal key

  DIVIDE = 0x6F #Divide key

  F1 = 0x70 #F1 key

  F2 = 0x71 #F2 key

  F3 = 0x72 #F3 key

  F4 = 0x73 #F4 key

  F5 = 0x74 #F5 key

  F6 = 0x75 #F6 key

  F7 = 0x76 #F7 key

  F8 = 0x77 #F8 key

  F9 = 0x78 #F9 key

  F10 = 0x79 #F10 key

  F11 = 0x7A #F11 key

  F12 = 0x7B #F12 key

  F13 = 0x7C #F13 key

  F14 = 0x7D #F14 key

  F15 = 0x7E #F15 key

  F16 = 0x7F #F16 key

  F17 = 0x80 #F17 key

  F18 = 0x81 #F18 key

  F19 = 0x82 #F19 key

  F20 = 0x83 #F20 key

  F21 = 0x84 #F21 key

  F22 = 0x85 #F22 key

  F23 = 0x86 #F23 key

  F24 = 0x87 #F24 key

  NUMLOCK = 0x90 #NUM LOCK key

  SCROLL = 0x91 #SCROLL LOCK key

  LSHIFT = 0xA0 #Left SHIFT key

  RSHIFT = 0xA1 #Right SHIFT key

  LCONTROL = 0xA2 #Left CONTROL key

  RCONTROL = 0xA3 #Right CONTROL key

  LMENU = 0xA4 #Left MENU key

  RMENU = 0xA5 #Right MENU key

  BROWSER_BACK = 0xA6 #Browser Back key

  BROWSER_FORWARD = 0xA7 #Browser Forward key

  BROWSER_REFRESH = 0xA8 #Browser Refresh key

  BROWSER_STOP = 0xA9 #Browser Stop key

  BROWSER_SEARCH = 0xAA #Browser Search key

  BROWSER_FAVORITES = 0xAB #Browser Favorites key

  BROWSER_HOME = 0xAC #Browser Start and Home key

  VOLUME_MUTE = 0xAD #Volume Mute key

  VOLUME_DOWN = 0xAE #Volume Down key

  VOLUME_UP = 0xAF #Volume Up key

  MEDIA_NEXT_TRACK = 0xB0 #Next Track key

  MEDIA_PREV_TRACK = 0xB1 #Previous Track key

  MEDIA_STOP = 0xB2 #Stop Media key

  MEDIA_PLAY_PAUSE = 0xB3 #Play/Pause Media key

  LAUNCH_MAIL = 0xB4 #Start Mail key

  LAUNCH_MEDIA_SELECT = 0xB5 #Select Media key

  LAUNCH_APP1 = 0xB6 #Start Application 1 key

  LAUNCH_APP2 = 0xB7 #Start Application 2 key

  OEM_1 = 0xBA #Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key

  OEM_PLUS = 0xBB #For any country/region, the '+' key

  OEM_COMMA = 0xBC #For any country/region, the ',' key

  OEM_MINUS = 0xBD #For any country/region, the '-' key

  OEM_PERIOD = 0xBE #For any country/region, the '.' key

  OEM_2 = 0xBF #Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '/?' key

  OEM_3 = 0xC0 #Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '`~' key

  OEM_4 = 0xDB #Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '[{' key

  OEM_5 = 0xDC #Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '\|' key

  OEM_6 = 0xDD #Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ']}' key

  OEM_7 = 0xDE #Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the 'single-quote/double-quote' key

  OEM_8 = 0xDF #Used for miscellaneous characters; it can vary by keyboard.

  OEM_102 = 0xE2 #Either the angle bracket key or the backslash key on the RT 102-key keyboard

  PROCESSKEY = 0xE5 #IME PROCESS key

  PACKET = 0xE7 #Used to pass Unicode characters as if they were keystrokes. The PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input method

  ATTN = 0xF6 #Attn key

  CRSEL = 0xF7 #CrSel key

  EXSEL = 0xF8 #ExSel key

  EREOF = 0xF9 #Erase EOF key

  PLAY = 0xFA #Play key

  ZOOM = 0xFB #Zoom key

  NONAME = 0xFC #Reserved

  PA1 = 0xFD #PA1 key

  OEM_CLEAR = 0xFE #Clear key

end
Check Keys
Code:
#==============================================================================

# Name: Check Keys

# Description: Converts a pressed key in a char

#------------------------------------------------------------------------------

# Developed by: PedroHLC

# Version: 1.4

#==============================================================================

 

module Input

  module_function

  # Checks all keyboards keys and returns it char if was it pressed

  def check_keys(can_letters=true, can_numbers=true, can_symbol=true)

    return " " if getKeyPressed(VK::SPACE)

    

    up = isUpperingCase

    

    if can_letters == true

      if up

        return "A" if getKeyPressed(VK::A)

        return "B" if getKeyPressed(VK::B)

        return "C" if getKeyPressed(VK::C)

        return "D" if getKeyPressed(VK::D)

        return "E" if getKeyPressed(VK::E)

        return "F" if getKeyPressed(VK::F)

        return "G" if getKeyPressed(VK::G)

        return "H" if getKeyPressed(VK::H)

        return "I" if getKeyPressed(VK::I)

        return "J" if getKeyPressed(VK::J)

        return "K" if getKeyPressed(VK::K)

        return "L" if getKeyPressed(VK::L)

        return "M" if getKeyPressed(VK::M)

        return "N" if getKeyPressed(VK::N)

        return "O" if getKeyPressed(VK::O)

        return "P" if getKeyPressed(VK::P)

        return "Q" if getKeyPressed(VK::Q)

        return "R" if getKeyPressed(VK::R)

        return "S" if getKeyPressed(VK::S)

        return "T" if getKeyPressed(VK::T)

        return "U" if getKeyPressed(VK::U)

        return "V" if getKeyPressed(VK::V)

        return "W" if getKeyPressed(VK::W)

        return "X" if getKeyPressed(VK::X)

        return "Y" if getKeyPressed(VK::Y)

        return "Z" if getKeyPressed(VK::Z)

      else

        return "a" if getKeyPressed(VK::A)

        return "b" if getKeyPressed(VK::B)

        return "c" if getKeyPressed(VK::C)

        return "d" if getKeyPressed(VK::D)

        return "e" if getKeyPressed(VK::E)

        return "f" if getKeyPressed(VK::F)

        return "g" if getKeyPressed(VK::G)

        return "h" if getKeyPressed(VK::H)

        return "i" if getKeyPressed(VK::I)

        return "j" if getKeyPressed(VK::J)

        return "k" if getKeyPressed(VK::K)

        return "l" if getKeyPressed(VK::L)

        return "m" if getKeyPressed(VK::M)

        return "n" if getKeyPressed(VK::N)

        return "o" if getKeyPressed(VK::O)

        return "p" if getKeyPressed(VK::P)

        return "q" if getKeyPressed(VK::Q)

        return "r" if getKeyPressed(VK::R)

        return "s" if getKeyPressed(VK::S)

        return "t" if getKeyPressed(VK::T)

        return "u" if getKeyPressed(VK::U)

        return "v" if getKeyPressed(VK::V)

        return "w" if getKeyPressed(VK::W)

        return "x" if getKeyPressed(VK::X)

        return "y" if getKeyPressed(VK::Y)

        return "z" if getKeyPressed(VK::Z)

      end

    end

    

    if can_numbers == true

      if !up

        return "0" if getKeyPressed(VK::KEY_0)

        return "1" if getKeyPressed(VK::KEY_1)

        return "2" if getKeyPressed(VK::KEY_2)

        return "3" if getKeyPressed(VK::KEY_3)

        return "4" if getKeyPressed(VK::KEY_4)

        return "5" if getKeyPressed(VK::KEY_5)

        return "6" if getKeyPressed(VK::KEY_6)

        return "7" if getKeyPressed(VK::KEY_7)

        return "8" if getKeyPressed(VK::KEY_8)

        return "9" if getKeyPressed(VK::KEY_9)

      end

      if getLockKeyState(VK::NUMLOCK)

        return "0" if getKeyPressed(VK::NUMPAD0)

        return "1" if getKeyPressed(VK::NUMPAD1)

        return "2" if getKeyPressed(VK::NUMPAD2)

        return "3" if getKeyPressed(VK::NUMPAD3)

        return "4" if getKeyPressed(VK::NUMPAD4)

        return "5" if getKeyPressed(VK::NUMPAD5)

        return "6" if getKeyPressed(VK::NUMPAD6)

        return "7" if getKeyPressed(VK::NUMPAD7)

        return "8" if getKeyPressed(VK::NUMPAD8)

        return "9" if getKeyPressed(VK::NUMPAD9)

      end

    end

    

    if can_symbol == true

      if !up

        return ";" if getKeyPressed(VK::OEM_1)

        return "'" if getKeyPressed(VK::OEM_7)

      else

        return ":" if getKeyPressed(VK::OEM_1)

        return "\"" if getKeyPressed(VK::OEM_7)

      end

      return "!" if getKeyPressed(VK::KEY_1)

      return "@" if getKeyPressed(VK::KEY_2)

      return "#" if getKeyPressed(VK::KEY_3)

      return "$" if getKeyPressed(VK::KEY_4)

      return "%" if getKeyPressed(VK::KEY_5)

      return "¨" if getKeyPressed(VK::KEY_6)

      return "&" if getKeyPressed(VK::KEY_7)

      return "*" if getKeyPressed(VK::KEY_8)

      return "(" if getKeyPressed(VK::KEY_9)

      return ")" if getKeyPressed(VK::KEY_0)

      return "[" if getKeyPressed(VK::OEM_4)

      return "]" if getKeyPressed(VK::OEM_6)

      return "\/" if getKeyPressed(VK::OEM_5)

      return "*" if getKeyPressed(VK::MULTIPLY)

      return "+" if getKeyPressed(VK::ADD)

      return "," if getKeyPressed(VK::SEPARATOR)

      return "-" if getKeyPressed(VK::SUBTRACT)

      return "." if getKeyPressed(VK::DECIMAL)

      return "/" if getKeyPressed(VK::DIVIDE)

    end

    

    return ""

  end

end
Window_Edit
Code:
#===============================================================================

# Name: Window_Edit

# Description: A window to type text/informations

#------------------------------------------------------------------------------

# Developed by: PedroHLC 

# Version: 1.2

#===============================================================================

class Window_Edit < Window_Base

  attr_accessor :index

  def initialize(x, y, width, height, max, password=false)

    @text_width = (width - 32)

    @text_height = (height - 32)

    super(x, y, width, height)

    self.contents = Bitmap.new(width - 32, height - 32)

    self.contents.font.size = 16

    self.back_opacity = 160

    @max = max

    @text = []

    @index = 0

    @blink_time = 0

    @password = password

    refresh

  end

  def text

    final_text = ""

    for i in 0..(@text.size-1)

      if @text[i] != nil

        final_text += @text[i].to_s

      end

    end

    return final_text

  end

  def text=(value)

    @text = value.split

  end

  def refresh

    if @blink_time <= -20

      @blink_time = 10

    else

      @blink_time -= 1

    end

    @cursor_char = "|"

    cursorx = 0

    if @password

      see_text = Array.new(@text.size, '*')

    else

      see_text = @text

    end

    if @index > 0

      for i in 0..(see_text.size-1)

        if i == (@index-1)

          cursorx += contents.text_size(see_text[i]).width

          break

        else

          cursorx += contents.text_size(see_text[i]).width

        end

      end

    end

    self.contents.clear

    self.contents.draw_text(1, 0, @text_width, @text_height, see_text.to_s)

    if @blink_time <= 0

      self.contents.draw_text(cursorx, 0, 4, @text_height, '|')

    end

  end

  def add(char)

    return if !char.is_a?(String)

    return if char.to_s == nil.to_s

    temp = []

    for i in 0..(@text.size - 1)

      if i >= @index

        temp[i+1] = @text[i] if @text[i].to_s != nil.to_s

      elsif i < @index

        temp[i] = @text[i] if @text[i].to_s != nil.to_s

      end

    end

    temp[(@index)] = (char.to_s)

    @text = temp

    @index += 1

  end

  def add_array(array)

    return if !array.is_a?(Array)

    if @index >= @text.size

      @text.push(array)

      @index = @text.size

    else

      temp1 = []

      temp2 = []

      for i in 0..(@text.size - 1)

        if i < @index

          temp1.push(@text[i]) if @text[i].to_s != nil.to_s

        elsif i >= @index

          temp2.push(@text[i]) if @text[i].to_s != nil.to_s

        end

      end

      for i in 0..(array.size - 1)

        temp1.push(array[i]) if array[i].to_s != nil.to_s

      end

      for i in 0..(temp2.size - 1)

        temp1.push(temp2[i]) if temp2[i].to_s != nil.to_s

      end

      @index += array.size

      @text = temp1

    end

  end

  def clear

    @text = []

    @index = 0

  end

  def onReturn

    @text.clear

  end

  def update

    if Input.getKeyPressed(VK::RETURN)

      onReturn

    end

    if Input.getKeyPressed(VK::BACK)

      if @text.size.to_i <= 0 or @index <= 0

        $game_system.se_play($data_system.buzzer_se)

      else

        @text.delete_at(@index-1)

        @index -= 1 if @index >= 1

      end

    end

    if Input.getKeyPressed(VK::DELETE)

      if @text.size.to_i <= 0 or @text[@index] == nil

        $game_system.se_play($data_system.buzzer_se)

      else

        @text.delete_at(@index)

      end

    end

    #if Input.getKeyState(VK::CONTROL) and Input.getKeyPressed(VK::V)

      #clipboard = Aleworks::Clipboard.read.to_s.strip.split(//)

      #if ([email=clipboard.to_s.size+@text.to]clipboard.to_s.size+@text.to[/email]_s.size) < @max

        #add_array(clipboard)

        #return

      #else

        #$game_system.se_play($data_system.buzzer_se)

      #end

    #end

    char = Input.check_keys(true,true,true)

    if @text.to_s.size < @max

      add(char) if char != nil

    else

      $game_system.se_play($data_system.buzzer_se)

    end

    if Input.getKeyPressed(VK::LEFT)

      if @index <= 0

        $game_system.se_play($data_system.buzzer_se)

      else

        $game_system.se_play($data_system.cursor_se)

        @index -= 1

      end

    end

    if Input.getKeyPressed(VK::RIGHT)

      if @index >= @text.size

        $game_system.se_play($data_system.buzzer_se)

      else

        $game_system.se_play($data_system.cursor_se)

        @index += 1

      end

    end

    #print @text if Input.getKeyPressed(VK::UP)

    if Input.getKeyPressed(VK::KEND)

      $game_system.se_play($data_system.cursor_se)

      @index = @text.size

    end

    if Input.getKeyPressed(VK::HOME)

      $game_system.se_play($data_system.cursor_se)

      @index = 0

    end

    if @index <= 0

      @index = 0

    elsif @index >= @text.size

      @index = @text.size

    end

    refresh

  end

end

DLL Source:
Code:
//Developed by PedroHLC

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <Mmsystem.h>

#include <windows.h>

 

#define DLLEXTERN extern "C" __declspec (dllexport)

 

#define Qfalse ((VALUE)0)

#define Qtrue  ((VALUE)2)

#define Qnil   4

//#define NIL_P(v) ((VALUE)(v) == Qnil)

#define FIXNUM_FLAG 0x01

#define INT2FIX(i) ((VALUE)(((long)(i))<<1 | FIXNUM_FLAG))

 

 

typedef unsigned long VALUE;

 

typedef struct{

    unsigned long flags;

    VALUE klass;

} RBasic;

 

typedef struct{

    RBasic basic;

    long len;

    union {

           long capa;

           VALUE shared;

    } aux;

    VALUE *ptr;

} RArray;

 

DLLEXTERN int getInput (long rbkeys_id,

                        long rboldkeys_id,

                        long rbstates_id,

                        long rbjoystick_id,

                        long rbmousepos_id,

                     long windowid){

                

        VALUE *rbkeys_arr = ((RArray*)(rbkeys_id << 1))->ptr;

        VALUE *rboldkeys_arr = ((RArray*)(rboldkeys_id << 1))->ptr;

        VALUE *rbstates_arr = ((RArray*)(rbstates_id << 1))->ptr;

        VALUE *rbjoysticks_arr = ((RArray*)(rbjoystick_id << 1))->ptr;

        VALUE *rbmousepos_arr = ((RArray*)(rbmousepos_id << 1))->ptr;

 

        //Old Keys

        for (int keycode = 0; keycode < 256; keycode++){

            if (rbkeys_arr[keycode] == Qtrue) 

                rboldkeys_arr[keycode] = Qtrue;

            else

                rboldkeys_arr[keycode] = Qfalse;

        }

 

        //Keys

        for (int keycode = 0; keycode < 256; keycode++){

            if (GetAsyncKeyState(keycode) >> 8) 

                rbkeys_arr[keycode] = Qtrue;

            else

                rbkeys_arr[keycode] = Qfalse;

        }

        

        //States

        rbstates_arr[0] = (GetKeyState(0x14)? Qtrue : Qfalse);

        rbstates_arr[1] = (GetKeyState(0x90)? Qtrue : Qfalse);

        rbstates_arr[2] = (GetKeyState(0x91)? Qtrue : Qfalse);

 

        //Mouse

        POINT input_MousePos;

        GetCursorPos(&input_MousePos);

        HWND hWnd = (HWND)windowid;

        ScreenToClient(hWnd, &input_MousePos);

        

        rbmousepos_arr[0] = INT2FIX(input_MousePos.x);

        rbmousepos_arr[1] = INT2FIX(input_MousePos.y);

 

        //Joystick

        if (joyGetNumDevs() > 0){

            JOYINFOEX input_JoypadInfo; 

            input_JoypadInfo.dwSize = 52;

            input_JoypadInfo.dwFlags = 255;

            if (joyGetPosEx(0, &input_JoypadInfo) != JOYERR_UNPLUGGED){

                rbjoysticks_arr[0] = INT2FIX(input_JoypadInfo.dwButtons);

                rbjoysticks_arr[1] = INT2FIX(input_JoypadInfo.dwXpos);

                rbjoysticks_arr[2] = INT2FIX(input_JoypadInfo.dwYpos);

                rbjoysticks_arr[3] = INT2FIX(input_JoypadInfo.dwPOV);

            }else{

                rbjoysticks_arr[0] = Qnil;

                rbjoysticks_arr[1] = Qnil;

                rbjoysticks_arr[2] = Qnil;

                rbjoysticks_arr[3] = Qnil;

            }

        }

        

        return 0;

}

Demo (in Portuguese):
Download using DROPBOX.COM

Compiled DLL included in Demo. Not tested yet on RMVX.
As you seen this is a simple and common script, that's why I'll only makes update when it's necessary; anyway thanks for the interesting on it. :biggrin:
 
While I applaud the work that went into this, I do have a complaint about it as well. This is primarily an English speaking forum, with many members in both the United States and Great Britain. The settings you have for the key checks are not the same as what these two groups would expect. For example, I'll list the differences between a USA 101 keyboard and what you have there.

The first one I noticed was your OEM_7 key. The unshifted (effectively, lowercase) character was "'", which is correct for this 101 keyboard. However, the shifted character was "\", which is another key entirely for us. (For locations on the keyboard, I believe OEM_7 is directly to the left of the return key, while the key that 101 keyboards use for "\" is OEM_5, which is directly above the return key, and features "\" as the unshifted character and "|" as the shifted character. The OEM_7 key features '"' as the shifted character for users of a USA 101 keyboard) The next thing I noted was the shifted character for KEY_6, which was "¨" for you, but is actually "^" for us. Next up, is the fact that you did not feature shifted characters for OEM_4, OEM_6, or OEM_5, ("{", "}", and "|", respectively), and that you failed to include OEM_2 ("/" unshifted, "?" shifted), OEM_3 ("`" unshifted, "~" shifted, although the shifted value for standard UK keyboards is actually different), OEM_PLUS ("=" unshifted, "+" shifted), OEM_COMMA ("," unshifted, "<" shifted), OEM_MINUS ("-" unshifted, "_" shifted), or OEM_PERIOD ("." unshifted, ">" shifted).

Now, I'm not saying this to be mean, rude, or anything like that. In the case of the missing keys I listed, I'm pointing them out because I would find it difficult to perform some input tasks without them, even in a game. And, even with a limited input system like many games offer for naming characters, you typically see several of those missing keys as available characters, especially the "-" and "_" characters. I'm also pointing out the differences because, as I said, this is a primarily English forum, and the format you have is not a primarily English format, or at the least, not a particularly common one here.

Now, before you take this the wrong way, I've gone through this with my own input script. I still have transcripts of conversations with BlueScope, a resident scripter who lives in Germany and uses a German format keyboard. My final conclusion with those conversations was that either I could either perfectly simulate a single keyboard, or I could do my best to simulate all keyboards by using an alternative method. I ended up choosing the alternative method, which was using native Windows calls to convert keycodes to their unicode representation according to the currently set system keyboard. And even then, I still had issues with dead keys (which are used in certain languages for things like adding accents to certain characters) and I also had issues where it could not properly read input from any keyboard format that used multiple keystrokes to define a single character. (Like Kana input, for example)

Anyway, that's about all I can say about it, aside from the fact that this appears to only read currently pressed keys when you check, which is terribly limited compared to most input systems I have seen for RMXP and RMVX. As it is, take what I said with a grain of salt, since I've moved on from RM* scripting and currently do most of my programming in C, C++, Java, and PHP, depending on what's currently needed.

Edit: One more thing that I would like to mention. You can actually simulate input from keyboards you don't own by setting the system keyboard to something else using the control panel, and then bringing up the On-Screen Keyboard, which can be found in the accessibility menu (under accessories) in your start menu.
 
Sure this is a forum with generally English population of people, and it is true that those keys are missing, but UNLESS you are making an online game which is the only kind of game where I would find those keys actually necessary, they are not actually needed. If I had to guess I think Pedro wanted to do a simple input system to allow people to make custom name input scripts or something like that.

In the end it all boils down to whether people are gonna use it or not. And as I said, this script is ok, without those missing keys, but not for online games or something that actually requires you to input those characters. :/
 
No, you're not quite getting the point of what Glitch was trying to say. For me, several remotely important characters such as -, _, + and whatnot were non-functional with his initial version. Now, you might of course say they're not needed, but I think Glitchs point is (if not it's still mine) that if you make an input script, don't make one that supports only 60% of the keyboards out there, and everyone else "better not use those keys". I mean, if those special keys are only needed for special games, than I guess normal games only need normal keys. Well, normal keys are supported by default...
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top