查看: 2524|回复: 13

[已经解决] 如何用commands来判断或控制光标的大小及位置?

[复制链接]
梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
回帖
1074
发表于 2018-3-12 21:34:58 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 文雅夕露 于 2018-3-12 21:37 编辑

360截图20180312212931296.png
如上图:
我想把选项自定义摆放的说...
然而光标的位置和大小不会跟着选项摆放的位置而调整。
导致很多问题的产生。
请问该怎么做才能判断或控制光标的大小及位置?
脚本一览:
[pre lang="ruby"]#==============================================================================
# ■ Window_Battlecommand
#------------------------------------------------------------------------------
#   战斗的命令选择行窗口。
#==============================================================================

class Window_Battlecommand < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     width    : 窗口的宽
  #     commands : 命令字符串序列
  #--------------------------------------------------------------------------
  def initialize(width, commands)
    # 由命令的个数计算出窗口的高
    super(0, 0, width, commands.size * 32) #+ 32
    @item_max = commands.size
    @commands = commands
    @command_icons = [
    "攻击",
    "技能",
    "防御",
    "道具"
    ]
   # self.windowskin = RPG::Cache.windowskin("")
    self.contents = Bitmap.new(width - 32, @item_max * 32)
    self.opacity = 0
    @back_sprite = Sprite.new
    @back_sprite.bitmap = RPG::Cache.picture("魔导阵")
    @back_sprite.ox = @back_sprite.bitmap.width / 2
    @back_sprite.oy = @back_sprite.bitmap.height / 2
    @back_sprite.x = self.x + 376
    @back_sprite.y = self.y + 92
    @back_sprite.z = 9999
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    super
    @back_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @commands.each_with_index do |command, i|
    draw_item(command, i)
  end
end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  alias magic_update update
  def update
  magic_update
  @back_sprite.angle -= 2
end
  #--------------------------------------------------------------------------
  # ● 描绘项目
  #     commands : 项目
  #     i : 序号,从0开始
  #--------------------------------------------------------------------------
  def draw_item(command, i)
    file = @command_icons
    if file == nil
    bitmap = Bitmap.new(24,24)
  else
    bitmap = RPG::Cache.icon(@command_icons)
  end
  if i == 0
  self.contents.blt(4+40, i*32 + 4 , bitmap , Rect.new(0,0,24,24))
  self.contents.draw_text(4+64, i*32 , width - 32 - 36 , 32 , command)
elsif i == 1
  self.contents.blt(4+4, i*32 + 4 , bitmap , Rect.new(0,0,24,24))
  self.contents.draw_text(4+24+4, i*32 , width - 32 - 36 , 32 , command)
elsif i == 2
  self.contents.blt(4+64+16, (i-1)*32 + 4 , bitmap , Rect.new(0,0,24,24))
  self.contents.draw_text(4+64+24+16, (i-1)*32 , width - 32 - 36 , 32 , command)
elsif i == 3
  self.contents.blt(4+40, (i-1)*32 + 4 , bitmap , Rect.new(0,0,24,24))
  self.contents.draw_text(4+64, (i-1)*32 , width - 32 - 36 , 32 , command)
# self.contents.blt(4, i*32 + 4 , bitmap , Rect.new(0,0,24,24))
# self.contents.draw_text(4+32, i*32 , width - 32 - 36 , 32 , command)
end
end
end

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 初始化战斗用的各种暂时数据
    $game_temp.in_battle = true
    $game_temp.battle_turn = 0
    $game_temp.battle_event_flags.clear
    $game_temp.battle_abort = false
    $game_temp.battle_main_phase = false
    $game_temp.battleback_name = $game_map.battleback_name
    $game_temp.forcing_battler = nil
    # 初始化战斗用事件解释器
    $game_system.battle_interpreter.setup(nil, 0)
    # 准备队伍
    @troop_id = $game_temp.battle_troop_id
    $game_troop.setup(@troop_id)
    # 生成角色命令窗口
    s1 = $data_system.words.attack
    s2 = $data_system.words.skill
    s3 = $data_system.words.guard
    s4 = $data_system.words.item
    if $game_switches[6]
    @actor_command_window = Window_Battlecommand.new(224, [s1, s2, s3, s4])
    @actor_command_window.z = 9999
    else
    @actor_command_window = Window_Command.new(160, [s1, s2, s3, s4])
    end
     
    #
    @actor_command_window.y = 160
    @actor_command_window.back_opacity = 160
    @actor_command_window.active = false
    @actor_command_window.visible = false
    # 生成其它窗口
    @party_command_window = Window_PartyCommand.new
    @help_window = Window_Help.new
    @help_window.back_opacity = 160
    @help_window.visible = false
    @status_window = Window_BattleStatus.new
    @message_window = Window_Message.new
    # 生成活动块
    @spriteset = Spriteset_Battle.new
    # 初始化等待计数
    @wait_count = 0
    # 执行过渡
    if $data_system.battle_transition == ""
      Graphics.transition(20)
    else
      Graphics.transition(40, "Graphics/Transitions/" +
        $data_system.battle_transition)
    end
    # 开始自由战斗回合
    start_phase1
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 刷新地图
    $game_map.refresh
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @actor_command_window.dispose
    @party_command_window.dispose
    @help_window.dispose
    @status_window.dispose
    @message_window.dispose
    if @skill_window != nil
      @skill_window.dispose
    end
    if @item_window != nil
      @item_window.dispose
    end
    if @result_window != nil
      @result_window.dispose
    end
    # 释放活动块
    @spriteset.dispose
    # 标题画面切换中的情况
    if $scene.is_a?(Scene_Title)
      # 淡入淡出画面
      Graphics.transition
      Graphics.freeze
    end
    # 战斗测试或者游戏结束以外的画面切换中的情况
    if $BTEST and not $scene.is_a?(Scene_Gameover)
      $scene = nil
    end
  end
end[/pre]
一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。
梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2018-3-12 21:54:55 | 显示全部楼层
本帖最后由 chd114 于 2018-3-12 21:57 编辑

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

  1.   #--------------------------------------------------------------------------
  2.   # ● 设置光标的位置
  3.   #     index : 新的光标位置
  4.   #--------------------------------------------------------------------------
  5.   def index=(index)
  6.     @index = index
  7.     # 刷新帮助文本 (update_help 定义了继承目标)
  8.     if self.active and @help_window != nil
  9.       update_help
  10.     end
  11.     # 刷新光标矩形
  12.     update_cursor_rect
  13.   end
复制代码
[/fold]

刷新光标矩形的部分
[fold=刷新光标位置update_cursor_rect]
  1. #--------------------------------------------------------------------------
  2.   # ● 更新光标举行
  3.   #--------------------------------------------------------------------------
  4.   def update_cursor_rect
  5.     # 光标位置不满 0 的情况下
  6.     if @index < 0
  7.       self.cursor_rect.empty
  8.       return
  9.     end
  10.     # 获取当前的行
  11.     row = @index / @column_max
  12.     # 当前行被显示开头行前面的情况下
  13.     if row < self.top_row
  14.       # 从当前行向开头行滚动
  15.       self.top_row = row
  16.     end
  17.     # 当前行被显示末尾行之后的情况下
  18.     if row > self.top_row + (self.page_row_max - 1)
  19.       # 从当前行向末尾滚动
  20.       self.top_row = row - (self.page_row_max - 1)
  21.     end
  22.     # 计算光标的宽
  23.     cursor_width = self.width / @column_max - 32
  24.     # 计算光标坐标ABP-138,IPZ-410,KIL-044
  25.     x = @index % @column_max * (cursor_width + 32)
  26.     y = @index / @column_max * 32 - self.oy
  27.     # 更新国标矩形
  28.     self.cursor_rect.set(x, y, cursor_width, 32)
  29.   end
复制代码
[/fold]
然后根据选项编号index自定义光标的坐标和尺寸就好了
但是最好不要用太奇怪的图形,否则加新选项或者删选项以后坐标你还得改,会非常麻烦

点评

有问题直接发  发表于 2018-3-12 22:38
已经实现,谢前辈。不过还有个题外的问题...  发表于 2018-3-12 22:37
子类再定义啊  发表于 2018-3-12 22:15
这么做确定不会修改其他界面的光标大小么...  发表于 2018-3-12 22:12

评分

参与人数 1星屑 +80 赞 +1 收起 理由
RyanBern + 80 + 1 认可答案

查看全部评分

[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
回帖
1074
 楼主| 发表于 2018-3-12 22:47:58 | 显示全部楼层
chd114 发表于 2018-3-12 21:54
这种情况去找Window_Battlecommand的父类Window_Selectable
子类不特别修改的东西是继承父类的设定
[fold= ...

@back_sprite = Sprite.new
@back_sprite.bitmap = RPG::Cache.picture("魔导阵")
该精灵不能镶嵌到@actor_command_window。
就是当该窗口活动时才显示该精灵,并且精灵位置是跟窗口位置而定。
该怎么设置?
一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2018-3-12 23:09:30 | 显示全部楼层
文雅夕露 发表于 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的和
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2018-3-13 07:45:40 | 显示全部楼层
文雅夕露 发表于 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

点评

测试发现。@back_sprite.visible = nil 是什么问题呢...  发表于 2018-3-13 20:42

评分

参与人数 1星屑 +80 赞 +1 收起 理由
RyanBern + 80 + 1 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
34459
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2018-3-13 21:00:10 | 显示全部楼层
本帖最后由 芯☆淡茹水 于 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

评分

参与人数 1赞 +1 收起 理由
文雅夕露 + 1 谢谢

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
回帖
1074
 楼主| 发表于 2018-3-13 21:23:28 | 显示全部楼层
芯☆淡茹水 发表于 2018-3-13 21:00
唔~,才看见你写在选项窗口里

def update


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

点评

好的,感谢芯前辈的帮助和指导。  发表于 2018-3-13 21:42
你主楼的背景是写在 选项窗口 里的,所以还是加在 选项窗口里。  发表于 2018-3-13 21:30
一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部