设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2235|回复: 2
打印 上一主题 下一主题

[已经解决] 关于姓名输入的问题

[复制链接]

Lv4.逐梦者

梦石
4
星屑
2013
在线时间
442 小时
注册时间
2015-7-19
帖子
149
跳转到指定楼层
1
发表于 2015-8-7 14:19:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
求个va的角色姓名输入处理的脚本,就是键盘输入或者增加va中的输入选项。

Lv2.观梦者

梦石
0
星屑
457
在线时间
1409 小时
注册时间
2010-9-23
帖子
557
2
发表于 2015-8-7 14:31:32 | 只看该作者
像这样的?

  1. #******************************************************************************
  2. #
  3. #    * <拡張> 名前入力の処理
  4. #
  5. #  --------------------------------------------------------------------------
  6. #    バージョン : 1.1.4
  7. #    対      応 : RPGツクールVX Ace : RGSS3
  8. #    制  作  者 : CACAO
  9. #    配  布  元 : http://cacaosoft.webcrow.jp/
  10. #  --------------------------------------------------------------------------
  11. #   == 概    要 ==
  12. #
  13. #   : 漢字や独自の定義を使用する機能を追加します。
  14. #   : ランダムネーム機能を追加します。
  15. #
  16. #  --------------------------------------------------------------------------
  17. #   == 使用方法 ==
  18. #
  19. #    ★ アクターの名前変更
  20. #     イベントコマンド「名前入力の処理」を実行してください。
  21. #
  22. #    ★ 表示グラフィックの変更
  23. #     $game_temp.name_mode = 0     # 画像なし
  24. #     $game_temp.name_mode = 1     # 顔グラのみ
  25. #     $game_temp.name_mode = 2     # 歩行グラのみ
  26. #     $game_temp.name_mode = 3     # 顔グラと歩行グラ
  27. #
  28. #
  29. #******************************************************************************


  30. #==============================================================================
  31. # ◆ 設定項目
  32. #==============================================================================
  33. module CAO
  34. module NameInput
  35.   #--------------------------------------------------------------------------
  36.   # ◇ グラフィック表示の初期設定
  37.   #--------------------------------------------------------------------------
  38.   DEFAULT_MODE = 1
  39.   #--------------------------------------------------------------------------
  40.   # ◇ 入力文字が空の場合の初期設定
  41.   #--------------------------------------------------------------------------
  42.   DEFAULT_EMPTY = 0
  43.   
  44.   #--------------------------------------------------------------------------
  45.   # ◇ メニューの設定
  46.   #--------------------------------------------------------------------------
  47.   COMMANDS = []
  48.   COMMANDS[0] = ["ひらがな", 0]
  49.   COMMANDS[1] = ["カタカナ", 1]
  50.   COMMANDS[2] = ["A B C", 2]
  51.   COMMANDS[3] = ["漢  字", 3]
  52.   COMMANDS[4] = ["", nil]
  53.   COMMANDS[5] = ["元に戻す", :default]
  54.   COMMANDS[6] = ["おまかせ", :random]
  55.   COMMANDS[7] = ["", nil]
  56.   COMMANDS[8] = ["決  定", :ok]
  57.   #--------------------------------------------------------------------------
  58.   # ◇ 文字セットの決定時に移動
  59.   #--------------------------------------------------------------------------
  60.   AUTO_SWITCH = true
  61.   #--------------------------------------------------------------------------
  62.   # ◇ 漢字入力後に頭文字選択へ戻る
  63.   #--------------------------------------------------------------------------
  64.   AUTO_RETURN = true
  65.   #--------------------------------------------------------------------------
  66.   # ◇ メニューを左側に表示する
  67.   #--------------------------------------------------------------------------
  68.   LEFT_MENU = true
  69.   #--------------------------------------------------------------------------
  70.   # ◇ 独立したメニューを使用する
  71.   #--------------------------------------------------------------------------
  72.   SEPARATE_MENU = false
  73.   #--------------------------------------------------------------------------
  74.   # ◇ ウィンドウを切り離す
  75.   #--------------------------------------------------------------------------
  76.   SEPARATE_WINDOW = false
  77.   
  78.   #--------------------------------------------------------------------------
  79.   # ◇ ショートカットキーの設定
  80.   #--------------------------------------------------------------------------
  81.   PROCESS_BUTTON = {}
  82.   PROCESS_BUTTON[:A] = :jump
  83.   PROCESS_BUTTON[:X] = :back
  84.   PROCESS_BUTTON[:Y] = :default
  85.   PROCESS_BUTTON[:Z] = :random
  86.   PROCESS_BUTTON[:L] = nil
  87.   PROCESS_BUTTON[:R] = nil
  88.   #--------------------------------------------------------------------------
  89.   # ◇ キャンセルボタンの設定
  90.   #--------------------------------------------------------------------------
  91.   COMMAND_BUTTON_B = :cancel      # メニューでの動作
  92.   INPUT_BUTTON_B   = :now         # 文字選択での動作
  93.   
  94.   #--------------------------------------------------------------------------
  95.   # ◇ 基本文字セットの設定
  96.   #--------------------------------------------------------------------------
  97.   USE_HIRAGANA     = true         # ひらがな
  98.   USE_KATAKANA     = true         # カタカナ
  99.   USE_ALPHANUMERIC = true         # 英数字
  100.   #--------------------------------------------------------------------------
  101.   # ◇ 漢字入力時のひらがなをシステムカラーにする
  102.   #--------------------------------------------------------------------------
  103.   CHANGE_KANA_COLOR = true
  104.   
  105.   #--------------------------------------------------------------------------
  106.   # ◇ 背景画像
  107.   #--------------------------------------------------------------------------
  108.   #   背景画像は、544x416 で "Graphics/System" フォルダに保存してください。
  109.   #     ""  .. ファイル名を文字列で記述してください。
  110.   #     nil .. 画像を使用しない。
  111.   #--------------------------------------------------------------------------
  112.   # 前景画像(最前面に表示されます。)
  113.   FILE_FOREGROUND_NAME = nil
  114.   # 背景画像(デフォルトのマップ画像と入れ替えます。)
  115.   FILE_BACKGROUND_NAME = nil
  116.   # ウィンドウ背景画像(デフォルトのマップ画像の上に表示されます。)
  117.   FILE_BACKIMAGE_NAME  = nil
  118.   #--------------------------------------------------------------------------
  119.   # ◇ ウィンドウの可視状態
  120.   #--------------------------------------------------------------------------
  121.   VISIBLE_BACKWINDOW = true
  122.   
  123.   #--------------------------------------------------------------------------
  124.   # ◇ ランダムネーム
  125.   #--------------------------------------------------------------------------
  126.   RANDOM_NAME = {}      # <= 削除しないでください。
  127.   RANDOM_NAME[nil] = [  # デフォルト
  128.     "ラルフ", "ウルリカ", "ベネット", "イルヴァ", "ロレンス",
  129.     "オスカー", "ヴェラ", "エルマー",
  130.     "エリック", "ナタリー", "テレンス", "アーネスト", "リョーマ",
  131.     "ブレンダ", "リック", "アリス", "イザベル", "ノア"
  132.   ]
  133.   
  134.   RANDOM_NAME["男"] = [
  135.     "ラルフ", "ロレンス","オスカー", "エルマー", "エリック", "テレンス",
  136.     "アーネスト", "リョーマ", "リック", "ノア"
  137.   ]
  138.   RANDOM_NAME["女"] = [
  139.     "ウルリカ", "ベネット", "イルヴァ", "ヴェラ", "ナタリー", "ブレンダ",
  140.     "アリス", "イザベル"
  141.   ]
  142.   
  143.   #--------------------------------------------------------------------------
  144.   # ◇ 用語設定
  145.   #--------------------------------------------------------------------------
  146.   VOCAB_FULL_SPACE = "全空"
  147.   VOCAB_HALF_SPACE = "半空"

  148. end # module NameInput
  149. end # module CAO


  150. #/////////////////////////////////////////////////////////////////////////////#
  151. #                                                                             #
  152. #                下記のスクリプトを変更する必要はありません。                 #
  153. #                                                                             #
  154. #/////////////////////////////////////////////////////////////////////////////#


  155. class Game_Temp
  156.   #--------------------------------------------------------------------------
  157.   # ● 公開インスタンス変数
  158.   #--------------------------------------------------------------------------
  159.   attr_accessor :name_mode                #
  160.   attr_accessor :name_empty               #
  161. end

  162. Window_NameInput::TABLE = []
  163. if CAO::NameInput::USE_HIRAGANA
  164.   Window_NameInput::TABLE << [
  165.     'あ','い','う','え','お',  'が','ぎ','ぐ','げ','ご',
  166.     'か','き','く','け','こ',  'ざ','じ','ず','ぜ','ぞ',
  167.     'さ','し','す','せ','そ',  'だ','ぢ','づ','で','ど',
  168.     'た','ち','つ','て','と',  'ば','び','ぶ','べ','ぼ',
  169.     'な','に','ぬ','ね','の',  'ぱ','ぴ','ぷ','ぺ','ぽ',
  170.     'は','ひ','ふ','へ','ほ',  'ぁ','ぃ','ぅ','ぇ','ぉ',
  171.     'ま','み','む','め','も',  'っ','ゃ','ゅ','ょ','ゎ',
  172.     'や', '' ,'ゆ', '' ,'よ',  'わ','を','ん',"\343\202\224",'☆',
  173.     'ら','り','る','れ','ろ',  'ー','~','・',' ' ,' '
  174.   ]
  175. end
  176. if CAO::NameInput::USE_KATAKANA
  177.   Window_NameInput::TABLE << [
  178.     'ア','イ','ウ','エ','オ',  'ガ','ギ','グ','ゲ','ゴ',
  179.     'カ','キ','ク','ケ','コ',  'ザ','ジ','ズ','ゼ','ゾ',
  180.     'サ','シ','ス','セ','ソ',  'ダ','ヂ','ヅ','デ','ド',
  181.     'タ','チ','ツ','テ','ト',  'バ','ビ','ブ','ベ','ボ',
  182.     'ナ','ニ','ヌ','ネ','ノ',  'パ','ピ','プ','ペ','ポ',
  183.     'ハ','ヒ','フ','ヘ','ホ',  'ァ','ィ','ゥ','ェ','ォ',
  184.     'マ','ミ','ム','メ','モ',  'ッ','ャ','ュ','ョ','ヮ',
  185.     'ヤ', '' ,'ユ', '' ,'ヨ',  'ワ','ヲ','ン','ヴ','=',
  186.     'ラ','リ','ル','レ','ロ',  'ー','~','・',' ' ,' '
  187.   ]
  188. end
  189. if CAO::NameInput::USE_ALPHANUMERIC
  190.   Window_NameInput::TABLE << [
  191.     'A','B','C','D','E',  'a','b','c','d','e',
  192.     'F','G','H','I','J',  'f','g','h','i','j',
  193.     'K','L','M','N','O',  'k','l','m','n','o',
  194.     'P','Q','R','S','T',  'p','q','r','s','t',
  195.     'U','V','W','X','Y',  'u','v','w','x','y',
  196.     'Z','[',']','^','_',  'z','{','}','|','~',
  197.     '0','1','2','3','4',  '!','#','$','%','&',
  198.     '5','6','7','8','9',  '(',')','*','+','-',
  199.     '/','=','@','<','>',  ':',';','?',' ' ,' '
  200.   ]
  201. end

  202. #==============================================================================
  203. # ■ Window_NameEdit
  204. #------------------------------------------------------------------------------
  205. #  名前入力画面で、名前を編集するウィンドウです。
  206. #==============================================================================

  207. class Window_NameEdit < Window_Base
  208.   include CAO::NameInput
  209.   #--------------------------------------------------------------------------
  210.   # ● 定数
  211.   #--------------------------------------------------------------------------
  212.   MODO_NONE      = 0                      # なし
  213.   MODE_FACE      = 1                      # 顔グラの描画
  214.   MODE_CHARA     = 2                      # 歩行グラの描画
  215.   WORD_RANDNAME  = /^<RN:(.+?)>$/         # ランダムネームのキーワード取得
  216.   #--------------------------------------------------------------------------
  217.   # ○ オブジェクト初期化
  218.   #--------------------------------------------------------------------------
  219.   def initialize(actor, max_char)
  220.     mode = $game_temp.name_mode || DEFAULT_MODE
  221.     super(0, 0, 496, (mode & MODE_FACE != 0) ? 120 : 72)
  222.     self.x = (Graphics.width - self.width) / 2
  223.     self.y = (Graphics.height - (self.height + fitting_height(9) + 8)) / 2
  224.     @actor = actor
  225.     @max_char = max_char * 2
  226.     @mode = mode
  227.     @default_name = actor.name
  228.     self.name = actor.name
  229.     deactivate
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ●
  233.   #--------------------------------------------------------------------------
  234.   def name_size
  235.     return @size_table.inject(:+) || 0
  236.   end
  237.   #--------------------------------------------------------------------------
  238.   # ●
  239.   #--------------------------------------------------------------------------
  240.   def char_size(ch)
  241.     return (ch[/[!-~ ヲ-゚]/] && ch.size < 2) ? 1 : 2
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ●
  245.   #--------------------------------------------------------------------------
  246.   def item_max
  247.     blank = @max_char - name_size
  248.     return @size_table.size + blank / 2 + blank % 2
  249.   end
  250.   #--------------------------------------------------------------------------
  251.   # ●
  252.   #--------------------------------------------------------------------------
  253.   def name
  254.     return @name_table.join('')
  255.   end
  256.   #--------------------------------------------------------------------------
  257.   # ●
  258.   #--------------------------------------------------------------------------
  259.   def name=(new_name)
  260.     @name_table = new_name.to_s.scan(/[ヲ-ン][゙゚]|./)
  261.     @size_table = @name_table.map {|c| char_size(c) }
  262.     @index = @name_table.size
  263.     break unless back while @max_char < name_size
  264.     refresh
  265.   end
  266.   #--------------------------------------------------------------------------
  267.   # ○ デフォルトの名前に戻す
  268.   #--------------------------------------------------------------------------
  269.   def restore_default
  270.     self.name = @default_name
  271.     return !@name_table.empty?
  272.   end
  273.   #--------------------------------------------------------------------------
  274.   # ○ 文字の追加
  275.   #     ch : 追加する文字
  276.   #--------------------------------------------------------------------------
  277.   def add(ch)
  278.     ch_size = char_size(ch)
  279.     return false if @max_char < name_size + ch_size
  280.     @name_table.push(ch)
  281.     @size_table.push(ch_size)
  282.     @index += 1
  283.     refresh
  284.     return true
  285.   end
  286.   #--------------------------------------------------------------------------
  287.   # ○ 一文字戻す
  288.   #--------------------------------------------------------------------------
  289.   def back
  290.     return false if @index == 0
  291.     @name_table.pop
  292.     @size_table.pop
  293.     @index -= 1
  294.     refresh
  295.     return true
  296.   end
  297.   #--------------------------------------------------------------------------
  298.   # ○ 顔グラフィックの幅を取得
  299.   #--------------------------------------------------------------------------
  300.   def face_width
  301.     return (@mode & MODE_FACE != 0) ? 96 : 32
  302.   end
  303.   #--------------------------------------------------------------------------
  304.   # ○ 文字の幅を取得
  305.   #--------------------------------------------------------------------------
  306.   def char_width
  307.     @char_width ||= text_size("A").width * 2
  308.   end
  309.   #--------------------------------------------------------------------------
  310.   # ● 文字の左右の余白
  311.   #--------------------------------------------------------------------------
  312.   def char_margin
  313.     return 1
  314.   end
  315.   #--------------------------------------------------------------------------
  316.   # ○ 名前を描画する左端の座標を取得
  317.   #--------------------------------------------------------------------------
  318.   def left
  319.     name_center = (contents_width + face_width) / 2
  320.     name_width = (@max_char / 2 + 1) * char_width
  321.     return [name_center - name_width / 2, contents_width - name_width].min
  322.   end
  323.   #--------------------------------------------------------------------------
  324.   # ○ 項目を描画する矩形の取得
  325.   #--------------------------------------------------------------------------
  326.   def item_rect(index)
  327.     sizes = Array.new(index + 1) {|i| @size_table[i] || 2 }
  328.     sizes.map! {|n| (n == 2) ? char_width : char_width / 2 }
  329.     rect = Rect.new(0, 0, 0, line_height)
  330.     rect.x = left + sizes.inject(:+) - sizes.last
  331.     rect.y = (contents_height - line_height) / 2
  332.     if item_max - index == 1 && name_size.odd?
  333.       rect.width = char_width / 2
  334.     else
  335.       rect.width = sizes.last
  336.     end
  337.     return rect
  338.   end
  339.   #--------------------------------------------------------------------------
  340.   # ● 項目を描画する矩形の取得(テキスト用)
  341.   #--------------------------------------------------------------------------
  342.   def item_rect_for_text(index)
  343.     rect = item_rect(index)
  344.     rect.x -= 2
  345.     rect.width += 4
  346.     rect
  347.   end
  348.   #--------------------------------------------------------------------------
  349.   # ○ 下線の矩形を取得
  350.   #--------------------------------------------------------------------------
  351.   def underline_rect(index)
  352.     rect = item_rect(index)
  353.     rect.x += 1 + char_margin
  354.     rect.y += rect.height - 4
  355.     rect.width -= 2 + char_margin * 2
  356.     rect.height = 2
  357.     rect
  358.   end
  359.   #--------------------------------------------------------------------------
  360.   # ● カーソルの更新
  361.   #--------------------------------------------------------------------------
  362.   def update_cursor
  363.     if @index < 0 || name_size >= @max_char
  364.       self.cursor_rect.empty
  365.     else
  366.       self.cursor_rect.set(item_rect(@index))
  367.     end
  368.   end
  369.   #--------------------------------------------------------------------------
  370.   # ○ リフレッシュ
  371.   #--------------------------------------------------------------------------
  372.   def refresh
  373.     self.contents.clear
  374.     draw_edit_face(0, 0)
  375.     item_max.times {|i| draw_underline(i) }
  376.     @name_table.size.times {|i| draw_char(i) }
  377.     cursor_rect.set(item_rect(@index))
  378.     update_cursor
  379.   end
  380.   #--------------------------------------------------------------------------
  381.   # ○ 文字を描画
  382.   #--------------------------------------------------------------------------
  383.   def draw_char(index)
  384.     change_color(normal_color)
  385.     draw_text(item_rect_for_text(index), @name_table[index] || "", 1)
  386.   end
  387.   #--------------------------------------------------------------------------
  388.   # ● 顔グラの描画
  389.   #--------------------------------------------------------------------------
  390.   def draw_edit_face(x, y)
  391.     if @mode & MODE_FACE != 0
  392.       draw_actor_face(@actor, x, y)
  393.       pos_chara = [x + 16, x + contents_height, 0]
  394.     end
  395.     if @mode & MODE_CHARA != 0
  396.       pos_chara ||= [x + 24, x + contents_height, contents_height]
  397.       draw_actor_graphic(@actor, *pos_chara)
  398.     end
  399.   end
  400.   #--------------------------------------------------------------------------
  401.   # ● アクターの歩行グラフィック描画
  402.   #--------------------------------------------------------------------------
  403.   def draw_actor_graphic(actor, x, y, height = 0)
  404.     return unless actor.character_name
  405.     bitmap = Cache.character(actor.character_name)
  406.     sign = actor.character_name[/^[\!\$]./]
  407.     if sign && sign.include?(')
  408.       cw = bitmap.width / 3
  409.       ch = bitmap.height / 4
  410.     else
  411.       cw = bitmap.width / 12
  412.       ch = bitmap.height / 8
  413.     end
  414.     src_rect = Rect.new(0, 0, cw, ch)
  415.     src_rect.x = (actor.character_index % 4 * 3 + 1) * cw
  416.     src_rect.y = (actor.character_index / 4 * 4) * ch
  417.     if height != 0
  418.        y += (ch - height < 0) ? (ch - height) / 2 : ch - height
  419.     end
  420.     self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
  421.   end
  422.   #--------------------------------------------------------------------------
  423.   # ● ランダムネームから
  424.   #--------------------------------------------------------------------------
  425.   def choose_name
  426.     ward = @actor.actor.note[WORD_RANDNAME, 1]
  427.     ward = @actor.class.note[WORD_RANDNAME, 1] unless ward
  428.     if RANDOM_NAME[ward]
  429.       self.name = RANDOM_NAME[ward].sample
  430.     else
  431.       restore_default
  432.     end
  433.   end
  434. end

  435. class Window_NameInput
  436.   include CAO::NameInput
  437.   #--------------------------------------------------------------------------
  438.   # ● 定数
  439.   #--------------------------------------------------------------------------
  440.   CHAR_FULL_SPACE = " "
  441.   CHAR_HALF_SPACE = " "
  442.   WORD_FULL_CHAR  = /[ぁ-#{"\343\202\224"}]/
  443.   #--------------------------------------------------------------------------
  444.   # ● 公開インスタンス変数
  445.   #--------------------------------------------------------------------------
  446.   attr_reader :page
  447.   #--------------------------------------------------------------------------
  448.   # ● オブジェクト初期化
  449.   #--------------------------------------------------------------------------
  450.   def initialize(edit_window)
  451.     @edit_window = edit_window
  452.     @page = 0         # 文字の種類
  453.     @category = 0     #
  454.     @last_index = 0
  455.    
  456.     x = edit_window.x
  457.     width = edit_window.width
  458.     if SEPARATE_WINDOW
  459.       x     += Window_NameCommand::WIDTH if LEFT_MENU
  460.       width -= Window_NameCommand::WIDTH
  461.     end
  462.     super(x, edit_window.y + edit_window.height + 8, width, fitting_height(9))
  463.    
  464.     if LEFT_MENU
  465.       deactivate
  466.       @index = -1
  467.     else
  468.       activate
  469.       @index = 0
  470.     end
  471.     update_cursor
  472.     refresh
  473.   end
  474.   #--------------------------------------------------------------------------
  475.   # ● ウィンドウ内容の高さを計算
  476.   #--------------------------------------------------------------------------
  477.   def contents_height
  478.     return item_max / 10 * line_height
  479.   end
  480.   #--------------------------------------------------------------------------
  481.   # ● リフレッシュ
  482.   #--------------------------------------------------------------------------
  483.   def refresh
  484.     create_contents
  485.     draw_characters_table
  486.     self.top_row = 0
  487.     self.index %= item_max if @index > 0
  488.   end
  489.   #--------------------------------------------------------------------------
  490.   # ●
  491.   #--------------------------------------------------------------------------
  492.   def draw_characters_table
  493.     change_color(normal_color)
  494.     char_table.each_with_index do |c,i|
  495.       if CHANGE_KANA_COLOR && classificatory?
  496.         change_color(c.match(WORD_FULL_CHAR) ? system_color : normal_color)
  497.       end
  498.       case c
  499.       when CHAR_FULL_SPACE; c = VOCAB_FULL_SPACE
  500.       when CHAR_HALF_SPACE; c = VOCAB_HALF_SPACE
  501.       end
  502.       draw_text(item_rect(i), c, 1)
  503.     end
  504.   end
  505.   #--------------------------------------------------------------------------
  506.   # ● 文字を描画する左端の座標を取得
  507.   #--------------------------------------------------------------------------
  508.   def left
  509.     return !SEPARATE_WINDOW && LEFT_MENU ? 128 : 0
  510.   end
  511.   #--------------------------------------------------------------------------
  512.   # ● 項目を描画する矩形の取得
  513.   #--------------------------------------------------------------------------
  514.   def item_rect(index)
  515.     rect = Rect.new
  516.     rect.x = index % 10 * 32 + index % 10 / 5 * 16 + left
  517.     rect.y = index / 10 * line_height
  518.     rect.width = 32
  519.     rect.height = line_height
  520.     rect
  521.   end
  522.   #--------------------------------------------------------------------------
  523.   # ● 項目を描画する矩形の取得
  524.   #--------------------------------------------------------------------------
  525.   def change_charcters_table(page)
  526.     return if @page == page
  527.     raise "指定された文字セットが見つかりません。(#{page})" unless TABLE
  528.     @last_index = 0
  529.     @category = 0
  530.     @page = page
  531.     refresh
  532.   end
  533.   #--------------------------------------------------------------------------
  534.   # ●
  535.   #--------------------------------------------------------------------------
  536.   def restore_index
  537.     @index = @last_index
  538.   end
  539.   #--------------------------------------------------------------------------
  540.   # ● 桁数の取得
  541.   #--------------------------------------------------------------------------
  542.   def col_max
  543.     return 10
  544.   end
  545.   #--------------------------------------------------------------------------
  546.   # ● 項目数の取得
  547.   #--------------------------------------------------------------------------
  548.   def item_max
  549.     return char_table.size
  550.   end
  551.   #--------------------------------------------------------------------------
  552.   # ● 表示する文字セットの取得
  553.   #--------------------------------------------------------------------------
  554.   def char_table
  555.     return TABLE[@page][@category] if classificatory?
  556.     return TABLE[@page]
  557.   end
  558.   #--------------------------------------------------------------------------
  559.   # ○ 文字表の取得
  560.   #--------------------------------------------------------------------------
  561.   def table
  562.     return TABLE
  563.   end
  564.   #--------------------------------------------------------------------------
  565.   # ○ 文字の取得
  566.   #--------------------------------------------------------------------------
  567.   def character
  568.     return char_table[@index] || ""
  569.   end
  570.   #--------------------------------------------------------------------------
  571.   # ●
  572.   #--------------------------------------------------------------------------
  573.   def classificatory?
  574.     return TABLE[@page].kind_of?(Hash)
  575.   end
  576.   #--------------------------------------------------------------------------
  577.   # ●
  578.   #--------------------------------------------------------------------------
  579.   def change_category?
  580.     return classificatory? && @category == 0 && !character.empty?
  581.   end
  582.   #--------------------------------------------------------------------------
  583.   # ○ カーソルの移動処理
  584.   #--------------------------------------------------------------------------
  585.   def process_cursor_move
  586.     last_page = @page
  587.     super
  588.     update_cursor
  589.     Sound.play_cursor if @page != last_page
  590.   end
  591.   #--------------------------------------------------------------------------
  592.   # ●
  593.   #--------------------------------------------------------------------------
  594.   remove_method :update_cursor      # カーソルの更新
  595.   #--------------------------------------------------------------------------
  596.   # ● カーソルを下に移動
  597.   #     wrap : ラップアラウンド許可
  598.   #--------------------------------------------------------------------------
  599.   def cursor_down(wrap = false)
  600.     if index < item_max - col_max || wrap
  601.       select((index + col_max) % item_max)
  602.     end
  603.   end
  604.   #--------------------------------------------------------------------------
  605.   # ● カーソルを上に移動
  606.   #     wrap : ラップアラウンド許可
  607.   #--------------------------------------------------------------------------
  608.   def cursor_up(wrap = false)
  609.     if index >= col_max || wrap
  610.       select((index - col_max + item_max) % item_max)
  611.     end
  612.   end
  613.   #--------------------------------------------------------------------------
  614.   # ● カーソルを右に移動
  615.   #     wrap : ラップアラウンド許可
  616.   #--------------------------------------------------------------------------
  617.   alias _cao_name_cursor_right cursor_right
  618.   def cursor_right(wrap)
  619.     if !SEPARATE_MENU && wrap && @index % col_max == col_max - 1
  620.       call_handler(:switching)
  621.     else
  622.       _cao_name_cursor_right(wrap)
  623.     end
  624.   end
  625.   #--------------------------------------------------------------------------
  626.   # ● カーソルを左に移動
  627.   #     wrap : ラップアラウンド許可
  628.   #--------------------------------------------------------------------------
  629.   alias _cao_name_cursor_left cursor_left
  630.   def cursor_left(wrap)
  631.     if !SEPARATE_MENU && wrap && @index % col_max == 0
  632.       call_handler(:switching)
  633.     else
  634.       _cao_name_cursor_left(wrap)
  635.     end
  636.   end
  637.   #--------------------------------------------------------------------------
  638.   # ● 次の文字セット
  639.   #--------------------------------------------------------------------------
  640.   alias next_charset cursor_pagedown
  641.   #--------------------------------------------------------------------------
  642.   # ● 前の文字セット
  643.   #--------------------------------------------------------------------------
  644.   alias prev_charset cursor_pageup
  645.   #--------------------------------------------------------------------------
  646.   # ○ 次のページへ移動
  647.   #--------------------------------------------------------------------------
  648.   def cursor_pagedown
  649.     super unless PROCESS_BUTTON[:R]
  650.   end
  651.   #--------------------------------------------------------------------------
  652.   # ○ 前のページへ移動
  653.   #--------------------------------------------------------------------------
  654.   def cursor_pageup
  655.     super unless PROCESS_BUTTON[:L]
  656.   end
  657.   #--------------------------------------------------------------------------
  658.   # ○ 決定やキャンセルなどのハンドリング処理
  659.   #--------------------------------------------------------------------------
  660.   def process_handling
  661.     return unless open? && active
  662.     process_cancel if Input.repeat?(:B)
  663.     process_ok     if Input.trigger?(:C)
  664.   end
  665.   #--------------------------------------------------------------------------
  666.   # ○ 決定ボタンが押されたときの処理
  667.   #--------------------------------------------------------------------------
  668.   def process_ok
  669.     if change_category?
  670.       Sound.play_cursor
  671.       @category = character
  672.       @last_index = @index
  673.       @index = 0
  674.       refresh
  675.     elsif !character.empty?
  676.       on_name_add
  677.       if AUTO_RETURN && @category != 0
  678.         @category = 0
  679.         refresh
  680.         self.index = @last_index
  681.       end
  682.     end
  683.   end
  684.   #--------------------------------------------------------------------------
  685.   # ○ キャンセルボタンが押されたときの処理
  686.   #--------------------------------------------------------------------------
  687.   def process_cancel
  688.     if classificatory? && @category != 0
  689.       Sound.play_cancel
  690.       @category = 0
  691.       refresh
  692.       self.index = @last_index
  693.     elsif SEPARATE_MENU
  694.       @last_index = @index
  695.       @category = 0
  696.       refresh
  697.       call_handler(:switching)
  698.     elsif INPUT_BUTTON_B
  699.       call_handler(INPUT_BUTTON_B)
  700.     end
  701.   end
  702. end

  703. class Window_NameCommand < Window_Selectable
  704.   include CAO::NameInput
  705.   #--------------------------------------------------------------------------
  706.   # ● 定数
  707.   #--------------------------------------------------------------------------
  708.   WIDTH = 128
  709.   #--------------------------------------------------------------------------
  710.   # ● オブジェクト初期化
  711.   #--------------------------------------------------------------------------
  712.   def initialize(input_window)
  713.     @input_window = input_window
  714.     super(input_window.x, input_window.y, WIDTH, input_window.height)
  715.     if SEPARATE_WINDOW
  716.       self.x += (LEFT_MENU ? -WIDTH : input_window.width)
  717.     else
  718.       self.x += (LEFT_MENU ? 12 : input_window.width - WIDTH - 12)
  719.     end
  720.     self.opacity = 0 unless SEPARATE_WINDOW
  721.     self.active = LEFT_MENU
  722.     select(0) if LEFT_MENU || SEPARATE_MENU
  723.     refresh
  724.   end
  725.   #--------------------------------------------------------------------------
  726.   # ● 項目数の取得
  727.   #--------------------------------------------------------------------------
  728.   def item_max
  729.     return 9
  730.   end
  731.   #--------------------------------------------------------------------------
  732.   # ● 項目の選択
  733.   #--------------------------------------------------------------------------
  734.   def select(index)
  735.     return unless index
  736.     index %= item_max
  737.     if COMMANDS[index][1]
  738.       self.index = index
  739.     elsif @index < 0
  740.       result = COMMANDS[index, item_max].index {|o| o[1] }
  741.       result &&= [result + index, item_max - 1].min
  742.       result ||= COMMANDS.rindex {|o| o[1] }
  743.       self.index = result
  744.     else
  745.       method = (@index < index) ? :index : :rindex
  746.       result = COMMANDS.rotate(index).send(method) {|o| o[1] }
  747.       self.index = (result + index) % item_max
  748.     end
  749.   end
  750.   #--------------------------------------------------------------------------
  751.   # ● 項目の描画
  752.   #--------------------------------------------------------------------------
  753.   def draw_item(index)
  754.     if COMMANDS[index][1]
  755.       rect = item_rect(index)
  756.       rect.x += 2
  757.       rect.width -= 4
  758.       draw_text(rect, COMMANDS[index][0], 1)
  759.     end
  760.   end
  761.   #--------------------------------------------------------------------------
  762.   # ● カーソルを下に移動
  763.   #--------------------------------------------------------------------------
  764.   def cursor_down(wrap = false)
  765.     end_index = COMMANDS.rindex {|o| o[1] }
  766.     select((index + 1) % item_max) if index < end_index || wrap
  767.     end
  768.   #--------------------------------------------------------------------------
  769.   # ● カーソルを上に移動
  770.   #--------------------------------------------------------------------------
  771.   def cursor_up(wrap = false)
  772.     start_index = COMMANDS.index {|o| o[1] }
  773.     select((index - 1 + item_max) % item_max) if index > start_index || wrap
  774.   end
  775.   #--------------------------------------------------------------------------
  776.   # ● カーソルを右に移動
  777.   #--------------------------------------------------------------------------
  778.   def cursor_right(wrap = false)
  779.     call_handler(:switching) unless SEPARATE_MENU
  780.   end
  781.   #--------------------------------------------------------------------------
  782.   # ● カーソルを左に移動
  783.   #--------------------------------------------------------------------------
  784.   def cursor_left(wrap = false)
  785.     call_handler(:switching) unless SEPARATE_MENU
  786.   end
  787.   #--------------------------------------------------------------------------
  788.   # ○ 決定ボタンが押されたときの処理
  789.   #--------------------------------------------------------------------------
  790.   def process_ok
  791.     return unless COMMANDS[@index][1]
  792.     if COMMANDS[@index][1].kind_of?(Integer)
  793.       @input_window.change_charcters_table(COMMANDS[@index][1])
  794.       if SEPARATE_MENU || AUTO_SWITCH
  795.         Sound.play_cursor
  796.         call_handler(:switching)
  797.       end
  798.     else
  799.       call_handler(COMMANDS[@index][1])
  800.     end
  801.   end
  802.   #--------------------------------------------------------------------------
  803.   # ○ キャンセルボタンが押されたときの処理
  804.   #--------------------------------------------------------------------------
  805.   def process_cancel
  806.     Input.update
  807.     call_cancel_handler
  808.   end
  809. end

  810. class Scene_Name
  811.   include CAO::NameInput
  812.   #--------------------------------------------------------------------------
  813.   # ○ 開始処理
  814.   #--------------------------------------------------------------------------
  815.   def start
  816.     super
  817.     @actor = $game_actors[@actor_id]
  818.     @edit_window = Window_NameEdit.new(@actor, @max_char)
  819.     create_input_window
  820.     create_command_window
  821.     hide_all_backwindows unless VISIBLE_BACKWINDOW
  822.   end
  823.   #--------------------------------------------------------------------------
  824.   # ● 全ウィンドウを非表示
  825.   #--------------------------------------------------------------------------
  826.   def hide_all_backwindows
  827.     instance_variables.each do |varname|
  828.       ivar = instance_variable_get(varname)
  829.       ivar.opacity = 0 if ivar.is_a?(Window)
  830.     end
  831.   end
  832.   #--------------------------------------------------------------------------
  833.   # ○ 終了処理
  834.   #--------------------------------------------------------------------------
  835.   def terminate
  836.     super
  837.     $game_temp.name_mode = nil
  838.     $game_temp.name_empty = nil
  839.   end
  840.   #--------------------------------------------------------------------------
  841.   # ● 文字選択ウィンドウの作成
  842.   #--------------------------------------------------------------------------
  843.   def create_input_window
  844.     @input_window = Window_NameInput.new(@edit_window)
  845.     @input_window.set_handler(:switching, method(:activate_command_window))
  846.     @input_window.set_handler(:back, method(:on_name_back))
  847.     set_handler(@input_window, INPUT_BUTTON_B) if INPUT_BUTTON_B
  848.   end
  849.   #--------------------------------------------------------------------------
  850.   # ● メニューウィンドウの作成
  851.   #--------------------------------------------------------------------------
  852.   def create_command_window
  853.     @command_window = Window_NameCommand.new(@input_window)
  854.     @command_window.set_handler(:switching, method(:activate_input_window))
  855.     if COMMAND_BUTTON_B
  856.       name = :"on_name_#{COMMAND_BUTTON_B}"
  857.       @command_window.set_handler(:cancel, method(name))
  858.     end
  859.     COMMANDS.each do |a|
  860.       set_handler(@command_window, a[1]) if a[1].kind_of?(Symbol)
  861.     end
  862.   end
  863.   #--------------------------------------------------------------------------
  864.   # ● 背景の作成
  865.   #--------------------------------------------------------------------------
  866.   def create_background
  867.     if FILE_BACKGROUND_NAME
  868.       @background_sprite = Sprite.new
  869.       @background_sprite.bitmap = Cache.system(FILE_BACKGROUND_NAME)
  870.     else
  871.       super
  872.     end
  873.     if FILE_BACKIMAGE_NAME
  874.       @backimage_sprite = Sprite.new
  875.       @backimage_sprite.bitmap = Cache.system(FILE_BACKIMAGE_NAME)
  876.     end
  877.     if FILE_FOREGROUND_NAME
  878.       @foreground_sprite = Sprite.new
  879.       @foreground_sprite.z = 500
  880.       @foreground_sprite.bitmap = Cache.system(FILE_FOREGROUND_NAME)
  881.     end
  882.   end
  883.   #--------------------------------------------------------------------------
  884.   # ● 背景の解放
  885.   #--------------------------------------------------------------------------
  886.   def dispose_background
  887.     super
  888.     @backimage_sprite.dispose if @backimage_sprite
  889.     @foreground_sprite.dispose if @foreground_sprite
  890.   end
  891.   #--------------------------------------------------------------------------
  892.   # ●
  893.   #--------------------------------------------------------------------------
  894.   def activate_command_window
  895.     @command_window.activate
  896.     unless SEPARATE_MENU
  897.       index = @input_window.index / 10 - @input_window.top_row
  898.       @command_window.select(index)
  899.     end
  900.     @input_window.deactivate
  901.     @input_window.unselect
  902.     Input.update
  903.   end
  904.   #--------------------------------------------------------------------------
  905.   # ●
  906.   #--------------------------------------------------------------------------
  907.   def activate_input_window
  908.     @input_window.activate
  909.     if SEPARATE_MENU
  910.       @input_window.restore_index
  911.     else
  912.       index = (@command_window.index + @input_window.top_row) * 10
  913.       if Input.trigger?(:LEFT)
  914.         @input_window.select(index + 9)
  915.       elsif Input.trigger?(:RIGHT)
  916.         @input_window.select(index)
  917.       else
  918.         @input_window.restore_index
  919.         @input_window.update_cursor
  920.       end
  921.     end
  922.     @command_window.deactivate
  923.     @command_window.unselect unless SEPARATE_MENU
  924.     Input.update
  925.   end
  926.   #--------------------------------------------------------------------------
  927.   # ◎ フレーム更新
  928.   #--------------------------------------------------------------------------
  929.   def update
  930.     super
  931.     process_button
  932.   end
  933.   #--------------------------------------------------------------------------
  934.   # ● ハンドリング処理
  935.   #--------------------------------------------------------------------------
  936.   def process_button
  937.     PROCESS_BUTTON.each do |key,handle|
  938.       next unless PROCESS_BUTTON[key] && Input.trigger?(key)
  939.       __send__("on_name_#{handle}")
  940.     end
  941.   end
  942.   #--------------------------------------------------------------------------
  943.   # ●
  944.   #--------------------------------------------------------------------------
  945.   def set_handler(window, handle)
  946.     window.set_handler(handle, method(:"on_name_#{handle}"))
  947.   end
  948.   #--------------------------------------------------------------------------
  949.   # ● 入力名を適用する
  950.   #--------------------------------------------------------------------------
  951.   def on_name_ok
  952.     case @edit_window.name.empty? && ($game_temp.name_empty || DEFAULT_EMPTY)
  953.     when 0
  954.       Sound.play_buzzer
  955.     when 1
  956.       if @edit_window.restore_default
  957.         Sound.play_ok
  958.         on_input_ok
  959.       else
  960.         Sound.play_buzzer
  961.       end
  962.     else
  963.       Sound.play_ok
  964.       on_input_ok
  965.     end
  966.   end
  967.   #--------------------------------------------------------------------------
  968.   # ● 名前入力をやめる
  969.   #--------------------------------------------------------------------------
  970.   def on_name_cancel
  971.     case @edit_window.name.empty? && ($game_temp.name_empty || DEFAULT_EMPTY)
  972.     when 0,1
  973.       Sound.play_buzzer
  974.     else
  975.       Sound.play_cancel
  976.       return_scene
  977.     end
  978.   end
  979.   #--------------------------------------------------------------------------
  980.   # ● 一文字削除
  981.   #--------------------------------------------------------------------------
  982.   def on_name_back
  983.     Sound.play_cancel if @edit_window.back
  984.   end
  985.   #--------------------------------------------------------------------------
  986.   # ● 決定にジャンプ
  987.   #--------------------------------------------------------------------------
  988.   def on_name_jump
  989.     index = COMMANDS.index {|cmd| cmd[1] == :ok }
  990.     return unless index
  991.     Sound.play_cursor
  992.     @command_window.activate
  993.     @command_window.select(index)
  994.     @input_window.deactivate
  995.     @input_window.unselect
  996.     Input.update
  997.   end
  998.   #--------------------------------------------------------------------------
  999.   # ● 現在の文字セットにジャンプ
  1000.   #--------------------------------------------------------------------------
  1001.   def on_name_now
  1002.     index = COMMANDS.index {|cmd| cmd[1] == @input_window.page }
  1003.     return unless index
  1004.     Sound.play_cursor
  1005.     @command_window.activate
  1006.     @command_window.select(index)
  1007.     @input_window.deactivate
  1008.     @input_window.unselect
  1009.     Input.update
  1010.   end
  1011.   #--------------------------------------------------------------------------
  1012.   # ● デフォルトの名前に戻す
  1013.   #--------------------------------------------------------------------------
  1014.   def on_name_default
  1015.     Sound.play_cancel
  1016.     @edit_window.restore_default
  1017.   end
  1018.   #--------------------------------------------------------------------------
  1019.   # ● ランダムに名前を入力する
  1020.   #--------------------------------------------------------------------------
  1021.   def on_name_random
  1022.     Sound.play_ok
  1023.     @edit_window.choose_name
  1024.   end
  1025.   #--------------------------------------------------------------------------
  1026.   # ● 次の文字セットに変更
  1027.   #--------------------------------------------------------------------------
  1028.   def on_name_next
  1029.     Sound.play_cursor
  1030.     @input_window.next_charset
  1031.   end
  1032.   #--------------------------------------------------------------------------
  1033.   # ● 前の文字セットに変更
  1034.   #--------------------------------------------------------------------------
  1035.   def on_name_prev
  1036.     Sound.play_cursor
  1037.     @input_window.prev_charset
  1038.   end
  1039. end
复制代码

评分

参与人数 1星屑 +200 收起 理由
taroxd + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
4
星屑
2013
在线时间
442 小时
注册时间
2015-7-19
帖子
149
3
 楼主| 发表于 2015-8-7 16:11:08 | 只看该作者
黑崎一护 发表于 2015-8-7 14:31
像这样的?

谢了,(这些因为字数太少而凑了,但真的谢谢了。)

点评

我凑字数一般用空格= =  发表于 2015-8-7 16:13
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 14:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表