Project1

标题: [已解决]脚本里面如何显示文章,提示此类物品满了。 [打印本页]

作者: miantouchi    时间: 2020-9-27 18:41
标题: [已解决]脚本里面如何显示文章,提示此类物品满了。
本帖最后由 miantouchi 于 2020-10-1 20:09 编辑

我想把每个物品、武器、防具、设置个物品携带上限。
例如设置上限为10个,当超出这个就会提示,背包满了类似这个字样。
于是我在gain_item里面加了个判断并且用$game_temp.message_text,但是没有什么反应
不知道怎么弄了
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 增加物品 (减少)
  3.   #     item_id : 物品 ID
  4.   #     n       : 个数
  5.   #--------------------------------------------------------------------------
  6.   def gain_item(item_id, n)
  7.     # 更新 hash 的个数数据
  8.     if item_id > 0
  9.       $game_temp.message_text = "背包已满!" if item_number(item_id) + n > 10
  10.       @items[item_id] = [[item_number(item_id) + n, 0].max, 10].min
  11.     end
  12.   end

作者: 真·可乐    时间: 2020-9-27 20:19
想直接调出对话窗口显示背包已满的话,这样做是远远不够的,不如自己新写个窗口提示背包已满。
作者: 灯笼菜刀王    时间: 2020-9-28 12:01
本帖最后由 灯笼菜刀王 于 2020-9-28 12:05 编辑

没事别想着折腾对话窗口, 咱以前不是和你说了,它属于中BOSS级别的,要调用它可没那么简单,笑

只要显示个文字窗口而已, 直接写就好啦

栗子:
  #--------------------------------------------------------------------------
  # ● 增加物品 (减少)
  #     item_id : 物品 ID
  #     n       : 个数
  #--------------------------------------------------------------------------
  def gain_item(item_id, n)
    # 更新 hash 的个数数据
    if item_id > 0
      max("#{$data_items[item_id].name}已满")if item_number(item_id) + n >= 10
      @items[item_id] = [[item_number(item_id) + n, 0].max,10].min
    end
  end
  
  def max(str)
    a = Window_Base.new(220,208,200,64)
    a.contents = Bitmap.new(168,32)
    a.contents.draw_text(0,0,168,32,str,1)
    w = 510
    loop do
      a.opacity = w
      a.contents_opacity = w
      w -= 12
      if w <= 0
        a.dispose
        break
      end
      Graphics.update
    end
  end
作者: soulsaga    时间: 2020-9-28 13:03
用公共事件....
作者: miantouchi    时间: 2020-9-28 15:10
灯笼菜刀王 发表于 2020-9-28 12:01
没事别想着折腾对话窗口, 咱以前不是和你说了,它属于中BOSS级别的,要调用它可没那么简单,笑

只要显示个文 ...

不知道怎么回事还报错

mmexport1601276956831.png (27.17 KB, 下载次数: 7)

mmexport1601276956831.png

mmexport1601276959948.png (55.65 KB, 下载次数: 7)

mmexport1601276959948.png

作者: miantouchi    时间: 2020-9-28 22:47
本帖最后由 miantouchi 于 2020-9-28 22:50 编辑
灯笼菜刀王 发表于 2020-9-28 12:01
没事别想着折腾对话窗口, 咱以前不是和你说了,它属于中BOSS级别的,要调用它可没那么简单,笑

只要显示个文 ...


不过离目标效果还有2个问题
1。个是在商店买东西,如果出现此类物品买满了会,买东西窗口会出现黑底,等到满了提示完事后才恢复正常。

2。如果人物身上携带10个药水,上限也是10个,这时打开宝箱后提示满了,
,人物还可以再次获得,比如扔1瓶,或者角色用了1瓶,等玩家有空缺时候还可以继续获得。
类似下面gif动画那种效果。

我尝试用$game_party.item_number(编号),这样写,编号只能写死了,什么物品就改什么物品编号,
另外我这么做舍弃了你绘制的物品满了对话框,又用上了显示文章
不太会这个地方。


1.png (58.45 KB, 下载次数: 6)

1.png

2.png (89.64 KB, 下载次数: 6)

2.png

3.png (47.6 KB, 下载次数: 6)

3.png

1.gif (196.61 KB, 下载次数: 5)

1.gif

4.png (49.83 KB, 下载次数: 4)

4.png

作者: soulsaga    时间: 2020-9-28 23:25
miantouchi 发表于 2020-9-28 22:47
不过离目标效果还有2个问题
1。个是在商店买东西,如果出现此类物品买满了会,买东西窗口会出现黑底,等 ...

你在脚本那写个获得宝箱物品满了就打开开关
到宝箱事件开关打开时显示已满,然后关掉开关...
作者: 灯笼菜刀王    时间: 2020-9-29 11:51
本帖最后由 灯笼菜刀王 于 2020-9-29 12:03 编辑

1,因为我是用单独刷新窗口的方式, 调用max后就自己循环刷新40帧左右, 导致原本应该瞬间执行完毕的gain_item产生了时间差,它下面的Window.refresh延后执行自然你就看到黑底了,笑

解决方法, 让它和主main一起刷新即可, 具体方法以前有让你实验过(说明窗口UPDATE的时候,用全局变量实现跨scene刷新), 自己思考下吧

2,用你最后一张图的方法就可以了呗,事件处理最绿色了, 不过判定要改成 持有数 + 获得数 < 上限 才符合逻辑
至于想省事可以对list下手, 笑, 给你个栗子吧

  1. class Interpreter
  2.   def 塞得下?
  3.     a = false
  4.     for i in @list
  5.       if i.code == 126
  6.         value = operate_value(i.parameters[1],i.parameters[2],i.parameters[3])
  7.         a |= ($game_party.item_number(i.parameters[0]) + value > 10)
  8.         next
  9.       end
  10.       if i.code == 127
  11.         value = operate_value(i.parameters[1],i.parameters[2],i.parameters[3])
  12.         a |= ($game_party.weapon_number(i.parameters[0]) + value > 10)
  13.         next
  14.       end
  15.       if i.code == 128
  16.         value = operate_value(i.parameters[1],i.parameters[2],i.parameters[3])
  17.         a |= ($game_party.armor_number(i.parameters[0]) + value > 10)
  18.         next
  19.       end
  20.     end
  21.     return !a
  22.   end
  23. end
复制代码


把这个脚本插到 Interpreter 类下面main 上面

然后去  条件分歧-脚本:塞得下?    就可以得到你要的判断了, 且支持复数道具/武器/防具的判断

PS:没测试哦
作者: 灯笼菜刀王    时间: 2020-10-2 00:14
本帖最后由 灯笼菜刀王 于 2020-10-2 00:22 编辑

用全局变量来实现刷新,简单做法就是这样

$www.update if $www != nil

把这句塞到所有 scene 类的主UPDATE里

然后写个带自动释放的窗口

class Win_popup < Window_Base
  def initialize(str)
    super(220,208,200,64)
    self.contents = Bitmap.new(168,32)
    self.contents.draw_text(0,0,168,32,str,1)
    @w = 510
  end
  def update
    self.opacity = @w
    self.contents_opacity = @w
    @w -= 12
    if @w <= 0
      $www.dispose
      $www = nil

    end
  end
end

然后,在需要的地方给全局变量赋值  $www = Win_popup.new("天下无敌")  就行了, 因为你所有scene里都有它的 update 所以不管哪里调用都一样可以继续刷新, 就不存在卡进程的问题咯


像这样, 经过三个scene都一样继续刷新




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