Project1

标题: 请问如何制作两个背包? [打印本页]

作者: 无敌啊鸡    时间: 2014-12-31 15:13
标题: 请问如何制作两个背包?
请请教一下各位大大,有两个主角,想制作2个背包 数据不通用,请问应该怎么做呀?

就是主角A的时候 用A的 背包,,B的背包不显示,,B的时候B的背包, (⊙o⊙)…  口水文请见谅额,,
作者: VIPArcher    时间: 2014-12-31 20:07
没用过XP,目测可以这么做。在Game_Party类里设置2组物品列表。

https://rpg.blue/thread-371929-1-1.html 这是VA的。或许可以参考
好吧,看不懂就算了,不会自己改脚本的话,可以无视我的回帖。
作者: 风若·飘絮    时间: 2014-12-31 20:50
理论上每个道具增加一个变量,到时候再判断角色显示就OK了。。但细节很多……
作者: RyanBern    时间: 2014-12-31 23:39
本帖最后由 RyanBern 于 2015-1-18 11:38 编辑

一种比较简单的方法,直接生成多个Game_Party对象,暂时不用的先存着,$game_party指示的是当前的队伍(包括背包,队员,步数等信息)
注:以下脚本未测试
RUBY 代码复制
  1. class Game_System
  2.   def swap_party(party_id)
  3.     @reserved_parties ||= {}
  4.     party = @reserved_parties[party_id]
  5.     return if party == nil
  6.     @reserved_parties[party_id] = nil
  7.     @reserved_parties[$game_party.id] = $game_party
  8.     $game_party = party
  9.     $game_player.refresh
  10.     $game_party.refresh
  11.     $game_map.need_refresh = true
  12.   end
  13.   def add_party(party_id)
  14.     @reserved_parties ||= {}
  15.     party = Game_Party.new
  16.     party.id = party_id
  17.     @reserved_parties[party_id] = party
  18.   end
  19.   def remove_party(party_id)
  20.     @reserved_parties ||= {}
  21.     @reserved_parties[party_id] = nil
  22.   end
  23.   def merge_party(party_id)
  24.     @reserved_parties ||= {}
  25.     party = @reserved_parties[party_id]
  26.     return if party == nil
  27.     $game_party.gain_gold(party.gold)
  28.     $game_party.actors |= party.actors
  29.     (1...$data_items.size).each{|i| $game_party.gain_item(i, party.item_number(i))}
  30.     (1...$data_weapon.size).each{|i| $game_party.gain_weapon(i, party.weapon_number(i))}
  31.     (1...$data_armors.size).each{|i| $game_party.gain_armor(i, party.armor_number(i))}
  32.     @reserved_parties[party_id] = nil
  33.     $game_party.refresh
  34.   end
  35. end
  36.  
  37. class Game_Party
  38.   attr_accessor :actors
  39.   attr_writer    :id
  40.   def id
  41.     @id = 0 if @id.nil?
  42.     return @id
  43.   end
  44. end

使用方法:
RUBY 代码复制
  1. $game_system.add_party(队伍ID) # 新建一个队伍,队伍ID需要自己指定,不要与已有的重复
  2. $game_system.swap_party(队伍ID) # 将当前队伍设置为指定ID的队伍
  3. $game_system.remove_party(队伍ID) # 删除指定ID的队伍
  4. $game_system.merge_party(队伍ID) # 将指定ID的队伍合并到当前队伍中

注意,所有的队伍ID都要自己指定,一定要牢记。游戏一开始的初始队伍的ID为0。进行队伍合并后,不可再次分开,被合并的队伍将消失。
在主角2上场前,要先建立一个新的队伍,这时候使用
$game_system.add_party(1)
此时新建的主角2的队伍的ID为1
然后调用
$game_system.swap_party(1)
会将当前队伍换成建立的新队伍
这之后,对于队伍的所有操作,包括增加人,增加物品,道具等,都是对主角2的队伍而言的。
如果主角2的路线暂停,要换回主角1,则使用
$game_system.swap_party(0)
这样队伍又变回主角1的队伍了。
如果主角2遇到了主角1,并且想要加入主角1的队伍(当前队伍为主角2),那么要使用两句话
$game_system.swap_party(0)
$game_system.merge_party(1)
第一句话是换成主角1的队伍,第二句话是将主角2的队伍合并到主角1的队伍里面,执行之后,当前队伍为主角1的队伍,主角2的队伍永远消失。
作者: 英顺的马甲    时间: 2015-1-1 01:06
本帖最后由 英顺的马甲 于 2015-1-1 14:31 编辑

这样就每个人都有一个背包了,
效果是背包根据队伍的第一个成员而定

脚本未经测试效果未知
RUBY 代码复制
  1. class Game_Party
  2.   def item_number(id)
  3.     @items[@actors[0].id] ? (@items[@actors[0].id].include?(id) ? @items[@actors[0].id][id] : 0) : 0
  4.   end
  5.   def weapon_number(id)
  6.     @weapons[@actors[0].id] ? (@weapons[@actors[0].id].include?(id) ? @weapons[@actors[0].id][id] : 0) : 0
  7.   end
  8.   def armor_number(id)
  9.     @armors[@actors[0].id] ? (@armors[@actors[0].id].include?(id) ? @armors[@actors[0].id][id] : 0) : 0
  10.   end
  11.   def gain_item(id, n)
  12.     @items[@actors[0].id] = {} unless @items[@actors[0].id]
  13.     if item_id > 0
  14.       @items[@actors[0].id][id] = [[item_number(id) + n, 0].max, 99].min
  15.     end
  16.   end
  17.   def gain_weapon(id, n)
  18.     @weapons[@actors[0].id] = {} unless @weapons[@actors[0].id]
  19.     if id > 0
  20.       @weapons[@actors[0].id][id] = [[weapon_number(id) + n, 0].max, 99].min
  21.     end
  22.   end
  23.   def gain_armor(id, n)
  24.     @armors[@actors[0].id] = {} unless @armors[@actors[0].id]
  25.     if id > 0
  26.       @armors[@actors[0].id][id] = [[armor_number(id) + n, 0].max, 99].min
  27.     end
  28.   end
  29. end

以下是第二种实现方法(同样未经测试):
RUBY 代码复制
  1. class Bag
  2.   def initialize
  3.     @data = {}
  4.   end
  5.   def [](id)
  6.     return nil unless @data[$game_party.actors[0].id]
  7.     return @data[$game_party.actors[0].id][id]
  8.   end
  9.   def []=(id, n)
  10.     @data = {} unless @data[$game_party.actors[0].id]
  11.     @data[$game_party.actors[0].id][id] = n
  12.   end
  13. end
  14. class Game_Party
  15.   alias multi_bag_init initialize unless defined?(multi_bag_init)
  16.   def initialize
  17.     multi_bag_init
  18.     @items = Bag.new
  19.     @weapons = Bag.new
  20.     @armor = Bag.new
  21.   end
  22. end

从第二种方法可以简单实现更多种多背包,比如说让背包根据一号变量而定,(其实第一种方法也能做到)
RUBY 代码复制
  1. class Bag
  2.   def initialize
  3.     @data = {}
  4.   end
  5.   def [](id)
  6.     return nil unless @data[$game_variables[1]]
  7.     return @data[$game_variables[1]][id]
  8.   end
  9.   def []=(id, n)
  10.     @data = {} unless @data[$game_variables[1]]
  11.     @data[$game_variables[1]][id] = n
  12.   end
  13. end
  14. class Game_Party
  15.   alias multi_bag_init initialize unless defined?(multi_bag_init)
  16.   def initialize
  17.     multi_bag_init
  18.     @items = Bag.new
  19.     @weapons = Bag.new
  20.     @armor = Bag.new
  21.   end
  22. end

理论上只要你会一些脚本你就能从第二种方法中延伸出各种各样的多重背包。
作者: 无敌啊鸡    时间: 2015-1-1 14:10
本帖最后由 无敌啊鸡 于 2015-1-1 17:13 编辑
RyanBern 发表于 2014-12-31 23:39
一种比较简单的方法,直接生成多个Game_Party对象,暂时不用的先存着,$game_party指示的是当前的队伍(包 ...


那个,谢谢大。。虽然实现了背包额,,
可是好像有点问题额。

您的意思是,在主角2加入队伍前先调用脚本$game_system.add_party(1)
然后2号角色加入队伍 在调用$game_system.swap_party(1) 是么

这么做了之后 角色就不在了 (⊙o⊙)…  虽然背包清空了。。。

(⊙o⊙)… 额,然后想要合并2个队伍的时候 似乎报错了额。。。
作者: 无敌啊鸡    时间: 2015-1-1 15:06
本帖最后由 无敌啊鸡 于 2015-1-1 15:08 编辑
无敌啊鸡 发表于 2015-1-1 14:10
又见大神,谢谢您,每次都麻烦您呀。。
(⊙o⊙)… 那个,这个脚本是插入MAIN前么 试了一下,好像报错了额 ...


额 大大,是我不小心输的时候少打了一个1, 脚本里是1231(⊙o⊙)… 。


呜,不小心连帖了, 不知道怎么编辑删除。。我错了。。。
作者: 布罗利    时间: 2015-1-1 18:11
本帖最后由 布罗利 于 2015-1-1 18:12 编辑

单人负重系统V1.16.7z (2.58 MB, 下载次数: 90)
使用方法:1、单人负重的那个脚本复制到你工程
                  2、然后菜单里的-刷新画面 (命令窗口被激活的情况下)进入物品的地方改一下
                       大概是这样改,不过得根据你的工程
                     
RUBY 代码复制
  1. when 3  # 物品
  2.        # 演奏确定 SE
  3.         $game_system.se_play($data_system.decision_se)
  4.         # 切换到物品画面
  5.         @command_window.active = false
  6.         @status_window.active = true
  7.         @status_window.index = 0

               
   

作者: 英顺的马甲    时间: 2015-1-1 22:15
无敌啊鸡 发表于 2015-1-1 15:06
额 大大,是我不小心输的时候少打了一个1, 脚本里是1231(⊙o⊙)… 。

补上这段
  1. class Game_Party
  2.   attr_accessor :gold, :actors
  3. end
复制代码





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