RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
Text Input via keyboard

0 Members and 1 Guest are viewing this topic.

**
Rep: +0/-0Level 71
RMRK Junior
hey,

ok so I know there is a couple scripts out there that allows you to do this, but I cant seam to find any today..

what im looking for is a script that would allow the player to input their name, in the name input screen, using the keyboard. If someone could point me to a script that does this, it would be great.

thanks

Matt (Mapper2100)

****
Rep:
Level 84
3...2...1...
Here you go. Credit to Cyclope.
Code: [Select]
#==============================================================================
# Modified Scene_Name 1.3b Final
# By Cyclope
# Author's post: http://forum.chaos-project.com/index.php?topic=6731.0
# Edit by Helladen: Converted to VX and fixed alignment and settings.
# I also rewrote the enter button it now works properly.
# - 1.1 release for VX. (7/15/10)
# - 1.2 fixed the guide text at the bottom. (7/15/10)
# - 1.3 added where you can have it draw your face or character sprite.
#   Fixed it from not having a sound if you erased letters.
#   Changed some of the sounds and other small fixes. (7/19/10)
# - 1.3b fixed where you could space the whole name and space sounds.
#------------------------------------------------------------------------------
# Instructions
# Place above main
#------------------------------------------------------------------------------
# Credit:
# Nattmath (For making Scene_Name Letters Modification)
# Blizzard (For making Custom Controls)
# Cyclope (For modifying Scene_Name Leters Modification and Scene_Name)
# Helladen (Converted to Rpg Maker VX and enhanced it)
#==============================================================================

#==============================================================================
# ** Window_Instructions
#------------------------------------------------------------------------------
# This window displays full status specs on the status screen.
#==============================================================================
# Configuration
#------------------------------------------------------------------------------
DRAW_FACE = false # If this is true then it will draw a face if not then sprite
#==============================================================================

class Window_Instruction < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
#--------------------------------------------------------------------------
def initialize
super( 0, 336, 544, 80)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
self.contents.font.name = "Arial"
self.contents.font.size = 18
self.contents.font.color = normal_color
#Change this text to whatever instructions you want to have!
self.contents.draw_text(000, 9, 404, 32, "Enter = Confirm,")
self.contents.draw_text(120, 9, 404, 32, "Backspace = Delete,")
self.contents.draw_text(275, 9, 404, 32, "Keyboard = Text,")
self.contents.draw_text(400, 9, 404, 32, "Shift = Capital")
end
end
#==============================================================================
# ** Window_TextName
#------------------------------------------------------------------------------
# super ( 224, 32, 224, 80)
#==============================================================================
class Window_TextName < Window_Base
def initialize
if DRAW_FACE
super (164, 0, 224, 128)
else
super (164, 66, 224, 62)
end 
self.contents = Bitmap.new(width - 32, height - 32)
@actor = $game_actors[$game_temp.name_actor_id]
refresh
end
def refresh
self.contents.clear
self.contents.font.name = "Arial"
self.contents.font.size = 32
self.contents.font.color = normal_color
if DRAW_FACE
draw_actor_face(@actor, 2, @actor.index * 96 + 2, 92)
self.contents.draw_text(112, 32, 64, 32, "Name:")
else 
draw_actor_graphic(@actor, 32, 32)
self.contents.draw_text(64, 0, 64, 32, "Name:")
end
end
end

#==============================================================================
# ** Window_NameEdit
#------------------------------------------------------------------------------
# This window is used to edit your name on the input name screen.
#==============================================================================

class Window_NameEdit < Window_Base

#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
# max_char : maximum number of characters
#--------------------------------------------------------------------------
def initialize(actor, max_char)
super(16, 128, 512, 96)
self.contents = Bitmap.new(width - 32, height - 32)
@actor = actor
@name = actor.name
@max_char = max_char
# Fit name within maximum number of characters
name_array = @name.split(//)[0...@max_char]
@name = ""
for i in 0...name_array.size
@name += name_array[i]
end
@default_name = @name
@index = name_array.size
refresh
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Return to Default Name
#--------------------------------------------------------------------------
def restore_default
@name = @default_name
@index = @name.split(//).size
refresh
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Add Character
# character : text character to be added
#--------------------------------------------------------------------------
def add(character)
if @index < @max_char and character != ""
@name += character
@index += 1
refresh
update_cursor_rect
end
end
#--------------------------------------------------------------------------
# * Delete Character
#--------------------------------------------------------------------------
def back
if @index > 0
# Delete 1 text character
name_array = @name.split(//)
@name = ""
for i in 0...name_array.size-1
@name += name_array[i]
end
@index -= 1
refresh
update_cursor_rect
end
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# Draw name
self.contents.font.size = 42
name_array = @name.split(//)
for i in 0...@max_char
c = name_array[i]
if c == nil
c = "_"
end
x = 258 - @max_char * 14 + i * 26
self.contents.draw_text(x, 15, 28, 42, c, 1)
end
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
x = 262 - @max_char * 14 + @index * 26
self.cursor_rect.set(x, 46, 20, 5)
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
update_cursor_rect
end
end

#==============================================================================
# ** Window_NameInput
#------------------------------------------------------------------------------
# This window is used to select text characters on the input name screen.
#==============================================================================

class Window_NameInput < Window_Base
CHARACTER_TABLE =
[
"", ""

]
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 128, 544, 0)
self.contents = Bitmap.new(width - 32, height - 32)
@index = 0
refresh
end
#--------------------------------------------------------------------------
# * Text Character Acquisition
#--------------------------------------------------------------------------
def character
return CHARACTER_TABLE[@index]
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
end

#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
end
end
#==============================================================================
# ** Scene_Name
#------------------------------------------------------------------------------
# This class performs name input screen processing.
#==============================================================================

class Scene_Name
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Get actor
@actor = $game_actors[$game_temp.name_actor_id]
# Make windows
@edit_window = Window_NameEdit.new(@actor, $game_temp.name_max_char)
@edit_window.back_opacity = 160
@input_window = Window_NameInput.new
@inst_window = Window_Instruction.new
@inst_window.back_opacity = 160
@nametext_window = Window_TextName.new
@nametext_window.back_opacity = 160
@spriteset = Spriteset_Map.new
# Execute transition
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of windows
@edit_window.dispose
@input_window.dispose
@inst_window.dispose
@nametext_window.dispose
@spriteset.dispose
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Update windows
@edit_window.update
@input_window.update
@nametext_window.update
@inst_window.update
# If C button was pressed
if Input.trigger?(Input::C)
# If cursor position is at [OK]
if @input_window.character == nil
# If name is empty
if @edit_window.name == ""
# If name is empty
if @edit_window.name == ""
# Play buzzer SE
Sound.play_buzzer
return
end
# Play decision SE
Sound.play_cursor
return
end
# Change actor name
@actor.name = @edit_window.name
# Play decision SE
Sound.play_cursor
# Switch to map screen
$scene = Scene_Map.new
return
end
# If cursor position is at maximum
if @edit_window.index == $game_temp.name_max_char
# Play buzzer SE
Sound.play_buzzer
return
end
# If text character is empty
if @input_window.character == ""
# Play buzzer SE
Sound.play_buzzer
return
end
# Play decision SE
Sound.play_cursor
# Add text character
@edit_window.add(@input_window.character)
return
end
end
end

#==============================================================================
# module Input
#==============================================================================

module Input

#----------------------------------------------------------------------------
# Simple ASCII table
#----------------------------------------------------------------------------
Key = {'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,
'0' => 48, '1' => 49, '2' => 50, '3' => 51, '4' => 52, '5' => 53,
'6' => 54, '7' => 55, '8' => 56, '9' => 57,
'NumberPad 0' => 45, 'NumberPad 1' => 35, 'NumberPad 2' => 40,
'NumberPad 3' => 34, 'NumberPad 4' => 37, 'NumberPad 5' => 12,
'NumberPad 6' => 39, 'NumberPad 7' => 36, 'NumberPad 8' => 38,
'NumberPad 9' => 33,
'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, '/' => 220,
'\\' => 191, '\'' => 222, '[' => 219, ']' => 221, '`' => 192,
'Backspace' => 8, 'Tab' => 9, 'Enter' => 13, 'Shift' => 16,
'Left Shift' => 160, 'Right Shift' => 161, 'Left Ctrl' => 162,
'Right Ctrl' => 163, 'Left Alt' => 164, 'Right Alt' => 165,
'Ctrl' => 17, 'Alt' => 18, 'Esc' => 27, 'Space' => 32, 'Page Up' => 33,
'Page Down' => 34, 'End' => 35, 'Home' => 36, 'Insert' => 45,
'Delete' => 46, 'Arrow Left' => 37, 'Arrow Up' => 38,
'Arrow Right' => 39, 'Arrow Down' => 40,
'Mouse Left' => 1, 'Mouse Right' => 2, 'Mouse Middle' => 4,
'Mouse 4' => 5, 'Mouse 5' => 6}
# default button configuration
UP = [Key['Arrow Up']]
LEFT = [Key['Arrow Left']]
DOWN = [Key['Arrow Down']]
RIGHT = [Key['Arrow Right']]
A = [Key['Shift']]
B = [Key['Esc'], Key['NumberPad 0'], Key['X']]
C = [Key['Space'], Key['Enter'], Key['C']]
X = [Key['A']]
Y = [Key['S']]
Z = [Key['D']]
L = [Key['Q'], Key['Page Down']]
R = [Key['W'], 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']]
# All keys
ALL_KEYS = (0...256).to_a
# Win32 API calls
GetKeyboardState = Win32API.new('user32','GetKeyboardState', 'P', 'I')
GetKeyboardLayout = Win32API.new('user32', 'GetKeyboardLayout','L', 'L')
MapVirtualKeyEx = Win32API.new('user32', 'MapVirtualKeyEx', 'IIL', 'I')
ToUnicodeEx = Win32API.new('user32', 'ToUnicodeEx', 'LLPPILL', 'L')
# some other constants
DOWN_STATE_MASK = 0x80
DEAD_KEY_MASK = 0x80000000
# data
@state = "\0" * 256
@triggered = Array.new(256, false)
@pressed = Array.new(256, false)
@released = Array.new(256, false)
@repeated = Array.new(256, 0)
#----------------------------------------------------------------------------
# update
# Updates input.
#----------------------------------------------------------------------------
def self.update
# get current language layout
@language_layout = GetKeyboardLayout.call(0)
# get new keyboard state
GetKeyboardState.call(@state)
# for each key
ALL_KEYS.each {|key|
# if pressed state
if @state[key] & DOWN_STATE_MASK == DOWN_STATE_MASK
# not released anymore
@released[key] = false
# if not pressed yet
if !@pressed[key]
# pressed and triggered
@pressed[key] = true
@triggered[key] = true
else
# not triggered anymore
@triggered[key] = false
end
# update of repeat counter
@repeated[key] < 17 ? @repeated[key] += 1 : @repeated[key] = 15
# not released yet
elsif !@released[key]
# if still pressed
if @pressed[key]
# not triggered, pressed or repeated, but released
@triggered[key] = false
@pressed[key] = false
@repeated[key] = 0
@released[key] = true
end
else
# not released anymore
@released[key] = false
end}
end
#----------------------------------------------------------------------------
# dir4
# 4 direction check.
#----------------------------------------------------------------------------
def Input.dir4
return 2 if Input.press?(DOWN)
return 4 if Input.press?(LEFT)
return 6 if Input.press?(RIGHT)
return 8 if Input.press?(UP)
return 0
end
#----------------------------------------------------------------------------
# dir8
# 8 direction check.
#----------------------------------------------------------------------------
def Input.dir8
down = Input.press?(DOWN)
left = Input.press?(LEFT)
return 1 if down && left
right = Input.press?(RIGHT)
return 3 if down && right
up = Input.press?(UP)
return 7 if up && left
return 9 if up && right
return 2 if down
return 4 if left
return 6 if right
return 8 if up
return 0
end
#----------------------------------------------------------------------------
# trigger?
# Test if key was triggered once.
#----------------------------------------------------------------------------
def Input.trigger?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @triggered[key]}
end
#----------------------------------------------------------------------------
# press?
# Test if key is being pressed.
#----------------------------------------------------------------------------
def Input.press?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @pressed[key]}
end
#----------------------------------------------------------------------------
# repeat?
# Test if key is being pressed for repeating.
#----------------------------------------------------------------------------
def Input.repeat?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @repeated[key] == 1 || @repeated[key] == 16}
end
#----------------------------------------------------------------------------
# release?
# Test if key was released.
#----------------------------------------------------------------------------
def Input.release?(keys)
keys = [keys] unless keys.is_a?(Array)
return keys.any? {|key| @released[key]}
end
#----------------------------------------------------------------------------
# get_character
# vk - virtual key
# Gets the character from keyboard input using the input locale identifier
# (formerly called keyboard layout handles).
#----------------------------------------------------------------------------
def self.get_character(vk)
# get corresponding character from virtual key
c = MapVirtualKeyEx.call(vk, 2, @language_layout)
# stop if character is non-printable and not a dead key
return '' if c < 32 && (c & DEAD_KEY_MASK != DEAD_KEY_MASK)
# get scan code
vsc = MapVirtualKeyEx.call(vk, 0, @language_layout)
# result string is never longer than 2 bytes (Unicode)
result = "\0" * 2
# get input string from Win32 API
length = ToUnicodeEx.call(vk, vsc, @state, result, 2, 0, @language_layout)
return (length == 0 ? '' : result)
end
#----------------------------------------------------------------------------
# get_input_string
# Gets the string that was entered using the keyboard over the input locale
# identifier (formerly called keyboard layout handles).
#----------------------------------------------------------------------------
def self.get_input_string
result = ''
# check every key
ALL_KEYS.each {|key|
# if repeated
if self.repeat?(key)
# get character from keyboard state
c = self.get_character(key)
# add character if there is a character
result += c if c != ''
end}
# empty if result is empty
return '' if result == ''
# convert string from Unicode to UTF-8
return self.unicode_to_utf8(result)
end
#----------------------------------------------------------------------------
# get_input_string
# string - string in Unicode format
# Converts a string from Unicode format to UTF-8 format as RGSS does not
# support Unicode.
#----------------------------------------------------------------------------
def self.unicode_to_utf8(string)
result = ''
string.unpack('S*').each {|c|
# characters under 0x80 are 1 byte characters
if c < 0x0080
result += c.chr
# other characters under 0x800 are 2 byte characters
elsif c < 0x0800
result += (0xC0 | (c >> 6)).chr
result += (0x80 | (c & 0x3F)).chr
# the rest are 3 byte characters
else
result += (0xE0 | (c >> 12)).chr
result += (0x80 | ((c >> 12) & 0x3F)).chr
result += (0x80 | (c & 0x3F)).chr
end}
return result
end

end

#==============================================================================
# ** Scene_Name Leters Modification Made By Nattmath and Improved Cyclope
#------------------------------------------------------------------------------
# Makes you imput stuf with the keyboard
#==============================================================================
class Scene_Name

alias name_input_update update
def update
if @edit_window.index != $game_temp.name_max_char
(65...91).each{|i|
if Input.trigger?(i)
Sound.play_cursor
let = Input::Key.index(i)
let = let.downcase unless Input.press?(Input::Key['Shift'])
@edit_window.add(let)
end}
(48...58).each{|i|
if Input.trigger?(i)
Sound.play_cursor
let = Input::Key.index(i)
@edit_window.add(let)
end}
(186...192).each{|i|
if Input.trigger?(i)
Sound.play_cursor
let = Input::Key.index(i)
@edit_window.add(let)
end}
(219...222).each{|i|
if Input.trigger?(i)
Sound.play_cursor
let = Input::Key.index(i)
@edit_window.add(let)
end}
end
if @edit_window.name != ""
if Input.trigger?(Input::Key['Backspace'])
@edit_window.back
Sound.play_cancel
elsif Input.trigger?(Input::Key['Arrow Left'])
@edit_window.back
Sound.play_cancel
end
end
if Input.trigger?(Input::Key['Enter'])
if @edit_window.name != "" and @edit_window.name != " " and @edit_window.name != "  " and @edit_window.name != "   " and @edit_window.name != "    " and @edit_window.name != "     " and @edit_window.name != "      " and @edit_window.name != "       " and @edit_window.name != "        " and @edit_window.name != "         " and @edit_window.name != "          " and @edit_window.name != "           " and @edit_window.name != "            " and @edit_window.name != "             " and @edit_window.name != "              " and @edit_window.name != "               " and @edit_window.name != "                " 
# Change actor name
@actor.name = @edit_window.name
# Play decision SE
Sound.play_decision
# Switch to map screen
$scene = Scene_Map.new
return
else
# If name is empty return to default name
# Play buzzer SE
@edit_window.restore_default
Sound.play_buzzer
return
end
end
if Input.trigger?(Input::Key['Space'])
if @edit_window.index != $game_temp.name_max_char 
@actor.name = @edit_window.name
Sound.play_cursor
@edit_window.add(" ")
end
end
end
end

that scripts perfect, but one problem. it f@#ks up my mouse scriptt... can you fix that???

Btw im the same person

****
Rep:
Level 84
3...2...1...
Why do you have two accounts?

And I don't know how to script, sorry. Cyclope made that script, I just found it and liked it well enough to put it in my game.

********
Furry Philosopher
Rep:
Level 94
Rawr?
2013 Best RPG Maker User (Creativity)Gold - GIAW 11 (Hard)Randomizer - GIAW 11Secret Santa 2013 ParticipantFor frequently finding and reporting spam and spam bots2012 Best RPG Maker User (Mapping)2012 Best RPG Maker User (Programming)Secret Santa 2012 ParticipantGold - GIAW 9Project of the Month winner for September 2008For taking a crack at the RMRK Wiki2011 Best RPG Maker User (Programming)2011 Best Veteran2011 Kindest Member2010 Best RPG Maker User (Story)2010 Best RPG Maker User (Technical)
First of all, if these two accounts are the same person, then one of them has to go bye-bye. Dupe accounts are against the rules here, and some of the super mods will ban people for this alone, whether innocent in nature or not. So, you might want to PM an administrator or our owner Roph about combining the two.

Secondly, might you post your mouse script too so we can see where the problem lies? I'm assuming its for VX since DarkCodeZero's thing there worked for you.




*****
my name is Timothy what's yours
Rep:
Level 79
Hello
2014 Most Missed Member2014 Zero to Hero2014 Best IRC Quote2012 Zero To HeroSecret Santa 2012 ParticipantContestant - GIAW 9For frequently finding and reporting spam and spam bots2011 Zero to Hero
Just so you know, he sent me a PM with the details behind this dupe:
hey,

its me Matt... I went to change my email, and when I did i never got the email verification, and now i cant log back inot my account!!! anything you can do to help???

Thanks

Matt(Mapper2100)
So I told him to consult the mods or admins about it. Not quite sure why he PMd me though. Just posted this so he doesn't get deleted.
it's like a metaphor or something i don't know

yeaa like Welfare Daddy Pacman said, I changed my friggin email, and I never got the email verification and now i cant log back into my friggin account... soo i had to create another one soo i could get on hered and find out what the hells going on... and can i really combine these accounts??? cause i really dont want to have too, cause I know how bad it is to double post,and I assume dupe accounts are the same way... So sorry people

*
Rep:
Level 97
2014 Best RPG Maker User - Engine2014 Most Unsung Member2013 Best RPG Maker User (Scripting)2012 Best Member2012 Best RPG Maker User (Scripting)2012 Favorite Staff Member2012 Most Mature MemberSecret Santa 2012 ParticipantProject of the Month winner for July 20092011 Best Veteran2011 Favourite Staff Member2011 Most Mature Member2011 Best RPG Maker User (Scripting)2011 Best Use of Avatar and Signature Space2010 Best RPG Maker User (Scripting)2010 Best Use Of Avatar And Signature Space
Don't worry about it; I manually activated the first account. Log in to it and post here with confirmation and then I will delete the dupe.

****
Rep:
Level 84
3...2...1...
Isn't it nice to have an admin as nice as MA?

**
Rep: +0/-0Level 71
RMRK Junior
Thanks MA it works great!!!

Now about the cyclone's keyboard input not working with my mouse script... I have the mouse scripts attached, its DerVVulf's Mouse, MA's Path Finding, and Woratana's Simple mouse system...

Thanks

Matt(Mapper2100)

***
Rep:
Level 82
We learn by living...
on this topic, is there a way to make a blinking cursor? In my text input fields, there's no way to know where your position is, and a blinking cursor could make an otherwise inactive input field look active.