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

Project1

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

[已经解决] 請教如何修改選單光標的間距

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
461 小时
注册时间
2008-11-19
帖子
607
跳转到指定楼层
1
发表于 2012-5-12 03:36:08 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 sai90306 于 2012-5-12 03:39 编辑

以下是我做的測試用選單(只是做個樣子來突顯我的問題沒有任何功能)
這是選單的基本樣子



這是選單index =1 和 =2的比較

可以發現兩個index之間有一段藍色的距離
請問要如何調整才不會錯位?

我嘗試調整
    cursor_width = width / @column_max - 32

    x = index % @column_max * (cursor_width + 32)
不過失敗了@@


附上用到的兩個腳本(先向班竹抱歉了用代碼框發問會顯示不出來 先用引用框代替)
class Window_CommandMenu_Sai90306 < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     width    : 窗口的宽
  #     commands : 命令字符串序列
  #--------------------------------------------------------------------------
  def initialize(width, commands)
    # 由命令的个数计算出窗口的高
    super(0, 0, width, 64)
    @item_max = commands.size
    @commands = commands
    @column_max = commands.size
    self.contents = Bitmap.new(width - 32, 64- 32)
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i, normal_color)
    end
  end
  #--------------------------------------------------------------------------
  # ● 描绘项目
  #     index : 项目编号
  #     color : 文字色
  #--------------------------------------------------------------------------
  def draw_item(index, color)
    self.contents.font.color = color
    self.contents.font.size = 16#設定文字大小
    self.contents.font.bold = true#設定文字粗體
    # 计算光标的宽
    cursor_width = width / @column_max - 32
    # 计算光标坐标
    x = index % @column_max * (cursor_width + 32)
    #y = @index / @column_max * 32 - self.oy
    rect = Rect.new(x, 0, cursor_width - 8, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, @commands[index], 1)
  end
  #--------------------------------------------------------------------------
  # ● 项目无效化
  #     index : 项目编号
  #--------------------------------------------------------------------------
  def disable_item(index)
    draw_item(index, disabled_color)
  end
end


class Scene_Menu_Sai90306
  #--------------------------------------------------------------------------
  # ● 初始化目標
  #     menu_index : 命令游標的初期位置
  #--------------------------------------------------------------------------
  def initialize(menu_index = 0)
    @menu_index = menu_index
  end
  #--------------------------------------------------------------------------
  # ● 主處理
  #--------------------------------------------------------------------------
  def main
    #設定背景圖片開始

    @back_map = Spriteset_Map.new#設定背景透明
    # 製作命令視窗
    s1 = "選項"
    s2 = "選項測試"
    s3 = "選項測試測試"
    s4 = "選項"
    s5 = "選項"
    s6 = "選項測試測試測試"
    s7 = "返回"
    主選項 = [s1,s2,s3,s4,s5,s6,s7]
  
   
    @SLG_選單寬度 = 640#640為選單寬度,可調整
    @command_window = Window_CommandMenu_Sai90306.new(@SLG_選單寬度, 主選項)#250為選單寬度,可調整
    #@command_window = Window_Command_Sai.new(250, [s5, s6, s7, s8, s9])#250為選單寬度,可調整
    #@command_window.height = 32+32*$sai_row#設定選單行數為$sai_row行
    @command_window.height = 32+32
    @command_window.x = 0#設定x座標
    @command_window.y = 480-64#設定y座標
    @command_window.index = @menu_index
   
    # 執行過渡
    Graphics.transition
    # 主循環
    loop do
      # 更新遊戲畫面
      Graphics.update
      # 更新輸入訊息
      Input.update
      # 更新畫面
      update
      # 如果切換畫面就中斷循環
      if $scene != self
        break
      end
    end
    # 準備過渡
    Graphics.freeze
    # 釋放視窗所佔的記憶體空間
    @back_map.dispose#釋放背景
    @command_window.dispose

  end
  #--------------------------------------------------------------------------
  # ● 更新畫面
  #--------------------------------------------------------------------------
  def update
    # 更新視窗
    @command_window.update
   
    # 命令視窗被啟動的情況下: 取用 update_command
    if @command_window.active
      update_command
      return
    end
    # 政務視窗被啟動的情況下: 取用 update_command1
    if @command_window1.active
      update_command1
      return
    end
    # 軍事視窗被啟動的情況下: 取用 update_command2
    if @command_window2.active
      update_command2
      return
    end
    # 人才視窗被啟動的情況下: 取用 update_command2
    if @command_window3.active
      update_command3
      return
    end

  end
  #--------------------------------------------------------------------------
  # ● 更新畫面 (命令視窗被啟動的情況下)
  #--------------------------------------------------------------------------
  def update_command
    # 按下 B 鍵的情況下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切換的地圖畫面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 鍵的情況下
    if Input.trigger?(Input::C)
      # 同伴人數為 0、存檔、遊戲結束以外的場合
      if $game_party.actors.size == 0 and @command_window.index < 4
        # 演奏凍結 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 命令視窗的游標位置分支
      case @command_window.index
      when 0  #政務
        @command_window.active = false

      when 1  #軍事
        @command_window.active = false

      when 2  #人才
        @command_window.active = false

      when 3

      when 4  

      when 5  

      end
      return
    end
  end
end

点评

两个问题都是通过这个地方解决。  发表于 2012-5-12 13:38

Lv2.观梦者

虚構歪曲

梦石
0
星屑
364
在线时间
1198 小时
注册时间
2010-12-18
帖子
3928

贵宾

4
发表于 2012-5-12 13:32:02 | 只看该作者
本帖最后由 忧雪の伤 于 2012-5-12 13:34 编辑
  1.   #--------------------------------------------------------------------------
  2.   # ● 刷新光标矩形
  3.   #--------------------------------------------------------------------------
  4.   def update_cursor_rect
  5.     if @index < 0
  6.       self.cursor_rect.empty
  7.     else
  8.       self.cursor_rect.set(0, @index * 116, self.width - 32, 96)
  9.     end
  10.   end
复制代码
例如这个,请看到
self.cursor_rect.set

这个部分,这个方法的参数就是你需要改的东西。当然,这个是纵列的,
横列应该是
cursor_rect.set(@index * n, y, w, h)

第一个参数是每一格移动的长度,第二个是选框的纵坐标,第三个是选框的宽度,第四个是选框的长度,随意修改就好。
也就是说,大概会增加一个这样的方法(自己调整参数
  1.   def update_cursor_rect
  2.     self.cursor_rect.set(2 + @index * 96, 2, 96, 32)
  3.   end
复制代码
注意这个修改不是在 selectable 中而是在自己创建的子类中。

点评

明白了!感謝指點!  发表于 2012-5-12 13:37
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
461 小时
注册时间
2008-11-19
帖子
607
3
 楼主| 发表于 2012-5-12 13:25:44 | 只看该作者
本帖最后由 sai90306 于 2012-5-12 13:26 编辑
忧雪の伤 发表于 2012-5-12 11:53
不不不,请拿出 update_cursor_rect …… 要修改的是这个。


是不是這個?(Window_CommandMenu_Sai90306 < Window_Selectable)
  1. #==============================================================================
  2. # ■ Window_Selectable
  3. #------------------------------------------------------------------------------
  4. # 擁有游標移動以及捲動功能的視窗類別。

  5. #要調整視窗顯示行數搜索 #調整視窗顯示行數
  6. #==============================================================================

  7. class Window_Selectable_Sai < Window_Base_Sai
  8.   #--------------------------------------------------------------------------
  9.   # ● 定義實例變量
  10.   #--------------------------------------------------------------------------
  11.   attr_reader   :index                    # 游標位置
  12.   attr_reader   :help_window              # 提示視窗
  13.   #--------------------------------------------------------------------------
  14.   # ● 初始化對像
  15.   #     x      : 視窗的 X 座標
  16.   #     y      : 視窗的 Y 座標
  17.   #     width  : 視窗的寬度
  18.   #     height : 視窗的高度
  19.   #--------------------------------------------------------------------------
  20.   def initialize(x, y, width, height)
  21.     super(x, y, width, height)
  22.     @item_max = 1
  23.     @column_max = 1
  24.     @index = -1
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 設定游標的位置
  28.   #     index : 新的游標位置
  29.   #--------------------------------------------------------------------------
  30.   def index=(index)
  31.     @index = index
  32.     # 更新提示內容 (由 update_help 定義了繼承目標)
  33.     if self.active and @help_window != nil
  34.       update_help
  35.     end
  36.     # 更新游標矩形
  37.     update_cursor_rect
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 取得行數
  41.   #--------------------------------------------------------------------------
  42.   def row_max
  43.     # 由項目數和列數計算出行數
  44.     return (@item_max + @column_max - 1) / @column_max
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   # ● 取得開頭行
  48.   #--------------------------------------------------------------------------
  49.   def top_row
  50.     # 將視窗內容的傳送源 Y 座標、1 行的高 32 等分
  51.     return self.oy / 32
  52.   end
  53.   #--------------------------------------------------------------------------
  54.   # ● 設定開頭行
  55.   #     row : 顯示開頭的行
  56.   #--------------------------------------------------------------------------
  57.   def top_row=(row)
  58.     # row 未滿 0 的場合更正為 0
  59.     if row < 0
  60.       row = 0
  61.     end
  62.     # row 超過 row_max - 1 的情況下更正為 row_max - 1
  63.     if row > row_max - 1
  64.       row = row_max - 1
  65.     end
  66.     # row 1 行高的 32 倍、視窗內容的傳送源 Y 座標
  67.     self.oy = row * 32
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ● 獲取 1 頁可以顯示的行數
  71.   #--------------------------------------------------------------------------
  72.   def page_row_max
  73.     # 視窗的高度,設定畫面的高度減去 32 ,除以 1 行的高度 32
  74.     if $sai_row == nil
  75.     return (self.height - 32) / 32#預設值
  76.     else
  77.     return $sai_row
  78.     end
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # ● 獲取 1 頁可以顯示的項目數
  82.   #--------------------------------------------------------------------------
  83.   def page_item_max
  84.     # 將行數 page_row_max 乘上列數 @column_max
  85.     return page_row_max * @column_max#預設值
  86.   end
  87.   #--------------------------------------------------------------------------
  88.   # ● 提示視窗的設定
  89.   #     help_window : 新的提示視窗
  90.   #--------------------------------------------------------------------------
  91.   def help_window=(help_window)
  92.     @help_window = help_window
  93.     # 更新提示文字 (由 update_help 定義了繼承的目標)
  94.     if self.active and @help_window != nil
  95.       update_help
  96.     end
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 更新游標矩形
  100.   #--------------------------------------------------------------------------
  101.   def update_cursor_rect
  102.     # 游標位置不滿 0 的情況下
  103.     if @index < 0
  104.       self.cursor_rect.empty
  105.       return
  106.     end
  107.     # 取得當前的行
  108.     row = @index / @column_max
  109.     # 當前行被顯示開頭行前面的情況下
  110.     if row < self.top_row
  111.       # 從當前行向開頭行捲動
  112.       self.top_row = row
  113.     end
  114.     # 當前行被顯示末尾行之後的情況下
  115.     if row > self.top_row + (self.page_row_max - 1)
  116.       # 從當前行向末尾捲動
  117.       self.top_row = row - (self.page_row_max - 1)
  118.     end
  119.     # 計算游標的寬度
  120.     cursor_width = self.width / @column_max - 32
  121.     # 計算游標座標
  122.     x = @index % @column_max * (cursor_width + 32)
  123.     y = @index / @column_max * 32 - self.oy
  124.     # 更新游標矩形
  125.     self.cursor_rect.set(x, y, cursor_width, 32)
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● 更新畫面
  129.   #--------------------------------------------------------------------------
  130.   def update
  131.     super
  132.     # 可以移動光標的情況下
  133.     if self.active and @item_max > 0 and @index >= 0
  134.       # 方向鍵下被按下的情況下
  135.       if Input.repeat?(Input::DOWN)
  136.         # 列數不是 1 並且方向鍵的下的按下狀態不是重複的情況、
  137.         # 或游標位置在(項目數-列數)之前的情況下
  138.         if (@column_max == 1 and Input.trigger?(Input::DOWN)) or
  139.            @index < @item_max - @column_max
  140.           # 游標向下移動
  141.           $game_system.se_play($data_system.cursor_se)
  142.           @index = (@index + @column_max) % @item_max
  143.         end
  144.       end
  145.       # 方向鍵上被按下的情況下
  146.       if Input.repeat?(Input::UP)
  147.         # 列數不是 1 並且方向鍵的下的按下狀態不是重複的情況、
  148.         # 或游標位置在列之後的情況下
  149.         if (@column_max == 1 and Input.trigger?(Input::UP)) or
  150.            @index >= @column_max
  151.           # 游標向上移動
  152.           $game_system.se_play($data_system.cursor_se)
  153.           @index = (@index - @column_max + @item_max) % @item_max
  154.         end
  155.       end
  156. =begin
  157.       # 方向鍵右被按下的情況下
  158.       if Input.repeat?(Input::RIGHT)
  159.         # 列數為 2 以上並且、游標位置在(項目數 - 1)之前的情況下
  160.         if @column_max >= 2 and @index < @item_max - 1
  161.           # 游標向右移動
  162.           $game_system.se_play($data_system.cursor_se)
  163.           @index += 1
  164.         end
  165.       end
  166.       # 方向鍵左被按下的情況下
  167.       if Input.repeat?(Input::LEFT)
  168.         # 列數為 2 以上並且、游標位置在 0 之後的情況下
  169.         if @column_max >= 2 and @index > 0
  170.           # 游標向左移動
  171.           $game_system.se_play($data_system.cursor_se)
  172.           @index -= 1
  173.         end
  174.       end
  175. =end

  176. #纵向菜单循环
  177.      # 方向键右被按下的情况下
  178.      if Input.repeat?(Input::RIGHT)
  179.        if @column_max >= 2 and  @index == @item_max - 1
  180.          $game_system.se_play($data_system.cursor_se)
  181.          @index = -1
  182.        end
  183.        # 列数为 2 以上并且、光标位置在(项目数 - 1)之前的情况下
  184.        if @column_max >= 2 and @index < @item_max - 1
  185.          # 光标向右移动
  186.          $game_system.se_play($data_system.cursor_se)
  187.          @index += 1
  188.        end  
  189.      end
  190.      # 方向键左被按下的情况下
  191.      if Input.repeat?(Input::LEFT)
  192.        if  @column_max >= 2 and @index == 0
  193.          $game_system.se_play($data_system.cursor_se)
  194.          @index = @item_max
  195.        end
  196.        # 列数为 2 以上并且、光标位置在 0 之后的情况下
  197.        if @column_max >= 2 and @index > 0
  198.          # 光标向左移动
  199.          $game_system.se_play($data_system.cursor_se)
  200.          @index -= 1
  201.        end
  202.      end
  203. #纵向菜单循环

  204.       # R 鍵被按下的情況下
  205.       if Input.repeat?(Input::R)
  206.         # 顯示的最後行在資料中最後行上方的情況下
  207.         if self.top_row + (self.page_row_max - 1) < (self.row_max - 1)
  208.           # 游標向後移動一頁
  209.           $game_system.se_play($data_system.cursor_se)
  210.           @index = [@index + self.page_item_max, @item_max - 1].min
  211.           self.top_row += self.page_row_max
  212.         end
  213.       end
  214.       # L 鍵被按下的情況下
  215.       if Input.repeat?(Input::L)
  216.         # 顯示的開頭行在位置 0 之後的情況下
  217.         if self.top_row > 0
  218.           # 游標向前移動一頁
  219.           $game_system.se_play($data_system.cursor_se)
  220.           @index = [@index - self.page_item_max, 0].max
  221.           self.top_row -= self.page_row_max
  222.         end
  223.       end
  224.     end
  225.     # 更新提示文字 (由 update_help 定義了繼承的目標)
  226.     if self.active and @help_window != nil
  227.       update_help
  228.     end
  229.     # 更新游標矩形
  230.     update_cursor_rect
  231.   end
  232. end
复制代码
回复

使用道具 举报

Lv2.观梦者

虚構歪曲

梦石
0
星屑
364
在线时间
1198 小时
注册时间
2010-12-18
帖子
3928

贵宾

2
发表于 2012-5-12 11:53:30 | 只看该作者
不不不,请拿出 update_cursor_rect …… 要修改的是这个。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 01:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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