Project1

标题: 求人写一下脚本vx的仿网游即时消息…… [打印本页]

作者: adswyc    时间: 2008-6-9 05:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: Beside    时间: 2008-6-9 05:15
输入文字后屏幕上显示?
作者: adswyc    时间: 2008-6-9 05:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: 火鸡三毛老大    时间: 2008-6-9 07:29
以下引用adswyc于2008-6-8 21:15:52的发言:


以下引用Beside于2008-6-8 21:15:02的发言:

输入文字后屏幕上显示?


是的

不可以联网有这个也没什么意义...
如果可以用语句判定角色输入的文字就可以实现仿·网游聊天系统了


这个....
如果能完成...
我也想要一份..
作者: got3    时间: 2008-6-9 15:50

      

   这个功能,就是夜想曲里面的吧?

    吃到东西会在屏幕上显示,还有信息啥的{/hx}

  任务提示等
作者: 火鸡三毛老大    时间: 2008-6-9 16:00
以下引用got3于2008-6-9 7:50:37的发言:


     

  这个功能,就是夜想曲里面的吧?

   吃到东西会在屏幕上显示,还有信息啥的

任务提示等

话说...
看了工程...
没有这功能
只是有个输入法!
作者: Beside    时间: 2008-6-9 16:51
大致修改完毕 还有一点坐标的问题
作者: yangff    时间: 2008-6-9 16:54
恩,工程量不大,我事一下吧
作者: yangff    时间: 2008-6-9 17:44
http://rpg.blue/upload_program/files/Project2_93433424.rar [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: Beside    时间: 2008-6-9 17:47
完成了……

脚本如下 直接覆盖掉原来输入法那个
  1. =begin

  2.   脚本:【完美输入法修正】
  3.   
  4.   功能:输入法。
  5.   
  6.   说明: 直接用Type_Field创建输入域即可进行输入,在此可根据Type_Field域对象
  7.   
  8.         的活动标记active来自定义刷新等,在Type_Field中需要自己处理特殊按键
  9.         
  10.         的处理方法。具体不明白之处请参考范例工程。

  11.   作者:灼眼的夏娜
  12.   
  13.   补充: 至于以前那个版本也许很多人都注意到那个烦人的问题了吧,按Enter和Tab那
  14.   
  15.         些会出现不爽的声音,这个版本解决了那个问题,并简化添加了Type_Field类
  16.         
  17.         来方便创建输入域。

  18. =end

  19. #==============================================================================
  20. # ■ RInput
  21. #------------------------------------------------------------------------------
  22. #  全键盘处理的模块。
  23. #==============================================================================
  24. module RInput
  25.   
  26.   #--------------------------------------------------------------------------
  27.   # ● 常量定义
  28.   #--------------------------------------------------------------------------
  29.   ENTER             = 0x0D
  30.   SPACE             = 0x20
  31.   UP                = 0x26
  32.   DOWN              = 0x28
  33.   LEFT              = 0x25
  34.   RIGHT             = 0x27
  35.   
  36.   LCTRL             = 0xA2
  37.   LALT              = 0xA4

  38.   #--------------------------------------------------------------------------
  39.   # ● 临时Hash
  40.   #--------------------------------------------------------------------------
  41.   @R_Key_Hash = {}
  42.   @R_Key_Repeat = {}
  43.   
  44.   #--------------------------------------------------------------------------
  45.   # ● 唯一API
  46.   #--------------------------------------------------------------------------
  47.   GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')

  48.   #--------------------------------------------------------------------------
  49.   # ● 单键处理
  50.   #--------------------------------------------------------------------------
  51.   def self.trigger?(rkey)
  52.     result = GetKeyState.call(rkey)
  53.     if @R_Key_Hash[rkey] == 1 and result != 0
  54.       return false
  55.     end
  56.     if result != 0
  57.       @R_Key_Hash[rkey] = 1
  58.       return true
  59.     else
  60.       @R_Key_Hash[rkey] = 0
  61.       return false
  62.     end
  63.   end

  64. end

  65. #==============================================================================
  66. # ■ EasyConv
  67. #------------------------------------------------------------------------------
  68. #  转码模块。
  69. #==============================================================================
  70. module EasyConv

  71.   #--------------------------------------------------------------------------
  72.   # ● 常量定义
  73.   #--------------------------------------------------------------------------
  74.   CP_ACP = 0
  75.   CP_UTF8 = 65001

  76.   #--------------------------------------------------------------------------
  77.   # ● 模块函数
  78.   #--------------------------------------------------------------------------
  79.   module_function
  80.   
  81.   #--------------------------------------------------------------------------
  82.   # ● 转码
  83.   #--------------------------------------------------------------------------
  84.   def s2u(text)

  85.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  86.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  87.     len = m2w.call(CP_ACP, 0, text, -1, nil, 0)
  88.     buf = "\0" * (len*2)
  89.     m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2)

  90.     len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil)
  91.     ret = "\0" * len
  92.     w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil)
  93.     ret[-1] = ""
  94.    
  95.     return ret
  96.   end

  97.   #--------------------------------------------------------------------------
  98.   # ● 转码
  99.   #--------------------------------------------------------------------------
  100.   def u2s(text)
  101.    
  102.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  103.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  104.     len = m2w.call(CP_UTF8, 0, text, -1, nil, 0)
  105.     buf = "\0" * (len*2)
  106.     m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2)

  107.     len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  108.     ret = "\0" * len
  109.     w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
  110.    
  111.     return ret
  112.   end

  113. end

  114. #==============================================================================
  115. # ■ TypeAPI
  116. #------------------------------------------------------------------------------
  117. #  输入法相关API模块。
  118. #==============================================================================
  119. module TypeAPI
  120.   
  121.   #--------------------------------------------------------------------------
  122.   # ● API定义
  123.   #--------------------------------------------------------------------------
  124.   GPPS         = Win32API.new("kernel32","GetPrivateProfileString",'pppplp','l')
  125.   FindWindow   = Win32API.new("user32", "FindWindow", 'pp', 'i')
  126.   CreateWindow = Win32API.new("NetGame","CreatWnd",'l','l')
  127.   SetHK        = Win32API.new("NetGame","SetHK",'v','v')
  128.   GetText      = Win32API.new("NetGame","GetWndText",'l','p')
  129.   SetFocus     = Win32API.new("user32","SetFocus",'l','l')
  130.   IfBack       = Win32API.new("NetGame","If_Back",'v','i')
  131.   StartType    = Win32API.new("NetGame","StartType",'v','v')
  132.   EndType      = Win32API.new("NetGame","EndType",'v','v')
  133.   GetKeyInfos  = Win32API.new("NetGame","GetKeyInfo",'v','i')
  134.   
  135.   #--------------------------------------------------------------------------
  136.   # ● 模块函数
  137.   #--------------------------------------------------------------------------
  138.   module_function
  139.   
  140.   #--------------------------------------------------------------------------
  141.   # ● 获取参数
  142.   #--------------------------------------------------------------------------
  143.   def getParam
  144.     val = "\0" * 256
  145.     GPPS.call("Game","Title","",val,256,"./Game.ini")
  146.     val.delete!("\0")
  147.     return val
  148.   end
  149.   
  150.   #--------------------------------------------------------------------------
  151.   # ● 获取窗口
  152.   #--------------------------------------------------------------------------
  153.   def findWindow
  154.     return FindWindow.call("RGSS Player",self.getParam)
  155.   end
  156.   
  157.   #--------------------------------------------------------------------------
  158.   # ● 创建窗口
  159.   #--------------------------------------------------------------------------
  160.   def createWindow(hwnd)
  161.     return CreateWindow.call(hwnd)
  162.   end
  163.   
  164.   #--------------------------------------------------------------------------
  165.   # ● 设置HK
  166.   #--------------------------------------------------------------------------
  167.   def setHK
  168.     SetHK.call
  169.   end
  170.   
  171.   #--------------------------------------------------------------------------
  172.   # ● 获取文字
  173.   #--------------------------------------------------------------------------
  174.   def getText
  175.     return EasyConv.s2u(GetText.call(@subhwnd))
  176.   end
  177.   
  178.   #--------------------------------------------------------------------------
  179.   # ● 设置焦点
  180.   #--------------------------------------------------------------------------
  181.   def setFocus
  182.     SetFocus.call(@subhwnd)
  183.   end
  184.   
  185.   #--------------------------------------------------------------------------
  186.   # ● 转换焦点
  187.   #--------------------------------------------------------------------------
  188.   def lostFocus
  189.     SetFocus.call(@hwnd)
  190.   end
  191.   
  192.   #--------------------------------------------------------------------------
  193.   # ● 退格判定
  194.   #--------------------------------------------------------------------------
  195.   def ifBack
  196.     return IfBack.call
  197.   end
  198.   
  199.   #--------------------------------------------------------------------------
  200.   # ● 开始输入
  201.   #--------------------------------------------------------------------------
  202.   def startType
  203.     StartType.call
  204.   end
  205.   
  206.   #--------------------------------------------------------------------------
  207.   # ● 结束输入
  208.   #--------------------------------------------------------------------------
  209.   def endType
  210.     EndType.call
  211.   end
  212.   
  213.   #--------------------------------------------------------------------------
  214.   # ● 输入中特殊按键处理
  215.   #--------------------------------------------------------------------------
  216.   def getKeyInfos
  217.     return GetKeyInfos.call
  218.   end
  219.   
  220.   #--------------------------------------------------------------------------
  221.   # ● 获取句柄
  222.   #--------------------------------------------------------------------------
  223.   @hwnd    = self.findWindow
  224.   
  225.   @subhwnd = self.createWindow(@hwnd)

  226.   #--------------------------------------------------------------------------
  227.   # ● 设置HK应用
  228.   #--------------------------------------------------------------------------
  229.   self.setHK
  230.   
  231. end

  232. #==============================================================================
  233. # ■ Type_Field
  234. #------------------------------------------------------------------------------
  235. #  处理输入域的类。
  236. #==============================================================================
  237. class Type_Field
  238.   
  239.   #--------------------------------------------------------------------------
  240.   # ● 定义实例变量
  241.   #--------------------------------------------------------------------------
  242.   attr(:active)
  243.   
  244.   #--------------------------------------------------------------------------
  245.   # ● 初始化
  246.   #--------------------------------------------------------------------------
  247.   def initialize(v,default_text = "",default_careth = nil,default_fonts = 16,    default_fontc = Color.new(255,255,255,255))
  248.     # active
  249.     @active = true
  250.     # 视口
  251.     rect = v.rect
  252.     @v = Viewport.new(rect.x,rect.y,rect.width,rect.height)
  253.     @beijing= Sprite.new(@v)
  254.     @beijing.bitmap = Cache.system("1081-1")#Cache.("Title")picture icon
  255.     @w = rect.width
  256.     @h = rect.height
  257.     # 属性
  258.     @caret_h = default_careth.nil? ? @h : [@h,default_careth].min
  259.     @caret_y = rect.y + (@h - @caret_h) / 2
  260.     @font_size = [default_fonts,@h].min
  261.     # 描绘contents
  262.     @cts = Sprite.new(@v)
  263.     @cts.bitmap = Bitmap.new(@w - 3,@h)
  264.     @cts.bitmap.font.size = @font_size
  265.     @cts.bitmap.font.color = default_fontc
  266.     # 辅助属性
  267.     @bk_count = 0
  268.     @text = default_text.scan(/./)
  269.     @max_width = @w - 3
  270.     @caret_pos = @text.size
  271.     @save_pos = @caret_pos
  272.     # 光标Caret
  273.     @v1 = Viewport.new(rect.x,@caret_y,@w + 3,@caret_h)
  274.     @caret_sp = Sprite.new(@v1)
  275.     @caret_bitmap = Bitmap.new(3,@caret_h)
  276.     @caret_bitmap.fill_rect(3,0,1,@caret_h,Color.new(0,0,0,180))
  277.     @caret_bitmap.fill_rect(2,0,1,@caret_h,Color.new(0,0,0))
  278.     @caret_bitmap.fill_rect(2,0,1,@caret_h,Color.new(255,255,255))
  279.     @caret_sp.bitmap = @caret_bitmap
  280.     @caret_sp.x = self.get_width(@text[0,@caret_pos].to_s)
  281.     @caret_sp.y = 0
  282.     @caret_sp.visible = false
  283.     @caret_flash_count = 0
  284.     # 刷新
  285.     refresh
  286.     # 设置焦点
  287.     TypeAPI.setFocus
  288.     # 开始输入
  289.     TypeAPI.startType
  290.   end
  291.   
  292.   #--------------------------------------------------------------------------
  293.   # ● 设置活动标记
  294.   #--------------------------------------------------------------------------
  295.   def active=(value)
  296.     if value != true and value != false
  297.       return
  298.     end
  299.     @active = value
  300.     @caret_sp.visible = @active
  301.   end
  302.   
  303.   #--------------------------------------------------------------------------
  304.   # ● 释放
  305.   #--------------------------------------------------------------------------
  306.   def dispose
  307.     @caret_bitmap.dispose
  308.     @caret_sp.bitmap.dispose
  309.     @caret_sp.dispose
  310.     @cts.bitmap.dispose
  311.     @cts.dispose
  312.     @v.dispose
  313.     @v1.dispose
  314.   end

  315.   #--------------------------------------------------------------------------
  316.   # ● 刷新
  317.   #--------------------------------------------------------------------------
  318.   def refresh
  319.     @cts.bitmap.clear
  320.     @cts.bitmap.draw_text(0,0,@w,@h,@text.to_s)
  321.   end

  322.   #--------------------------------------------------------------------------
  323.   # ● 获取文字
  324.   #--------------------------------------------------------------------------
  325.   def get_text
  326.     return @text.to_s
  327.   end

  328.   #--------------------------------------------------------------------------
  329.   # ● 取得字符宽度
  330.   #--------------------------------------------------------------------------
  331.   def get_width(str)
  332.     return @cts.bitmap.text_size(str).width
  333.   end
  334.   
  335.   #--------------------------------------------------------------------------
  336.   # ● 更新
  337.   #--------------------------------------------------------------------------
  338.   def update
  339.     # 非激活状态则返回
  340.     unless @active
  341.       return
  342.     end
  343.     # 获取按键信息
  344.     key_info = TypeAPI.getKeyInfos
  345.     case key_info
  346.     when 0x09 # Tab
  347.       # 按下 Tab 键的情况自己定义怎么处理
  348.       return
  349.     when 0x0d # Enter
  350.       text = get_text
  351.       $scene.type_window.add_instant_text(text)
  352.       @text = []
  353.       refresh
  354.       return
  355.     when 0x1B # Esc
  356.       # 按下 Esc 键的情况自己定义怎么处理
  357.       return
  358.     end
  359.     self.update_text
  360.     self.update_lrb
  361.     self.update_back
  362.     self.update_caret
  363.   end

  364.   #--------------------------------------------------------------------------
  365.   # ● 更新文字
  366.   #--------------------------------------------------------------------------
  367.   def update_text
  368.     # 文字刷新
  369.     TypeAPI.setFocus
  370.     text = TypeAPI.getText
  371.     if text != ""
  372.       for char in text.scan(/./)
  373.         if self.get_width(@text.to_s + char) <= @max_width
  374.           @text[@caret_pos,0] = char
  375.           @caret_pos += 1
  376.         else
  377.           break
  378.         end
  379.       end
  380.       refresh
  381.     end
  382.   end
  383.   
  384.   #--------------------------------------------------------------------------
  385.   # ● 更新左右按键
  386.   #--------------------------------------------------------------------------
  387.   def update_lrb
  388.     if RInput.trigger?(RInput::LEFT) and @caret_pos > 0
  389.       @caret_pos -= 1
  390.       return
  391.     end
  392.     if RInput.trigger?(RInput::RIGHT) and @caret_pos < @text.size
  393.       @caret_pos += 1
  394.       return
  395.     end
  396.   end
  397.   
  398.   #--------------------------------------------------------------------------
  399.   # ● 更新退格
  400.   #--------------------------------------------------------------------------
  401.   def update_back
  402.     # 前退格处理
  403.     @bk_count += TypeAPI.ifBack
  404.     if @bk_count > 0
  405.       @bk_count -= 1
  406.       if @caret_pos > 0
  407.         @text.delete_at(@caret_pos - 1);@caret_pos -= 1;refresh
  408.       end
  409.     end
  410.   end
  411.   
  412.   #--------------------------------------------------------------------------
  413.   # ● 更新光标闪烁
  414.   #--------------------------------------------------------------------------
  415.   def update_caret
  416.     # 闪烁计时
  417.     @caret_flash_count += 1
  418.     if @caret_flash_count == 20
  419.       @caret_sp.visible = !@caret_sp.visible
  420.       @caret_flash_count = 0
  421.     end
  422.     # Caret位置刷新
  423.     if @save_pos != @caret_pos
  424.       @save_pos = @caret_pos
  425.       @caret_sp.x = self.get_width(@text[0,@save_pos].to_s)
  426.     end
  427.   end
  428.   
  429. end
  430.   
  431. #==============================================================================
  432. # ■ Window_TypeMessage
  433. #------------------------------------------------------------------------------
  434. #==============================================================================

  435. class Window_TypeMessage < Window_Message
  436.   #--------------------------------------------------------------------------
  437.   # ● 初始化对象
  438.   #--------------------------------------------------------------------------
  439.   def initialize
  440.     super
  441.     self.openness = 255
  442.     self.opacity = 0
  443.     self.contents.font.size = 18
  444.     self.x = 20
  445.     @lines = []
  446.     refresh
  447.     self.visible = false if $game_switches[1] == true
  448.   end
  449.   #--------------------------------------------------------------------------
  450.   # ● 释放
  451.   #--------------------------------------------------------------------------
  452.   def dispose
  453.     super
  454.   end
  455.   #--------------------------------------------------------------------------
  456.   # ● 刷新画面
  457.   #--------------------------------------------------------------------------
  458.   def update
  459.     return if $game_switches[1] == true
  460.     super
  461.     refresh if Graphics.frame_count % 8 == 0
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # ● 打开窗口 (无效化)
  465.   #--------------------------------------------------------------------------
  466.   def open
  467.   end
  468.   #--------------------------------------------------------------------------
  469.   # ● 关闭窗口 (无效化)
  470.   #--------------------------------------------------------------------------
  471.   def close
  472.   end
  473.   #--------------------------------------------------------------------------
  474.   # ● 设置窗口背景与位置 (无效化)
  475.   #--------------------------------------------------------------------------
  476.   def reset_window
  477.   end
  478.   #--------------------------------------------------------------------------
  479.   # ● 清除
  480.   #--------------------------------------------------------------------------
  481.   def clear
  482.     refresh
  483.   end
  484.   #--------------------------------------------------------------------------
  485.   # ● 获取行数
  486.   #--------------------------------------------------------------------------
  487.   def line_number
  488.     return @lines.size
  489.   end
  490.   #--------------------------------------------------------------------------
  491.   # ● 返回一行
  492.   #--------------------------------------------------------------------------
  493.   def back_one
  494.     @lines.pop
  495.     refresh
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● 返回至指定行
  499.   #     line_number : 行编号
  500.   #--------------------------------------------------------------------------
  501.   def back_to(line_number)
  502.     while @lines.size > line_number
  503.       @lines.pop
  504.     end
  505.     refresh
  506.   end
  507.   #--------------------------------------------------------------------------
  508.   # ● 添加文章
  509.   #     text : 添加的文章
  510.   #--------------------------------------------------------------------------
  511.   def add_instant_text(text)
  512.     @lines.push([text, Graphics.frame_count])
  513.     @lines.delete_at(0) if @lines.size > 4
  514.     refresh
  515.   end
  516.   #--------------------------------------------------------------------------
  517.   # ● 替换文章
  518.   #     text : 要替换的文章
  519.   #    将最下行替换为别的文章。
  520.   #--------------------------------------------------------------------------
  521.   def replace_instant_text(text)
  522.     @lines.pop
  523.     @lines.push([text, Graphics.frame_count])
  524.     refresh
  525.   end
  526.   #--------------------------------------------------------------------------
  527.   # ● 获取最下行的文章
  528.   #--------------------------------------------------------------------------
  529.   def last_instant_text
  530.     return @lines[-1]
  531.   end
  532.   #--------------------------------------------------------------------------
  533.   # ● 刷新
  534.   #--------------------------------------------------------------------------
  535.   def refresh
  536.     return if $game_switches[1] == true
  537.     self.contents.clear
  538.     for i in [email protected]
  539.       draw_line(i)
  540.     end
  541.     self.y = 360 - (@lines.size ) * WLH
  542.   end
  543.   #--------------------------------------------------------------------------
  544.   # ● 描绘行
  545.   #     index : 行编号
  546.   #--------------------------------------------------------------------------
  547.   def draw_line(index)
  548.     rect = Rect.new(0, 0, 0, 0)
  549.     rect.x += 4
  550.     rect.y += index * WLH
  551.     rect.width = contents.width - 8
  552.     rect.height = WLH
  553.     self.contents.clear_rect(rect)
  554.     self.contents.font.color = normal_color
  555.     self.contents.font.color.alpha = 700 - (Graphics.frame_count - @lines[index][1]) * 4
  556.     self.contents.draw_text(rect, @lines[index][0])
  557.   end
  558. end

  559. class Scene_Map < Scene_Base
  560.   attr_accessor :type_window
  561.   def start
  562.     super
  563.     $game_map.refresh
  564.     @spriteset = Spriteset_Map.new
  565.     @message_window = Window_Message.new
  566.     @type_window = Window_TypeMessage.new
  567.   end
  568.   def terminate
  569.     super
  570.     if $scene.is_a?(Scene_Battle)     # 正在切换战斗画面的情况下
  571.       @spriteset.dispose_characters   # 为了生成背景隐藏角色
  572.     end
  573.     snapshot_for_background
  574.     @spriteset.dispose
  575.     @message_window.dispose
  576.     @type_window.dispose
  577.     if $scene.is_a?(Scene_Battle)     # 正在切换战斗画面的情况下
  578.       perform_battle_transition       # 执行战斗前变换
  579.     end
  580.   end
  581.   def update
  582.     super
  583.     $game_map.interpreter.update      # 更新解释器
  584.     $game_map.update                  # 更新滴入
  585.     $game_player.update               # 更新玩家
  586.     $game_system.update               # 更新计时器
  587.     @spriteset.update                 # 更新活动块元件
  588.     @message_window.update            # 更新消息窗口
  589.     @type_window.update
  590.     unless $game_message.visible      # 正在显示消息以外的情况
  591.       update_transfer_player
  592.       update_encounter
  593.       update_call_menu
  594.       update_call_debug
  595.       update_scene_change
  596.     end
  597.   end
  598. end


  599.   
复制代码

范例如下
http://rpg.blue/upload_program/files/Project2_93433584.rar

锻炼脚本能力……算法不当请指出

被抢先了。T_T [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: yangff    时间: 2008-6-9 17:56
以下引用Beside于2008-6-9 9:47:16的发言:

完成了……

脚本如下 直接覆盖掉原来输入法那个
锻炼脚本能力……算法不当请指出

被抢先了。T_T


[本贴由作者于 2008-6-9 9:48:50 最后编辑]

瞄~~
我们的效果差不多地说


你居然..
我直接绑定输入法T_T

显示提示信息直接$message.push([$n+$time,get_text])



  1. def mk_message
  2.   $time = 200
  3.   $message = [] #生成消息队列
  4. #  $old = []
  5.   $mewin = Sprite.new #消息视口
  6.   $mewin.bitmap = Bitmap.new(6*32,220)
  7.   $mewin.y = 387-(6*32)
  8.   $mewin.x = 30
  9.   #$mewin.bitmap.fill_rect(0, 0, 4*32, 4*32, Color.new(255,0,0))
  10.   $n = 0
  11. end
  12. def message_update
  13.   $n +=1
  14.   #if $message != $old
  15.     for i in 0...$message.size
  16.       if $message[i] != nil
  17.         if $message[i][0] <= $n
  18.           $message[i] = nil
  19.       #    p "A"
  20.         end
  21.       end
  22.     end
  23.     $mewin.bitmap.clear
  24.     n = 0
  25.     for i in 0...$message.size
  26.       if ($message[i] != nil) and (n < 5)
  27.        # p "a"
  28.       n += 1
  29.         w = $mewin.bitmap.text_size($message[i][1])
  30.         $mewin.bitmap.draw_text(16, n*32, w.width, 32, $message[i][1])
  31.       end
  32.     end
  33.     $old = $message
  34.   #end
  35. end
  36. #def message_push(message)
  37.   
  38. #end
  39. def end1
  40.   $mewin.bitmap.dispose
  41.   $mewin.dispose
  42. end

  43. =begin

  44.   脚本:【完美输入法修正】
  45.   
  46.   功能:输入法。
  47.   
  48.   说明: 直接用Type_Field创建输入域即可进行输入,在此可根据Type_Field域对象
  49.   
  50.         的活动标记active来自定义刷新等,在Type_Field中需要自己处理特殊按键
  51.         
  52.         的处理方法。具体不明白之处请参考范例工程。

  53.   作者:灼眼的夏娜
  54.   
  55.   补充: 至于以前那个版本也许很多人都注意到那个烦人的问题了吧,按Enter和Tab那
  56.   
  57.         些会出现不爽的声音,这个版本解决了那个问题,并简化添加了Type_Field类
  58.         
  59.         来方便创建输入域。

  60. =end

  61. #==============================================================================
  62. # ■ RInput
  63. #------------------------------------------------------------------------------
  64. #  全键盘处理的模块。
  65. #==============================================================================
  66. module RInput
  67.   
  68.   #--------------------------------------------------------------------------
  69.   # ● 常量定义
  70.   #--------------------------------------------------------------------------
  71.   ENTER             = 0x0D
  72.   SPACE             = 0x20
  73.   UP                = 0x26
  74.   DOWN              = 0x28
  75.   LEFT              = 0x25
  76.   RIGHT             = 0x27
  77.   
  78.   LCTRL             = 0xA2
  79.   LALT              = 0xA4

  80.   #--------------------------------------------------------------------------
  81.   # ● 临时Hash
  82.   #--------------------------------------------------------------------------
  83.   @R_Key_Hash = {}
  84.   @R_Key_Repeat = {}
  85.   
  86.   #--------------------------------------------------------------------------
  87.   # ● 唯一API
  88.   #--------------------------------------------------------------------------
  89.   GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')

  90.   #--------------------------------------------------------------------------
  91.   # ● 单键处理
  92.   #--------------------------------------------------------------------------
  93.   def self.trigger?(rkey)
  94.     result = GetKeyState.call(rkey)
  95.     if @R_Key_Hash[rkey] == 1 and result != 0
  96.       return false
  97.     end
  98.     if result != 0
  99.       @R_Key_Hash[rkey] = 1
  100.       return true
  101.     else
  102.       @R_Key_Hash[rkey] = 0
  103.       return false
  104.     end
  105.   end

  106. end

  107. #==============================================================================
  108. # ■ EasyConv
  109. #------------------------------------------------------------------------------
  110. #  转码模块。
  111. #==============================================================================
  112. module EasyConv

  113.   #--------------------------------------------------------------------------
  114.   # ● 常量定义
  115.   #--------------------------------------------------------------------------
  116.   CP_ACP = 0
  117.   CP_UTF8 = 65001

  118.   #--------------------------------------------------------------------------
  119.   # ● 模块函数
  120.   #--------------------------------------------------------------------------
  121.   module_function
  122.   
  123.   #--------------------------------------------------------------------------
  124.   # ● 转码
  125.   #--------------------------------------------------------------------------
  126.   def s2u(text)

  127.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  128.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  129.     len = m2w.call(CP_ACP, 0, text, -1, nil, 0)
  130.     buf = "\0" * (len*2)
  131.     m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2)

  132.     len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil)
  133.     ret = "\0" * len
  134.     w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil)
  135.     ret[-1] = ""
  136.    
  137.     return ret
  138.   end

  139.   #--------------------------------------------------------------------------
  140.   # ● 转码
  141.   #--------------------------------------------------------------------------
  142.   def u2s(text)
  143.    
  144.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  145.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  146.     len = m2w.call(CP_UTF8, 0, text, -1, nil, 0)
  147.     buf = "\0" * (len*2)
  148.     m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2)

  149.     len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  150.     ret = "\0" * len
  151.     w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
  152.    
  153.     return ret
  154.   end

  155. end

  156. #==============================================================================
  157. # ■ TypeAPI
  158. #------------------------------------------------------------------------------
  159. #  输入法相关API模块。
  160. #==============================================================================
  161. module TypeAPI
  162.   
  163.   #--------------------------------------------------------------------------
  164.   # ● API定义
  165.   #--------------------------------------------------------------------------
  166.   GPPS         = Win32API.new("kernel32","GetPrivateProfileString",'pppplp','l')
  167.   FindWindow   = Win32API.new("user32", "FindWindow", 'pp', 'i')
  168.   CreateWindow = Win32API.new("NetGame","CreatWnd",'l','l')
  169.   SetHK        = Win32API.new("NetGame","SetHK",'v','v')
  170.   GetText      = Win32API.new("NetGame","GetWndText",'l','p')
  171.   SetFocus     = Win32API.new("user32","SetFocus",'l','l')
  172.   IfBack       = Win32API.new("NetGame","If_Back",'v','i')
  173.   StartType    = Win32API.new("NetGame","StartType",'v','v')
  174.   EndType      = Win32API.new("NetGame","EndType",'v','v')
  175.   GetKeyInfos  = Win32API.new("NetGame","GetKeyInfo",'v','i')
  176.   
  177.   #--------------------------------------------------------------------------
  178.   # ● 模块函数
  179.   #--------------------------------------------------------------------------
  180.   module_function
  181.   
  182.   #--------------------------------------------------------------------------
  183.   # ● 获取参数
  184.   #--------------------------------------------------------------------------
  185.   def getParam
  186.     val = "\0" * 256
  187.     GPPS.call("Game","Title","",val,256,"./Game.ini")
  188.     val.delete!("\0")
  189.     return val
  190.   end
  191.   
  192.   #--------------------------------------------------------------------------
  193.   # ● 获取窗口
  194.   #--------------------------------------------------------------------------
  195.   def findWindow
  196.     return FindWindow.call("RGSS Player",self.getParam)
  197.   end
  198.   
  199.   #--------------------------------------------------------------------------
  200.   # ● 创建窗口
  201.   #--------------------------------------------------------------------------
  202.   def createWindow(hwnd)
  203.     return CreateWindow.call(hwnd)
  204.   end
  205.   
  206.   #--------------------------------------------------------------------------
  207.   # ● 设置HK
  208.   #--------------------------------------------------------------------------
  209.   def setHK
  210.     SetHK.call
  211.   end
  212.   
  213.   #--------------------------------------------------------------------------
  214.   # ● 获取文字
  215.   #--------------------------------------------------------------------------
  216.   def getText
  217.     return EasyConv.s2u(GetText.call(@subhwnd))
  218.   end
  219.   
  220.   #--------------------------------------------------------------------------
  221.   # ● 设置焦点
  222.   #--------------------------------------------------------------------------
  223.   def setFocus
  224.     SetFocus.call(@subhwnd)
  225.   end
  226.   
  227.   #--------------------------------------------------------------------------
  228.   # ● 转换焦点
  229.   #--------------------------------------------------------------------------
  230.   def lostFocus
  231.     SetFocus.call(@hwnd)
  232.   end
  233.   
  234.   #--------------------------------------------------------------------------
  235.   # ● 退格判定
  236.   #--------------------------------------------------------------------------
  237.   def ifBack
  238.     return IfBack.call
  239.   end
  240.   
  241.   #--------------------------------------------------------------------------
  242.   # ● 开始输入
  243.   #--------------------------------------------------------------------------
  244.   def startType
  245.     StartType.call
  246.   end
  247.   
  248.   #--------------------------------------------------------------------------
  249.   # ● 结束输入
  250.   #--------------------------------------------------------------------------
  251.   def endType
  252.     EndType.call
  253.   end
  254.   
  255.   #--------------------------------------------------------------------------
  256.   # ● 输入中特殊按键处理
  257.   #--------------------------------------------------------------------------
  258.   def getKeyInfos
  259.     return GetKeyInfos.call
  260.   end
  261.   
  262.   #--------------------------------------------------------------------------
  263.   # ● 获取句柄
  264.   #--------------------------------------------------------------------------
  265.   @hwnd    = self.findWindow
  266.   
  267.   @subhwnd = self.createWindow(@hwnd)

  268.   #--------------------------------------------------------------------------
  269.   # ● 设置HK应用
  270.   #--------------------------------------------------------------------------
  271.   self.setHK
  272.   
  273. end

  274. #==============================================================================
  275. # ■ Type_Field
  276. #------------------------------------------------------------------------------
  277. #  处理输入域的类。
  278. #==============================================================================
  279. class Type_Field
  280.   
  281.   #--------------------------------------------------------------------------
  282.   # ● 定义实例变量
  283.   #--------------------------------------------------------------------------
  284.   attr(:active)
  285.   
  286.   #--------------------------------------------------------------------------
  287.   # ● 初始化
  288.   #--------------------------------------------------------------------------
  289.   def initialize(v,default_text = "",default_careth = nil,default_fonts = 16,    default_fontc = Color.new(255,255,255,255))
  290.     mk_message
  291.     # active
  292.     @active = true
  293.     # 视口
  294.     rect = v.rect
  295.     @v = Viewport.new(rect.x,rect.y,rect.width,rect.height)
  296.     @beijing= Sprite.new(@v)
  297.     @beijing.bitmap = Cache.system("1081-1")#Cache.("Title")picture icon
  298.     @w = rect.width
  299.     @h = rect.height
  300.     # 属性
  301.     @caret_h = default_careth.nil? ? @h : [@h,default_careth].min
  302.     @caret_y = rect.y + (@h - @caret_h) / 2
  303.     @font_size = [default_fonts,@h].min
  304.     # 描绘contents
  305.     @cts = Sprite.new(@v)
  306.     @cts.bitmap = Bitmap.new(@w - 3,@h)
  307.     @cts.bitmap.font.size = @font_size
  308.     @cts.bitmap.font.color = default_fontc
  309.     # 辅助属性
  310.     @bk_count = 0
  311.     @text = default_text.scan(/./)
  312.     @max_width = @w - 3
  313.     @caret_pos = @text.size
  314.     @save_pos = @caret_pos
  315.     # 光标Caret
  316.     @v1 = Viewport.new(rect.x,@caret_y,@w + 3,@caret_h)
  317.     @caret_sp = Sprite.new(@v1)
  318.     @caret_bitmap = Bitmap.new(3,@caret_h)
  319.     @caret_bitmap.fill_rect(3,0,1,@caret_h,Color.new(0,0,0,180))
  320.     @caret_bitmap.fill_rect(2,0,1,@caret_h,Color.new(0,0,0))
  321.     @caret_bitmap.fill_rect(2,0,1,@caret_h,Color.new(255,255,255))
  322.     @caret_sp.bitmap = @caret_bitmap
  323.     @caret_sp.x = self.get_width(@text[0,@caret_pos].to_s)
  324.     @caret_sp.y = 0
  325.     @caret_sp.visible = false
  326.     @caret_flash_count = 0
  327.     # 刷新
  328.     refresh
  329.     # 设置焦点
  330.     TypeAPI.setFocus
  331.     # 开始输入
  332.     TypeAPI.startType
  333.   end
  334.   
  335.   #--------------------------------------------------------------------------
  336.   # ● 设置活动标记
  337.   #--------------------------------------------------------------------------
  338.   def active=(value)
  339.     if value != true and value != false
  340.       return
  341.     end
  342.     @active = value
  343.     @caret_sp.visible = @active
  344.   end
  345.   
  346.   #--------------------------------------------------------------------------
  347.   # ● 释放
  348.   #--------------------------------------------------------------------------
  349.   def dispose
  350.     @caret_bitmap.dispose
  351.     @caret_sp.bitmap.dispose
  352.     @caret_sp.dispose
  353.     @cts.bitmap.dispose
  354.     @cts.dispose
  355.     @v.dispose
  356.     @v1.dispose
  357.     end1
  358.   end

  359.   #--------------------------------------------------------------------------
  360.   # ● 刷新
  361.   #--------------------------------------------------------------------------
  362.   def refresh
  363.     @cts.bitmap.clear
  364.     @cts.bitmap.draw_text(0,0,@w,@h,@text.to_s)
  365.   end

  366.   #--------------------------------------------------------------------------
  367.   # ● 获取文字
  368.   #--------------------------------------------------------------------------
  369.   def get_text
  370.     return @text.to_s
  371.   end

  372.   #--------------------------------------------------------------------------
  373.   # ● 取得字符宽度
  374.   #--------------------------------------------------------------------------
  375.   def get_width(str)
  376.     return @cts.bitmap.text_size(str).width
  377.   end
  378.   
  379.   #--------------------------------------------------------------------------
  380.   # ● 更新
  381.   #--------------------------------------------------------------------------
  382.   def update
  383.     # 非激活状态则返回
  384.     unless @active
  385.       return
  386.     end
  387.     message_update
  388.     # 获取按键信息
  389.     key_info = TypeAPI.getKeyInfos
  390.     case key_info
  391.     when 0x09 # Tab
  392.       # 按下 Tab 键的情况自己定义怎么处理
  393.       return
  394.     when 0x0d # Enter
  395.       # 按下 Enter 键的情况自己定义怎么处理
  396.       #message_push(get_text) if get_text != nil
  397.       $message.push([$n+$time,get_text])
  398.    #   @text = [] if get_text != nil
  399.       return
  400.     when 0x1B # Esc
  401.       # 按下 Esc 键的情况自己定义怎么处理
  402.       return
  403.     end
  404.     self.update_text
  405.     self.update_lrb
  406.     self.update_back
  407.     self.update_caret
  408.   end

  409.   #--------------------------------------------------------------------------
  410.   # ● 更新文字
  411.   #--------------------------------------------------------------------------
  412.   def update_text
  413.     # 文字刷新
  414.     TypeAPI.setFocus
  415.     text = TypeAPI.getText
  416.     if text != ""
  417.       for char in text.scan(/./)
  418.         if self.get_width(@text.to_s + char) <= @max_width
  419.           @text[@caret_pos,0] = char
  420.           @caret_pos += 1
  421.         else
  422.           break
  423.         end
  424.       end
  425.       refresh
  426.     end
  427.   end
  428.   
  429.   #--------------------------------------------------------------------------
  430.   # ● 更新左右按键
  431.   #--------------------------------------------------------------------------
  432.   def update_lrb
  433.     if RInput.trigger?(RInput::LEFT) and @caret_pos > 0
  434.       @caret_pos -= 1
  435.       return
  436.     end
  437.     if RInput.trigger?(RInput::RIGHT) and @caret_pos < @text.size
  438.       @caret_pos += 1
  439.       return
  440.     end
  441.   end
  442.   
  443.   #--------------------------------------------------------------------------
  444.   # ● 更新退格
  445.   #--------------------------------------------------------------------------
  446.   def update_back
  447.     # 前退格处理
  448.     @bk_count += TypeAPI.ifBack
  449.     if @bk_count > 0
  450.       @bk_count -= 1
  451.       if @caret_pos > 0
  452.         @text.delete_at(@caret_pos - 1);@caret_pos -= 1;refresh
  453.       end
  454.     end
  455.   end
  456.   
  457.   #--------------------------------------------------------------------------
  458.   # ● 更新光标闪烁
  459.   #--------------------------------------------------------------------------
  460.   def update_caret
  461.     # 闪烁计时
  462.     @caret_flash_count += 1
  463.     if @caret_flash_count == 20
  464.       @caret_sp.visible = !@caret_sp.visible
  465.       @caret_flash_count = 0
  466.     end
  467.     # Caret位置刷新
  468.     if @save_pos != @caret_pos
  469.       @save_pos = @caret_pos
  470.       @caret_sp.x = self.get_width(@text[0,@save_pos].to_s)
  471.     end
  472.   end
  473.   
  474. end
  475.   
  476.   
复制代码

作者: Beside    时间: 2008-6-9 18:05
您这个比我的强大多了{/hx}
作者: yangff    时间: 2008-6-9 18:14
以下引用Beside于2008-6-9 10:05:55的发言:

您这个比我的强大多了

还是您的比较强大 {/hx}
作者: 水仙晶女    时间: 2008-6-9 19:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangff    时间: 2008-6-9 19:59
发Beside的吧,我的很勉强
哪年被GC吃了都不懂




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1