Project1

标题: 如何用commands来判断或控制光标的大小及位置? [打印本页]

作者: 文雅夕露    时间: 2018-3-12 21:34
标题: 如何用commands来判断或控制光标的大小及位置?
本帖最后由 文雅夕露 于 2018-3-12 21:37 编辑


如上图:
我想把选项自定义摆放的说...
然而光标的位置和大小不会跟着选项摆放的位置而调整。
导致很多问题的产生。
请问该怎么做才能判断或控制光标的大小及位置?
脚本一览:
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Window_Battlecommand
  3. #------------------------------------------------------------------------------
  4. #   战斗的命令选择行窗口。
  5. #==============================================================================
  6.  
  7. class Window_Battlecommand < Window_Selectable
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #     width    : 窗口的宽
  11.   #     commands : 命令字符串序列
  12.   #--------------------------------------------------------------------------
  13.   def initialize(width, commands)
  14.     # 由命令的个数计算出窗口的高
  15.     super(0, 0, width, commands.size * 32) #+ 32
  16.     @item_max = commands.size
  17.     @commands = commands
  18.     @command_icons = [
  19.     "攻击",
  20.     "技能",
  21.     "防御",
  22.     "道具"
  23.     ]
  24.    # self.windowskin = RPG::Cache.windowskin("")
  25.     self.contents = Bitmap.new(width - 32, @item_max * 32)
  26.     self.opacity = 0
  27.     @back_sprite = Sprite.new
  28.     @back_sprite.bitmap = RPG::Cache.picture("魔导阵")
  29.     @back_sprite.ox = @back_sprite.bitmap.width / 2
  30.     @back_sprite.oy = @back_sprite.bitmap.height / 2
  31.     @back_sprite.x = self.x + 376
  32.     @back_sprite.y = self.y + 92
  33.     @back_sprite.z = 9999
  34.     refresh
  35.     self.index = 0
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 释放
  39.   #--------------------------------------------------------------------------
  40.   def dispose
  41.     super
  42.     @back_sprite.dispose
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 刷新
  46.   #--------------------------------------------------------------------------
  47.   def refresh
  48.     self.contents.clear
  49.     @commands.each_with_index do |command, i|
  50.     draw_item(command, i)
  51.   end
  52. end
  53.   #--------------------------------------------------------------------------
  54.   # ● 更新
  55.   #--------------------------------------------------------------------------
  56.   alias magic_update update
  57.   def update
  58.   magic_update
  59.   @back_sprite.angle -= 2
  60. end
  61.   #--------------------------------------------------------------------------
  62.   # ● 描绘项目
  63.   #     commands : 项目
  64.   #     i : 序号,从0开始
  65.   #--------------------------------------------------------------------------
  66.   def draw_item(command, i)
  67.     file = @command_icons[i]
  68.     if file == nil
  69.     bitmap = Bitmap.new(24,24)
  70.   else
  71.     bitmap = RPG::Cache.icon(@command_icons[i])
  72.   end
  73.   if i == 0
  74.   self.contents.blt(4+40, i*32 + 4 , bitmap , Rect.new(0,0,24,24))
  75.   self.contents.draw_text(4+64, i*32 , width - 32 - 36 , 32 , command)
  76. elsif i == 1
  77.   self.contents.blt(4+4, i*32 + 4 , bitmap , Rect.new(0,0,24,24))
  78.   self.contents.draw_text(4+24+4, i*32 , width - 32 - 36 , 32 , command)
  79. elsif i == 2
  80.   self.contents.blt(4+64+16, (i-1)*32 + 4 , bitmap , Rect.new(0,0,24,24))
  81.   self.contents.draw_text(4+64+24+16, (i-1)*32 , width - 32 - 36 , 32 , command)
  82. elsif i == 3
  83.   self.contents.blt(4+40, (i-1)*32 + 4 , bitmap , Rect.new(0,0,24,24))
  84.   self.contents.draw_text(4+64, (i-1)*32 , width - 32 - 36 , 32 , command)
  85. # self.contents.blt(4, i*32 + 4 , bitmap , Rect.new(0,0,24,24))
  86. # self.contents.draw_text(4+32, i*32 , width - 32 - 36 , 32 , command)
  87. end
  88. end
  89. end
  90.  
  91. class Scene_Battle
  92.   #--------------------------------------------------------------------------
  93.   # ● 主处理
  94.   #--------------------------------------------------------------------------
  95.   def main
  96.     # 初始化战斗用的各种暂时数据
  97.     $game_temp.in_battle = true
  98.     $game_temp.battle_turn = 0
  99.     $game_temp.battle_event_flags.clear
  100.     $game_temp.battle_abort = false
  101.     $game_temp.battle_main_phase = false
  102.     $game_temp.battleback_name = $game_map.battleback_name
  103.     $game_temp.forcing_battler = nil
  104.     # 初始化战斗用事件解释器
  105.     $game_system.battle_interpreter.setup(nil, 0)
  106.     # 准备队伍
  107.     @troop_id = $game_temp.battle_troop_id
  108.     $game_troop.setup(@troop_id)
  109.     # 生成角色命令窗口
  110.     s1 = $data_system.words.attack
  111.     s2 = $data_system.words.skill
  112.     s3 = $data_system.words.guard
  113.     s4 = $data_system.words.item
  114.     if $game_switches[6]
  115.     @actor_command_window = Window_Battlecommand.new(224, [s1, s2, s3, s4])
  116.     @actor_command_window.z = 9999
  117.     else
  118.     @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
  119.     end
  120.  
  121.     #
  122.     @actor_command_window.y = 160
  123.     @actor_command_window.back_opacity = 160
  124.     @actor_command_window.active = false
  125.     @actor_command_window.visible = false
  126.     # 生成其它窗口
  127.     @party_command_window = Window_PartyCommand.new
  128.     @help_window = Window_Help.new
  129.     @help_window.back_opacity = 160
  130.     @help_window.visible = false
  131.     @status_window = Window_BattleStatus.new
  132.     @message_window = Window_Message.new
  133.     # 生成活动块
  134.     @spriteset = Spriteset_Battle.new
  135.     # 初始化等待计数
  136.     @wait_count = 0
  137.     # 执行过渡
  138.     if $data_system.battle_transition == ""
  139.       Graphics.transition(20)
  140.     else
  141.       Graphics.transition(40, "Graphics/Transitions/" +
  142.         $data_system.battle_transition)
  143.     end
  144.     # 开始自由战斗回合
  145.     start_phase1
  146.     # 主循环
  147.     loop do
  148.       # 刷新游戏画面
  149.       Graphics.update
  150.       # 刷新输入信息
  151.       Input.update
  152.       # 刷新画面
  153.       update
  154.       # 如果画面切换的话就中断循环
  155.       if $scene != self
  156.         break
  157.       end
  158.     end
  159.     # 刷新地图
  160.     $game_map.refresh
  161.     # 准备过渡
  162.     Graphics.freeze
  163.     # 释放窗口
  164.     @actor_command_window.dispose
  165.     @party_command_window.dispose
  166.     @help_window.dispose
  167.     @status_window.dispose
  168.     @message_window.dispose
  169.     if @skill_window != nil
  170.       @skill_window.dispose
  171.     end
  172.     if @item_window != nil
  173.       @item_window.dispose
  174.     end
  175.     if @result_window != nil
  176.       @result_window.dispose
  177.     end
  178.     # 释放活动块
  179.     @spriteset.dispose
  180.     # 标题画面切换中的情况
  181.     if $scene.is_a?(Scene_Title)
  182.       # 淡入淡出画面
  183.       Graphics.transition
  184.       Graphics.freeze
  185.     end
  186.     # 战斗测试或者游戏结束以外的画面切换中的情况
  187.     if $BTEST and not $scene.is_a?(Scene_Gameover)
  188.       $scene = nil
  189.     end
  190.   end
  191. end

作者: chd114    时间: 2018-3-12 21:54
本帖最后由 chd114 于 2018-3-12 21:57 编辑

这种情况去找Window_Battlecommand的父类Window_Selectable
子类不特别修改的东西是继承父类的设定
设置光标位置


刷新光标矩形的部分
刷新光标位置update_cursor_rect

然后根据选项编号index自定义光标的坐标和尺寸就好了
但是最好不要用太奇怪的图形,否则加新选项或者删选项以后坐标你还得改,会非常麻烦
作者: 文雅夕露    时间: 2018-3-12 22:47
chd114 发表于 2018-3-12 21:54
这种情况去找Window_Battlecommand的父类Window_Selectable
子类不特别修改的东西是继承父类的设定
[fold= ...

@back_sprite = Sprite.new
@back_sprite.bitmap = RPG::Cache.picture("魔导阵")
该精灵不能镶嵌到@actor_command_window。
就是当该窗口活动时才显示该精灵,并且精灵位置是跟窗口位置而定。
该怎么设置?
作者: chd114    时间: 2018-3-12 23:09
文雅夕露 发表于 2018-3-12 22:47
@back_sprite = Sprite.new
@back_sprite.bitmap = RPG::Cache.picture("魔导阵")
该精灵不能镶嵌到@acto ...

那就要把绝对位置改成相对位置,先确定窗口的范围,然后坐标按窗口范围做调整

这个相对位置和绝对位置的区别这样解释吧
2+2=4
x=2的情况下x+2=4
但是x不确定的情况下就不一定x+2=4
前面的2+2是绝对的,x+2是一个相对的
你要改的坐标应该是一个按照窗口的位置和选项index做各种运算而不是直接写一个数

默认脚本里x = @index % @column_max * (cursor_width + 32)
的光标x就是选项编号和每行选项相除后的余数再乘光标宽度和32的和
作者: 芯☆淡茹水    时间: 2018-3-13 07:45
文雅夕露 发表于 2018-3-12 22:47
@back_sprite = Sprite.new
@back_sprite.bitmap = RPG::Cache.picture("魔导阵")
该精灵不能镶嵌到@acto ...

def update
  @back_sprite.visible = @actor_command_window.visible
  if @back_sprite.visible
    @back_sprite.x = @actor_command_window.x
    @back_sprite.y = @actor_command_window.y
  end
  .
  .
  .
end
作者: 芯☆淡茹水    时间: 2018-3-13 21:00
本帖最后由 芯☆淡茹水 于 2018-3-13 21:04 编辑

唔~,才看见你写在选项窗口里

def update
  @back_sprite.visible = self.visible
   if @back_sprite.visible
     @back_sprite.x = self.x
     @back_sprite.y = self.y
   end
.
.
.
end
作者: 文雅夕露    时间: 2018-3-13 21:23
芯☆淡茹水 发表于 2018-3-13 21:00
唔~,才看见你写在选项窗口里

def update


之前的报错问题:

没有nil报错的问题了...
但是也没有将精灵关联到@actor_command_window窗口里。
难道是我写的位置出问题?!




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