查看: 4976|回复: 29

[已经解决] 自己的窗口脚本请教(标题不知道怎样更专业一点)

[复制链接]
梦石
0
星屑
4017
在线时间
604 小时
注册时间
2017-4-21
回帖
177
发表于 2019-3-6 14:28:24 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 阮声悠悠 于 2019-3-7 23:33 编辑

找到了一个更合适的解决方案,所以对我来说这张帖子的问题已经不重要了。


这是一个罗列道具的脚本。罗列的数组在88行
我希望窗口的第一行罗列物品ID为  1,    2,    3  的图标和名称
但是我只能描绘出数组的第一个,第二个和第三个不知道怎样才能描绘出来……
这是第一个想请教的……

然后,bitmap = RPG::Cache.icon($data_items[@data[index][0]].icon_name)
这句脚本是显示物品的图标,但我不知道怎样让这个图标变成灰色,或者说半透明(也就是未获得这个道具时候的状态)
这是第二个想请教的……


[pre lang="ruby"]#$scene = Scene_xgqBhuoZhuoTuJian.new打开脚本


class Scene_xgqBhuoZhuoTuJian
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    screen = Spriteset_Map.new
    # 生成窗口
    @tujian_window = Window_BhuoZhuoTuJian.new
    @tujian_window.z=1000
    # 生成目标窗口 (设置为不可见・不活动)
    @target_window = Window_Target.new
    @target_window.visible = false
    @target_window.active = false
    @target_window.z=1896
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    screen.dispose
    @tujian_window.dispose
    @target_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @tujian_window.update
    @target_window.update
    # 图鉴窗口被激活的情况下: 调用 update_tujian
    if @tujian_window.active
      update_tujian
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (特技窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_tujian
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换到地图
      $scene = Scene_Map.new
      return
    end
  end
end



class Window_BhuoZhuoTuJian < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 640, 480)
    @column_max = 1
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = [
    [   1,    2,    3,    0,    0],#第一行出现的物品ID,如有有0就不出现
    [   4,    5,    6,    0,    0],
    [   7,    8,    9,    0,    0],
    [   58,   59,   0,    0,    0],
    [   115,  0,    0,    0,    0],
    [   236,  237,  106,  107,  0]
   
    ]
    # 如果项目数不是 0 就生成位图、重新描绘全部项目
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 描绘项目
  #     index : 项目编号
  #--------------------------------------------------------------------------
  def draw_item(index)
    skill = @data[index]
    self.contents.font.color = normal_color
    x = 4
    y = index * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon($data_items[@data[index][0]].icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 204, 32, $data_items[@data[index][0]].name, 0)
  end
end
[/pre]
梦石
0
星屑
14720
在线时间
2175 小时
注册时间
2016-9-20
回帖
777
发表于 2019-3-6 14:42:30 | 显示全部楼层
本帖最后由 ppspssss 于 2019-3-6 14:44 编辑

不是[index][0] 那个 0改了1或以上就是第几个了么, 至于透明應該是改opacity
还有我QQ為什么被你突然拉黑了又不說原因,  这个問題困扰我很多天
贴子只供参考我贴子内容有很多只是我自己标识的内容代指不是原来意思,偏向发贴当时的想法(后来回看贴发现有很多错误,会造成误导 ),如果想靠谱点应 找相关正确的文章   -- 2025/4/19
回复

使用道具 举报

梦石
0
星屑
4017
在线时间
604 小时
注册时间
2017-4-21
回帖
177
 楼主| 发表于 2019-3-6 15:13:23 | 显示全部楼层
ppspssss 发表于 2019-3-6 14:42
不是[0] 那个 0改了1或以上就是第几个了么, 至于透明應該是改opacity
还有我QQ為什么被你突然拉黑了又不說 ...

QQ的话只有一个好友感觉怪怪的,就删除了,看起来整洁一点。
话说,删除QQ还要征求对方同意?再加上你和我没有任何交情

至于0改成1就能解决问题……
我有个不成熟的小建议,你再读一下这张帖子,重新寻找帖子中的疑问。

点评

总之隨便給个理由再刪,比如我煩,我睿智之类的  发表于 2019-3-6 16:55
是我的错  发表于 2019-3-6 16:47
回复

使用道具 举报

梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2019-3-6 15:50:11 | 显示全部楼层
XP的脚本结构本来就不太好,再不认真研究就自己瞎搞的话谁也帮不了你。
把你的窗口重新写了一遍。

[pre lang="ruby"]
class Window_BhuoZhuoTuJian < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 640, 480)
    @column_max = 3  ##
    self.index = 0
    init_data
    refresh
  end
  
  def init_data
    @data = [
       1,    2,    3,#第一行出现的物品ID,如有有0就不出现
       4,    5,    6,
       7,    8,    9,
       58,   59,   0,
       115,  0,    0,
       236,  237,  106,  107,  0
    ]
    @item_max = @data.size
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    if self.contents
      self.contents.clear
    else
      self.contents = Bitmap.new(width - 32, @item_max * 32)
    end
    @item_max.times{|i| draw_item(i)}
  end
  #--------------------------------------------------------------------------
  # ● 描绘项目
  #     index : 项目编号
  #--------------------------------------------------------------------------
  def draw_item(index)
    x = index % @column_max * (self.cursor_rect.width + 32)
    y = index / @column_max * 32
    if (id = @data[index]) > 0
      bitmap = RPG::Cache.icon($data_items[id].icon_name)
      self.contents.blt(x, y + 4, bitmap, bitmap.rect)
      self.contents.draw_text(x + 28, y, 204, 32, $data_items[id].name)
    end
  end
end[/pre]

QQ截图20190306154725.png

提醒你几点,想一下下面几个问题
@column_max是什么,@data数组套数组能改变列数吗?
self.contents是什么,有必要每次refresh生成新对象吗?
用头画头像,用脚写脚本
回复

使用道具 举报

梦石
0
星屑
4017
在线时间
604 小时
注册时间
2017-4-21
回帖
177
 楼主| 发表于 2019-3-6 16:13:35 | 显示全部楼层
KB.Driver 发表于 2019-3-6 15:50
XP的脚本结构本来就不太好,再不认真研究就自己瞎搞的话谁也帮不了你。
把你的窗口重新写了一遍。

啊哈哈哈,抱歉,学习了,我现在对脚本还在依葫芦画瓢的阶段,我正在尝试模仿着写一些简单的脚本。

这样修改的话是一行有3列。
我想要第一行光标包含了:回复剂、超回复剂、完全恢复剂,(配图最后一行的效果)
然后第二行第三行又不一样,例如配图,第四行和第五行的出现的物品个数不同,最多一行只会出现4个
154639a2tjemj8l6cma9fe.png

点评

灰度是不是#@a.tone = Tone.new(255, 255, 255, 128)#精灵色調#不是lone hue  发表于 2019-3-6 18:19
想知道bitmap = RPG::Cache.icon($data_items[@data[index][0]].icon_name)有没有办法改变灰度,就像文字的无效文字色一样。。。  发表于 2019-3-6 16:59
如果一定要用现有的脚本实现,就只有在Scene里放好几个窗口,每个窗口的列数不同。  发表于 2019-3-6 16:16
按照RM现有的脚本没有办法一个窗口不同行的列数不同,想要那样的效果只有你自己写了。  发表于 2019-3-6 16:15
回复

使用道具 举报

梦石
0
星屑
4017
在线时间
604 小时
注册时间
2017-4-21
回帖
177
 楼主| 发表于 2019-3-6 16:37:05 | 显示全部楼层
KB.Driver 发表于 2019-3-6 15:50
XP的脚本结构本来就不太好,再不认真研究就自己瞎搞的话谁也帮不了你。
把你的窗口重新写了一遍。

貌似可以一行出现不同个数,因为实际上还是一列……
  1. #$scene = Scene_xgqBhuoZhuoTuJian.new打开脚本


  2. class Scene_xgqBhuoZhuoTuJian
  3.   #--------------------------------------------------------------------------
  4.   # ● 主处理
  5.   #--------------------------------------------------------------------------
  6.   def main
  7.     screen = Spriteset_Map.new
  8.     # 生成窗口
  9.     @tujian_window = Window_BhuoZhuoTuJian.new
  10.     @tujian_window.z=1000
  11.     # 生成目标窗口 (设置为不可见・不活动)
  12.     @target_window = Window_Target.new
  13.     @target_window.visible = false
  14.     @target_window.active = false
  15.     @target_window.z=1896
  16.     # 执行过渡
  17.     Graphics.transition
  18.     # 主循环
  19.     loop do
  20.       # 刷新游戏画面
  21.       Graphics.update
  22.       # 刷新输入信息
  23.       Input.update
  24.       # 刷新画面
  25.       update
  26.       # 如果画面切换的话就中断循环
  27.       if $scene != self
  28.         break
  29.       end
  30.     end
  31.     # 准备过渡
  32.     Graphics.freeze
  33.     # 释放窗口
  34.     screen.dispose
  35.     @tujian_window.dispose
  36.     @target_window.dispose
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 刷新画面
  40.   #--------------------------------------------------------------------------
  41.   def update
  42.     # 刷新窗口
  43.     @tujian_window.update
  44.     @target_window.update
  45.     # 图鉴窗口被激活的情况下: 调用 update_tujian
  46.     if @tujian_window.active
  47.       update_tujian
  48.       return
  49.     end
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # ● 刷新画面 (特技窗口被激活的情况下)
  53.   #--------------------------------------------------------------------------
  54.   def update_tujian
  55.     # 按下 B 键的情况下
  56.     if Input.trigger?(Input::B)
  57.       # 演奏取消 SE
  58.       $game_system.se_play($data_system.cancel_se)
  59.       # 切换到地图
  60.       $scene = Scene_Map.new
  61.       return
  62.     end
  63.   end
  64. end



  65. class Window_BhuoZhuoTuJian < Window_Selectable
  66.   #--------------------------------------------------------------------------
  67.   # ● 初始化对像
  68.   #--------------------------------------------------------------------------
  69.   def initialize
  70.     super(0, 0, 640, 480)
  71.     @column_max = 1
  72.     refresh
  73.     self.index = 0
  74.   end
  75.   #--------------------------------------------------------------------------
  76.   # ● 刷新
  77.   #--------------------------------------------------------------------------
  78.   def refresh
  79.     @data = [
  80.     [   1,    2,    3,    0,    0],#第一行出现的物品ID,如有有0就不出现
  81.     [   4,    5,    6,    0,    0],
  82.     [   7,    8,    9,    0,    0],
  83.     [   58,   59,   0,    0,    0],
  84.     [   115,  0,    0,    0,    0],
  85.     [   236,  237,  106,  107,  0],
  86.     [   789,  790,  791,  792,  0]

  87.     ]
  88.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
  89.     @item_max = @data.size
  90.     if @item_max > 0
  91.       self.contents = Bitmap.new(width - 32, row_max * 32)
  92.       for i in 0...@item_max
  93.         draw_item(i)
  94.         draw_itemer(i)
  95.         draw_itemsan(i)
  96.         draw_itemsi(i)
  97.       end
  98.     end
  99.   end
  100.   #--------------------------------------------------------------------------
  101.   # ● 描绘项目
  102.   #     index : 项目编号
  103.   #--------------------------------------------------------------------------
  104.   def draw_item(index)
  105.     skill = @data[index]
  106.     x = 4
  107.     y = index * 32
  108.     bitmap = RPG::Cache.icon($data_items[@data[index][0]].icon_name)
  109.     self.contents.blt(x, y + 4, bitmap, bitmap.rect)
  110.     self.contents.draw_text(x + 28, y, 204, 32, $data_items[@data[index][0]].name, 0)
  111.   end
  112.   def draw_itemer(index)
  113. if @data[index][1] != 0
  114.     skill = @data[index]
  115.     x = 152
  116.     y = index * 32
  117.     bitmap = RPG::Cache.icon($data_items[@data[index][1]].icon_name)
  118.     self.contents.blt(x, y + 4, bitmap, bitmap.rect)
  119.     self.contents.draw_text(x + 28, y, 204, 32, $data_items[@data[index][1]].name, 0)
  120. end
  121.   end
  122.   def draw_itemsan(index)
  123. if @data[index][2] != 0
  124.     skill = @data[index]
  125.     x = 304
  126.     y = index * 32
  127.     bitmap = RPG::Cache.icon($data_items[@data[index][2]].icon_name)
  128.     self.contents.blt(x, y + 4, bitmap, bitmap.rect)
  129.     self.contents.draw_text(x + 28, y, 204, 32, $data_items[@data[index][2]].name, 0)
  130. end
  131.   end
  132.   def draw_itemsi(index)
  133. if @data[index][3] != 0
  134.     skill = @data[index]
  135.     x = 462
  136.     y = index * 32
  137.     bitmap = RPG::Cache.icon($data_items[@data[index][3]].icon_name)
  138.     self.contents.blt(x, y + 4, bitmap, bitmap.rect)
  139.     self.contents.draw_text(x + 28, y, 204, 32, $data_items[@data[index][3]].name, 0)
  140. end
  141.   end
  142. end
复制代码

点评

不对, 这样做一样会被update刷新掉, 要改光标的UPDATE才可以  发表于 2019-3-6 19:10
既然都手动区分道具数量了, 那就干脆顺便手动调整光标大小就好了 self.cursor_rect.set(x,y,width,height) 加上这句试试, 括号里参数自己填  发表于 2019-3-6 19:04
不过,就是感觉怪怪的。因为只有一个物品的情况下也会拉到最长。  发表于 2019-3-6 18:22
好吧,效果达到了就行了。  发表于 2019-3-6 18:20
对啊,就是想要这样的效果……  发表于 2019-3-6 18:15
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2019-3-6 19:14:13 | 显示全部楼层
def update_cursor_rect
   if @data[self.index][3] != 0
       self.cursor_rect.set(x,y,width,height)
   elsif @data[self.index][2] != 0
       self.cursor_rect.set(x,y,width,height)
   elsif @data[self.index][1] != 0
       self.cursor_rect.set(x,y,width,height)
  else
      self.cursor_rect.set(x,y,width,height)
  end
end

这里也根据道具数量手动画吧XD
回复

使用道具 举报

梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2019-3-6 19:21:39 | 显示全部楼层
灯笼菜刀王 发表于 2019-3-6 19:14
def update_cursor_rect
   if @data[self.index][3] != 0
       self.cursor_rect.set(x,y,width,height) ...

说实在的,弄这么麻烦还不如不显示光标,输入只用来做上下翻页用(

点评

翻頁好像在Window_Selectable里有 page_row_max你看看是不是  发表于 2019-3-6 21:59
类似物品的图鉴吧  发表于 2019-3-6 19:41
哈哈,好像挺有道理的。可以教一下上下翻页的......  发表于 2019-3-6 19:41
我也不知道,但是看到这个代码实在是非常的不优雅……  发表于 2019-3-6 19:29
其实我不知道楼主要干嘛用, XD  发表于 2019-3-6 19:27
用头画头像,用脚写脚本
回复

使用道具 举报

梦石
0
星屑
478
在线时间
71 小时
注册时间
2019-3-6
回帖
14
发表于 2019-3-7 23:27:46 | 显示全部楼层
参考Window_Item,里面@column_max就是列数,更改这个值就可以了
回复

使用道具 举报

梦石
0
星屑
478
在线时间
71 小时
注册时间
2019-3-6
回帖
14
发表于 2019-3-7 23:38:14 | 显示全部楼层
QQ截图20190307233126.png 另外你想要的是不是大概就是这种效果?
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部