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

Project1

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

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
帖子
1231
跳转到指定楼层
1
发表于 2018-3-12 21:34:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 文雅夕露 于 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
一个只会简单事件的Rm新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

2
发表于 2018-3-12 21:54:55 | 只看该作者
本帖最后由 chd114 于 2018-3-12 21:57 编辑

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


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

然后根据选项编号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
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
帖子
1231
3
 楼主| 发表于 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新人,脚本完全不懂。只求做个简单的游戏完成自己的游戏之梦而已。
第一个游戏已经完成,等待各素材的完成和测试。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

4
发表于 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
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33481
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

5
发表于 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 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33481
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

6
发表于 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 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
8498
在线时间
775 小时
注册时间
2017-11-10
帖子
1231
7
 楼主| 发表于 2018-3-13 21:23:28 | 只看该作者
芯☆淡茹水 发表于 2018-3-13 21:00
唔~,才看见你写在选项窗口里

def update


之前的报错问题:

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

点评

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-25 21:10

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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