Project1
标题:
如何把完美输入法改造成密码系统
[打印本页]
作者:
大虫
时间:
2010-12-4 22:05
标题:
如何把完美输入法改造成密码系统
脚本如下
=begin
脚本:【完美输入法修正】
功能:输入法。
说明: 直接用Type_Field创建输入域即可进行输入,在此可根据Type_Field域对象
的活动标记active来自定义刷新等,在Type_Field中需要自己处理特殊按键
的处理方法。具体不明白之处请参考范例工程。
作者:灼眼的夏娜
补充: 至于以前那个版本也许很多人都注意到那个烦人的问题了吧,按Enter和Tab那
些会出现不爽的声音,这个版本解决了那个问题,并简化添加了Type_Field类
来方便创建输入域。
=end
#==============================================================================
# ■ RInput
#------------------------------------------------------------------------------
# 全键盘处理的模块。
#==============================================================================
module RInput
#--------------------------------------------------------------------------
# ● 常量定义
#--------------------------------------------------------------------------
ENTER = 0x0D
SPACE = 0x20
UP = 0x26
DOWN = 0x28
LEFT = 0x25
RIGHT = 0x27
LCTRL = 0xA2
LALT = 0xA4
#--------------------------------------------------------------------------
# ● 临时Hash
#--------------------------------------------------------------------------
@R_Key_Hash = {}
@R_Key_Repeat = {}
#--------------------------------------------------------------------------
# ● 唯一API
#--------------------------------------------------------------------------
GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')
#--------------------------------------------------------------------------
# ● 单键处理
#--------------------------------------------------------------------------
def self.trigger?(rkey)
result = GetKeyState.call(rkey)
if @R_Key_Hash[rkey] == 1 and result != 0
return false
end
if result != 0
@R_Key_Hash[rkey] = 1
return true
else
@R_Key_Hash[rkey] = 0
return false
end
end
end
#==============================================================================
# ■ EasyConv
#------------------------------------------------------------------------------
# 转码模块。
#==============================================================================
module EasyConv
#--------------------------------------------------------------------------
# ● 常量定义
#--------------------------------------------------------------------------
CP_ACP = 0
CP_UTF8 = 65001
#--------------------------------------------------------------------------
# ● 模块函数
#--------------------------------------------------------------------------
module_function
#--------------------------------------------------------------------------
# ● 转码
#--------------------------------------------------------------------------
def s2u(text)
m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
len = m2w.call(CP_ACP, 0, text, -1, nil, 0)
buf = "\0" * (len*2)
m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2)
len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil)
ret = "\0" * len
w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil)
ret[-1] = ""
return ret
end
#--------------------------------------------------------------------------
# ● 转码
#--------------------------------------------------------------------------
def u2s(text)
m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
len = m2w.call(CP_UTF8, 0, text, -1, nil, 0)
buf = "\0" * (len*2)
m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2)
len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
ret = "\0" * len
w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
return ret
end
end
#==============================================================================
# ■ TypeAPI
#------------------------------------------------------------------------------
# 输入法相关API模块。
#==============================================================================
module TypeAPI
#--------------------------------------------------------------------------
# ● API定义
#--------------------------------------------------------------------------
GPPS = Win32API.new("kernel32","GetPrivateProfileString",'pppplp','l')
FindWindow = Win32API.new("user32", "FindWindow", 'pp', 'i')
CreateWindow = Win32API.new("NetGame","CreatWnd",'l','l')
SetHK = Win32API.new("NetGame","SetHK",'v','v')
GetText = Win32API.new("NetGame","GetWndText",'l','p')
SetFocus = Win32API.new("user32","SetFocus",'l','l')
IfBack = Win32API.new("NetGame","If_Back",'v','i')
StartType = Win32API.new("NetGame","StartType",'v','v')
EndType = Win32API.new("NetGame","EndType",'v','v')
GetKeyInfos = Win32API.new("NetGame","GetKeyInfo",'v','i')
#--------------------------------------------------------------------------
# ● 模块函数
#--------------------------------------------------------------------------
module_function
#--------------------------------------------------------------------------
# ● 获取参数
#--------------------------------------------------------------------------
def getParam
val = "\0" * 256
GPPS.call("Game","Title","",val,256,"./Game.ini")
val.delete!("\0")
return val
end
#--------------------------------------------------------------------------
# ● 获取窗口
#--------------------------------------------------------------------------
def findWindow
return FindWindow.call("RGSS Player",self.getParam)
end
#--------------------------------------------------------------------------
# ● 创建窗口
#--------------------------------------------------------------------------
def createWindow(hwnd)
return CreateWindow.call(hwnd)
end
#--------------------------------------------------------------------------
# ● 设置HK
#--------------------------------------------------------------------------
def setHK
SetHK.call
end
#--------------------------------------------------------------------------
# ● 获取文字
#--------------------------------------------------------------------------
def getText
return EasyConv.s2u(GetText.call(@subhwnd))
end
#--------------------------------------------------------------------------
# ● 设置焦点
#--------------------------------------------------------------------------
def setFocus
SetFocus.call(@subhwnd)
end
#--------------------------------------------------------------------------
# ● 转换焦点
#--------------------------------------------------------------------------
def lostFocus
SetFocus.call(@hwnd)
end
#--------------------------------------------------------------------------
# ● 退格判定
#--------------------------------------------------------------------------
def ifBack
return IfBack.call
end
#--------------------------------------------------------------------------
# ● 开始输入
#--------------------------------------------------------------------------
def startType
StartType.call
end
#--------------------------------------------------------------------------
# ● 结束输入
#--------------------------------------------------------------------------
def endType
EndType.call
end
#--------------------------------------------------------------------------
# ● 输入中特殊按键处理
#--------------------------------------------------------------------------
def getKeyInfos
return GetKeyInfos.call
end
#--------------------------------------------------------------------------
# ● 获取句柄
#--------------------------------------------------------------------------
@hwnd = self.findWindow
@subhwnd = self.createWindow(@hwnd)
#--------------------------------------------------------------------------
# ● 设置HK应用
#--------------------------------------------------------------------------
self.setHK
end
#==============================================================================
# ■ Type_Field
#------------------------------------------------------------------------------
# 处理输入域的类。
#==============================================================================
class Type_Field
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr(:active)
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
def initialize(v,default_text = "",default_careth = nil,default_fonts = 16,\
default_fontc = Color.new(255,255,255),size = 8)
# active
@active = true
# 视口
rect = v.rect
@v = Viewport.new(rect.x,rect.y,rect.width,rect.height)
@v.z = 10000
@w = rect.width
@h = rect.height
# 属性
@caret_h = default_careth.nil? ? @h : [@h,default_careth].min
@caret_y = rect.y + (@h - @caret_h) / 2
@font_size = [default_fonts,@h].min
# 描绘contents
@cts = Sprite.new(@v)
@cts.bitmap = Bitmap.new(@w - 3,@h)
@cts.bitmap.font.size = @font_size
@cts.bitmap.font.color = default_fontc
# 辅助属性
@bk_count = 0
@text = default_text.scan(/./)
@max_size = size
@caret_pos = @text.size
@save_pos = @caret_pos
# 光标Caret
@v1 = Viewport.new(rect.x,@caret_y,@w + 3,@caret_h)
@v1.z = 99999
@caret_sp = Sprite.new(@v1)
@caret_bitmap = Bitmap.new(3,@caret_h)
@caret_bitmap.fill_rect(0,0,1,@caret_h,Color.new(0,0,0,255))
@caret_bitmap.fill_rect(1,0,1,@caret_h,Color.new(0,0,0))
@caret_bitmap.fill_rect(2,0,1,@caret_h,Color.new(120,120,120))
@caret_sp.bitmap = @caret_bitmap
@caret_sp.x = self.get_width(@text[0,@caret_pos].to_s) + 87
@caret_sp.y = 0
@caret_sp.visible = false
@caret_flash_count = 0
# 刷新
refresh
# 设置焦点
TypeAPI.setFocus
# 开始输入
TypeAPI.startType
end
#--------------------------------------------------------------------------
# ● 设置活动标记
#--------------------------------------------------------------------------
def active=(value)
if value != true and value != false
return
end
@active = value
@caret_sp.visible = @active
end
#--------------------------------------------------------------------------
# ● 释放
#--------------------------------------------------------------------------
def dispose
@caret_bitmap.dispose
@caret_sp.bitmap.dispose
@caret_sp.dispose
@cts.bitmap.dispose
@cts.dispose
@v.dispose
@v1.dispose
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
@cts.bitmap.clear
@cts.bitmap.draw_text(85,0,@w,@h,@text.to_s)
end
#--------------------------------------------------------------------------
# ● 获取文字
#--------------------------------------------------------------------------
def get_text
return @text.to_s
end
#--------------------------------------------------------------------------
# ● 取得字符宽度
#--------------------------------------------------------------------------
def get_width(str)
return @cts.bitmap.text_size(str).width
end
#--------------------------------------------------------------------------
# ● 更新
#--------------------------------------------------------------------------
def update
@caret_sp.visible = @active
# 非激活状态则返回
unless @active
return
end
# 获取按键信息
key_info = TypeAPI.getKeyInfos
case key_info
when 0x09 # Tab
# 按下 Tab 键的情况自己定义怎么处理
return
when 0x0d # Enter
# 按下 Enter 键的情况自己定义怎么处理
return
when 0x1B # Esc
# 按下 Esc 键的情况自己定义怎么处理
return
end
self.update_text
self.update_lrb
self.update_back
self.update_caret
end
#--------------------------------------------------------------------------
# ● 更新文字
#--------------------------------------------------------------------------
def update_text
# 文字刷新
TypeAPI.setFocus
text = TypeAPI.getText
if text != ""
for char in text.scan(/./)
if self.get_text.size <= @max_size
@text[@caret_pos,0] = char
@caret_pos += 1
else
break
end
end
refresh
end
end
#--------------------------------------------------------------------------
# ● 更新左右按键
#--------------------------------------------------------------------------
def update_lrb
if RInput.trigger?(RInput::LEFT) and @caret_pos > 0
@caret_pos -= 1
return
end
if RInput.trigger?(RInput::RIGHT) and @caret_pos < @text.size
@caret_pos += 1
return
end
end
#--------------------------------------------------------------------------
# ● 更新退格
#--------------------------------------------------------------------------
def update_back
# 前退格处理
@bk_count += TypeAPI.ifBack
if @bk_count > 0
@bk_count -= 1
if @caret_pos > 0
@text.delete_at(@caret_pos - 1);@caret_pos -= 1;refresh
end
end
end
#--------------------------------------------------------------------------
# ● 更新光标闪烁
#--------------------------------------------------------------------------
def update_caret
# 闪烁计时
@caret_flash_count += 1
if @caret_flash_count == 20
@caret_sp.visible = !@caret_sp.visible
@caret_flash_count = 0
end
# Caret位置刷新
if @save_pos != @caret_pos
@save_pos = @caret_pos
@caret_sp.x = self.get_width(@text[0,@save_pos].to_s) + 87
end
end
end
复制代码
我本来是想用密码系统整人的,没想到不会用
我想把输入域弄成
请输入密码:
——————————————————(输入域)
下面一个独立的方格“确定”
作者:
静静乄哭泣
时间:
2010-12-4 22:20
看不懂是用来干吗的~是用来登录个人账户的?
作者:
大虫
时间:
2010-12-5 12:44
大概是这样的
捕获.JPG
(23.52 KB, 下载次数: 14)
下载附件
保存到相册
2010-12-5 12:44 上传
作者:
立华·奏
时间:
2010-12-5 12:48
@cts.bitmap.draw_text(85,0,@w,@h,@text.to_s)
改成
@cts.bitmap.draw_text(85,0,@w,@h,"*"*@text.size)
作者:
大虫
时间:
2010-12-5 13:47
回复
立华·奏
的帖子
能解释为什么这么改吗?
作者:
EngShun
时间:
2010-12-5 13:56
本帖最后由 EngShun 于 2010-12-5 13:57 编辑
我的游戏用的,给你做参考,
但千万别整个复制进去,只能参考罢了。
#==============================================================================
# ■ Scene_Cheat
#------------------------------------------------------------------------------
# 处理名称输入画面的类。
#==============================================================================
class Scene_Cheat
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def main
# 生成窗口
@spriteset = Spriteset_Map.new
@window = Window_Base.new(30,100,580,200)
@window.contents = Bitmap.new(400,160)
@window.contents.font.size = 22
@window.contents.draw_text(20, 20, 200, 38, "请输入命令:")
@window.cursor_rect.set(120, 65, 320, 30)
@window.back_opacity = 170
@v = Viewport.new(110,185,370,20)
@v.color.set(0,0,0,0)
@tf = Type_Field.new(@v,"",nil,20,Color.new(255,255,255),16*3-2)
# 执行过渡
Graphics.transition
# 主循环
loop do
# 刷新游戏画面
Graphics.update
# 刷新输入信息
Input.update
# 刷新信息
update
# 如果画面切换就中断循环
if $scene != self
break
end
end
# 准备过渡
Graphics.freeze
# 释放窗口
@spriteset.dispose
@tf.dispose
@window.dispose
@v.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
# 刷新窗口
@window.update
@window.cursor_rect.set(120, 65, 320, 30)
@tf.update
if RInput.trigger?(RInput::ENTER)
text = @tf.get_text
$game_system.se_play($data_system.decision_se)
check_text
end
if RInput.trigger?(RInput::ESC)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 切换的地图画面
$scene = Scene_Map.new
return
end
end
#--------------------------------------------------------------------------
# ● 输入完毕
#--------------------------------------------------------------------------
def check_text
if @tf.get_text == "call_Scene_Menu"
$scene = Scene_Menu.new
return
end
if @tf.get_text == "call_Scene_Save"
$game_temp.save_calling = true
return
end
if @tf.get_text == "administrator:items"
(1...$data_items.size).each{|i|$game_party.gain_item(i,99)}
Mess_Text.write("得到所有物品99个。")
end
if @tf.get_text == "administrator:weapons"
(1...$data_weapons.size).each{|i|$game_party.gain_weapon(i,99)}
Mess_Text.write("得到所有武器99个。")
end
if @tf.get_text == "administrator:armors"
(1...$data_armors.size).each{|i|$game_party.gain_armor(i,99)}
Mess_Text.write("得到所有防具99个。")
end
for i in 1..9999
if @tf.get_text == "i_want_G #{i}"
$game_party.gain_gold(i)
Mess_Text.write("得到#{i}G币。")
end
if @tf.get_text == "i_want_Z #{i}"
$game_party.gain_gold2(i)
Mess_Text.write("得到#{i}Z币。")
end
end
for i in 1...$data_items.size
for n in 1..99
if @tf.get_text == "i_want_item(#{i},#{n})"
$game_party.gain_item(i, n)
Mess_Text.write("得到#{n}个#{$data_items[i].name}。")
end
end
end
for i in 1...$data_weapons.size
for n in 1..99
if @tf.get_text == "i_want_weapon(#{i},#{n})"
$game_party.gain_weapon(i, n)
Mess_Text.write("得到#{n}个#{$data_weapons[i].name}。")
end
end
end
for i in 1...$data_armors.size
for n in 1..99
if @tf.get_text == "i_want_armor(#{i},#{n})"
$game_party.gain_armor(i, n)
Mess_Text.write("得到#{n}个#{$data_armors[i].name}。")
end
end
end
if @tf.get_text == "look_likes_ghost"
$game_temp.common_event_id = 16
Mess_Text.write("您的角色看起来像一只鬼。")
end
if @tf.get_text == "look_likes_human"
$game_temp.common_event_id = 17
Mess_Text.write("您的角色看起来像普通人。")
end
if @tf.get_text == "look_likes_zombie"
$game_temp.common_event_id = 18
Mess_Text.write("您的角色看起来像一个僵尸。")
end
if @tf.get_text == "got_on_plane"
$game_temp.common_event_id = 19
Mess_Text.write("您的角色搭上飞艇。")
end
if @tf.get_text == "change_skin"
$game_temp.common_event_id = 12
Mess_Text.write("您的角色成功变装。")
end
if @tf.get_text == "it is a good day to die"
@inter = Interpreter.new
@inter.iterate_actor(0) do |actor|
actor.recover_all
end
Mess_Text.write("所有人都完全恢复了。")
end
if @tf.get_text == "cheat_allow = false"
$game_actors[10].name = ""
Mess_Text.write("作弊系统已关闭。")
end
if @tf.get_text == "text_clear"
Mess_Text.clear
end
if @tf.get_text == "cheat_forever_lock"
$cheat = false
Mess_Text.write("作弊系统已永远关闭。")
end
$scene = Scene_Map.new
return
end
end
复制代码
作者:
大虫
时间:
2010-12-5 14:10
回复
EngShun
的帖子
我是脚本盲,看不懂额
作者:
K.B.DRIVER
时间:
2010-12-5 15:08
到底能不能用?
作者:
fux2
时间:
2010-12-5 15:24
getText不就可以获得文字了么?
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1