Project1

标题: 【背包系统】的【背包容量0/0】解决办法 [打印本页]

作者: andrewlisty    时间: 2010-6-24 23:25
标题: 【背包系统】的【背包容量0/0】解决办法
本帖最后由 andrewlisty 于 2010-6-24 23:27 编辑

大家好我是新人,这是我第一个帖子
由于不是很懂这里的规矩,所以如果有什么错误请多多指教,谢谢!

我先发下背包系统原文吧

原文转自http://myyxs.5d6d.com/thread-333-1-1.html
所谓背包系统,就是将VX原本的物品系统强化,增加限制物品种类,丢弃物品,物品过多时移动速度降低等功能。

使用方法:
1.复制脚本插入main前。
2.最大物品种数是IM号变量的值,IM在脚本中定义。
3.价格为0的物品认定为任务物品,不可丢弃。
4.物品超限时移动速度降低为2,可在脚本中定义。

注意:
1.物品名称超过7个字时会发生字体重叠。
2.物品种类超过999个时会发生字体重叠。
3.最大种数超过999个时其数量将不能完全显示。

范例工程:  (DeathKing制作)



↑ 红色的9表示现在的物品种数已经超限了,背包被塞满了。



↑ 主角因为背包被塞满而不得不以龟速移动……

  1. .
  2. #==============================================================================
  3. # ■ 背包系统 —— by 水镜风生
  4. #------------------------------------------------------------------------------
  5. LOSE_ITEM_SE_NAME = "Evasion"         # 丢弃物品时播放的SE
  6. LOW_SPEED = 2                         # 背包塞满时的移动速度
  7. USUAL_SPEED = 4                       # 平时的移动速度
  8. WARING_STRING = "背包放的东西太多了。"  # 超重时的提示
  9. IM = 1                                # IM号系统变量决定物品种类的最大值
  10. #==============================================================================
  11. # ■ Scene_Item
  12. #------------------------------------------------------------------------------
  13. #  处理物品画面的类。
  14. #==============================================================================
  15. class Scene_Item < Scene_Base
  16.   #--------------------------------------------------------------------------
  17.   # ● 开始处理
  18.   #--------------------------------------------------------------------------
  19.   def start
  20.     super
  21.     create_menu_background
  22.     @viewport = Viewport.new(0, 0, 544, 416)
  23.     @help_window = Window_Help.new
  24.     @help_window.viewport = @viewport
  25.     @item_window = Window_Item.new(0, 67, 544, 280)
  26.     @item_window.viewport = @viewport
  27.     @item_window.help_window = @help_window
  28.     @item_window.active = false
  29.     @target_window = Window_MenuStatus.new(0, 0)
  30.     @max_window = Window_Item_Max.new
  31.     @max_window.viewport = @viewport
  32.     @number_window = Window_LoseNumber.new(142, 156)
  33.     @number_window.viewport = @viewport
  34.     @command_window = Window_Command.new(145, ["   使用","   丢弃"], 1, 2)
  35.     @command_window.x = 200
  36.     @command_window.y = 160
  37.     hide_command_window
  38.     hide_number_window
  39.     hide_target_window
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ● 结束处理
  43.   #--------------------------------------------------------------------------
  44.   alias terminate2 terminate
  45.   def terminate
  46.     terminate2
  47.     @max_window.dispose
  48.     @command_window.dispose
  49.     @number_window.dispose
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # ● 回到原画面
  53.   #--------------------------------------------------------------------------
  54.   def return_scene
  55.     $scene = Scene_Menu.new(0)
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # ● 更新画面
  59.   #--------------------------------------------------------------------------
  60.   def update
  61.     super
  62.     update_menu_background
  63.     @help_window.update
  64.     @item_window.update
  65.     @target_window.update
  66.     @max_window.update
  67.     @command_window.update
  68.     @number_window.update
  69.     if @item_window.active
  70.       update_item_selection
  71.     elsif @target_window.active
  72.       update_target_selection
  73.     elsif @command_window.active
  74.       update_command_selection
  75.     elsif @number_window.active
  76.       update_number_selection
  77.     end
  78.   end
  79.   #--------------------------------------------------------------------------
  80.   # ● 更新物品选择
  81.   #--------------------------------------------------------------------------
  82.   def update_item_selection
  83.     if Input.trigger?(Input::B)
  84.       if  $game_party.items.size <= $game_variables[IM]# 如果物品种类没超过限制
  85.         $game_player.change_move_speed(USUAL_SPEED)
  86.       end
  87.         Sound.play_cancel
  88.         return_scene
  89.     elsif Input.trigger?(Input::C)
  90.       @item = @item_window.item
  91.       if @item != nil
  92.         $game_party.last_item_id = @item.id
  93.         Sound.play_decision
  94.           if $game_party.item_can_use?(@item)     # 物品是否可用
  95.             @command_window.draw_item(0,true)      
  96.           else  @command_window.draw_item(0,false) # 不可用的话【使用】选项颜色无效
  97.           end
  98.           if @item.price == 0                     # 物品价格是否为0   
  99.              @command_window.draw_item(1,false)    # 是的话【丢弃】选项无效
  100.           else  
  101.              @command_window.draw_item(1,true)
  102.           end
  103.              show_command_window
  104.        else
  105.          Sound.play_buzzer
  106.        end
  107.     end
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 更新目标选择
  111.   #--------------------------------------------------------------------------
  112.   def update_target_selection
  113.     if Input.trigger?(Input::B)
  114.       Sound.play_cancel
  115.       if $game_party.item_number(@item) == 0    # 判断物品是否耗尽
  116.         @item_window.refresh                    # 刷新窗口内容      
  117.         @max_window.refresh                     # 刷新物品种类窗口
  118.       end
  119.       hide_target_window
  120.     elsif Input.trigger?(Input::C)
  121.       if not $game_party.item_can_use?(@item)
  122.         Sound.play_buzzer
  123.       else
  124.         determine_target
  125.       end
  126.     end
  127.   end
  128.   #--------------------------------------------------------------------------
  129.   # ★ 更新指令选择
  130.   #--------------------------------------------------------------------------
  131.   def update_command_selection
  132.     if Input.trigger?(Input::B)
  133.       Sound.play_cancel
  134.       hide_command_window
  135.     elsif Input.trigger?(Input::C)
  136.       if @command_window.index == 0
  137.         if $game_party.item_can_use?(@item)
  138.           Sound.play_decision
  139.           @command_window.active = false
  140.           @command_window.visible =false
  141.           determine_item
  142.         else
  143.           Sound.play_buzzer
  144.         end
  145.       elsif  @item == nil or @item.price == 0
  146.         Sound.play_buzzer
  147.       else
  148.         Sound.play_decision
  149.         @command_window.active = false
  150.         @command_window.visible =false        
  151.         max = $game_party.item_number(@item)
  152.         @number_window.set(@item, max)
  153.         show_number_window
  154.       end
  155.     end
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # ★ 更新数量输入
  159.   #--------------------------------------------------------------------------
  160.   def update_number_selection   
  161.     if Input.trigger?(Input::B)
  162.       Sound.play_cancel
  163.       hide_number_window
  164.     elsif Input.trigger?(Input::C)
  165.       Audio.se_play("Audio/SE/#{LOSE_ITEM_SE_NAME}", 80, 100)
  166.       $game_party.lose_item(@item, @number_window.number)
  167.       @item_window.refresh
  168.       @max_window.refresh  
  169.       hide_number_window
  170.     end  
  171.   end
  172.   #--------------------------------------------------------------------------
  173.   # ★ 显示指令选择窗口
  174.   #--------------------------------------------------------------------------
  175.   def show_command_window
  176.     @command_window.index = 0
  177.     @item_window.active = false
  178.     @command_window.visible = true
  179.     @command_window.active = true
  180.   end
  181.   #--------------------------------------------------------------------------
  182.   # ★ 显示数量窗口
  183.   #--------------------------------------------------------------------------
  184.   def show_number_window
  185.     @command_window.active = false
  186.     @number_window.visible = true
  187.     @number_window.active = true
  188.   end
  189.   #--------------------------------------------------------------------------
  190.   # ★ 隐藏指令选择窗口
  191.   #--------------------------------------------------------------------------
  192.   def hide_command_window
  193.     @item_window.active = true
  194.     @command_window.visible = false
  195.     @command_window.active = false
  196.     @viewport.rect.set(0, 0, 544, 416)
  197.     @viewport.ox = 0
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # ★ 隐藏数量窗口
  201.   #--------------------------------------------------------------------------
  202.   def hide_number_window
  203.     @item_window.active = true
  204.     @number_window.visible = false
  205.     @number_window.active = false
  206.     @viewport.rect.set(0, 0, 544, 416)
  207.     @viewport.ox = 0
  208.   end  
  209. end
  210. #==============================================================================
  211. # ■ Window_lost_item  
  212. #------------------------------------------------------------------------------
  213. #  显示物品丢弃数量的窗口,仿 Window_ShopNumber。
  214. #==============================================================================
  215. class Window_LoseNumber < Window_Base
  216.   #--------------------------------------------------------------------------
  217.   # ★ 初始化对像
  218.   #     x      : 窗口 X 座标
  219.   #     y      : 窗口 Y 座标
  220.   #--------------------------------------------------------------------------
  221.   def initialize(x, y)
  222.     super(x, y, 260, 104)
  223.     @item = nil
  224.     @max = 1
  225.     @number = 1
  226.   end
  227.   #--------------------------------------------------------------------------
  228.   # ★ 设置物品、最大数量
  229.   #--------------------------------------------------------------------------
  230.   def set(item, max)
  231.     @item = item
  232.     @max = max
  233.     @number = 1
  234.     refresh
  235.   end
  236.   #--------------------------------------------------------------------------
  237.   # ★ 设置数量输入
  238.   #--------------------------------------------------------------------------
  239.   def number
  240.     return @number
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ★ 刷新
  244.   #--------------------------------------------------------------------------
  245.   def refresh
  246.     y = 24
  247.     self.contents.clear
  248.     draw_item_name(@item, 0, y)
  249.     self.contents.font.color = normal_color
  250.     self.contents.draw_text(164, y, 20, WLH, "×")
  251.     self.contents.draw_text(190, y, 20, WLH, @number, 2)
  252.     self.cursor_rect.set(186, y, 28, WLH)
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # ★ 更新画面
  256.   #--------------------------------------------------------------------------
  257.   def update
  258.     super
  259.     if self.active
  260.       last_number = @number
  261.       if Input.repeat?(Input::RIGHT) and @number < @max
  262.         @number += 1
  263.       end
  264.       if Input.repeat?(Input::LEFT) and @number > 1
  265.         @number -= 1
  266.       end
  267.       if Input.repeat?(Input::UP) and @number < @max
  268.         @number = [@number + 10, @max].min
  269.       end
  270.       if Input.repeat?(Input::DOWN) and @number > 1
  271.         @number = [@number - 10, 1].max
  272.       end
  273.       if @number != last_number
  274.         Sound.play_cursor
  275.         refresh
  276.       end
  277.     end
  278.   end
  279. end
  280. #==============================================================================
  281. # ■ Window_Item_Max
  282. #-----------------------------------------------------------------------------
  283. #   显示背包容量和当前物品数的窗口
  284. #============================================================================

  285. class Window_Item_Max < Window_Base
  286.   #--------------------------------------------------------------------------
  287.   # ★ 初始化对像
  288.   #--------------------------------------------------------------------------
  289.   def initialize
  290.     super(290, 360, 254, 56)
  291.     refresh
  292.   end
  293.   
  294.   #--------------------------------------------------------------------------
  295.   # ★ 刷新
  296.   #--------------------------------------------------------------------------  
  297.   def refresh
  298.     self.contents.clear
  299.     draw_icon(144, 0, 0)
  300.     self.contents.draw_text(36, 0, 100, 24, "背包容量:")
  301.     item = $game_party.items
  302.     string = item.size.to_s
  303.     self.contents.font.color = knockout_color if item.size > $game_variables[IM]
  304.     self.contents.draw_text(135, 0, 30, 24, string, 2)
  305.     self.contents.font.color = normal_color
  306.     string = "/ " + $game_variables[IM].to_s
  307.     self.contents.draw_text(173, 0, 100, 24, string )
  308.   end
  309. end
  310. #==============================================================================
  311. # ■ Window_Waring
  312. #-----------------------------------------------------------------------------
  313. #   显示超重警告的窗口
  314. #============================================================================
  315. class Window_Waring  < Window_Base
  316.   def initialize
  317.     width = WARING_STRING.size * 8
  318.     super(544 - width, 416 - 56, width, 56)
  319.     refresh
  320.   end
  321.   
  322.   def refresh
  323.     self.contents.clear
  324.     self.contents.draw_text(0, -4, width - 32, 32, WARING_STRING)
  325.   end
  326. end
  327. #==============================================================================
  328. # Game_Player 添加更改移动速度的方法
  329. #============================================================================
  330. class Game_Player   
  331.   def change_move_speed(n)
  332.     @move_speed = n
  333.   end
  334. end
  335. #==============================================================================
  336. # Scene_Map  添加在地图上显示警告窗口的处理
  337. #============================================================================
  338. class Scene_Map
  339.   #--------------------------------------------------------------------------
  340.   # ● 开始处理
  341.   #--------------------------------------------------------------------------
  342.   alias start2 start
  343.   def start
  344.     start2
  345.     @waring_window = Window_Waring.new
  346.     @waring_window.visible = false
  347.   end  
  348.   #--------------------------------------------------------------------------
  349.   # ● 结束处理
  350.   #--------------------------------------------------------------------------
  351.   alias terminate2 terminate
  352.   def terminate
  353.     @waring_window.dispose
  354.     terminate2
  355.   end
  356.   #--------------------------------------------------------------------------
  357.   # ● フレーム更新
  358.   #--------------------------------------------------------------------------
  359.   alias update2 update
  360.   def update
  361.     update2
  362.     update_over_item
  363.   end
  364.   #--------------------------------------------------------------------------
  365.   # ● 更新物品超限判定
  366.   #--------------------------------------------------------------------------  
  367.   def update_over_item
  368.     if $game_party.items.size > $game_variables[IM]
  369.       @waring_window.visible = true
  370.       $game_player.change_move_speed(LOW_SPEED)
  371.     else
  372.       @waring_window.visible = false
  373.     end
  374.   end
  375. end
复制代码
我把代码弄上却发现怎么样背包容量都是0
前天终于搞懂了,得谢谢群里的moy和叫什么秋(不好意思忘了名字了)的。
等会我把解决办法发一下
作者: DeathKing    时间: 2010-6-24 23:35
很明显:IM = 1                                # IM号系统变量决定物品种类的最大值
作者: andrewlisty    时间: 2010-6-24 23:43
改背包容量要注意的是这一条
“2.最大物品种数是IM号变量的值,IM在脚本中定义。”
当IM=1时
便可以在事件中变量编辑想要的容量数

示例:

IM=11
添加事件
插入-1-游戏进程的变量操作
(变量号就是IM号)

变量
单个 0011:
操作
代入
操作数
常量:10


这些可以添加为自动执行
这样以后背包容量就是10了


同理,也可以之后再用里面事件里的的变量加法来进行增加容量


如图


遇事件前↓

遇事件后↓

作者: 344143370    时间: 2012-4-27 09:59
还是不懂啊  有没有范例啊
作者: Luciffer    时间: 2012-4-27 10:52
这还不好理解吗?意思就是脚本上面的“IM=1”指的是“背包容量为1号变量所含有的数值”
变量编号可改动,避免和自己已经用到的变量冲突。
变量数值可变化,故可以设置升级背包的事件。
作者: 小强无敌    时间: 2013-3-3 09:23
小强无敌表示:
在这做一下补充,这个脚本有个缺陷,就是在背包装满时屏幕提示背包已满并且速度降低,必须要打开菜单背包扔掉一些没用的东西才行,但是如果我不选择在背包中扔掉物品而是选择卖掉一些东西,这时返回地图,虽然屏幕的超重提示没有了,但是行走速度还是和超重时一样,龟速。只能打开自己背包看一下再退出来,速度才恢复正常,这样怎么搞也觉得有些别扭。   脚本需要在:
#--------------------------------------------------------------------------
  # ● 更新物品超限判定
  #--------------------------------------------------------------------------  
  def update_over_item
    if $game_party.items.size > $game_variables[IM]
      @waring_window.visible = true
      $game_player.change_move_speed(LOW_SPEED)
    else
      @waring_window.visible = false                     #这段之后加入$game_player.change_move_speed(USUAL_SPEED)就可以解决问题。
    end
  end
end



脚本由
补充完成@OCTSJimmy  




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