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指示的是当前的队伍(包括背包,队员,步数等信息)
注:以下脚本未测试
class Game_System
def swap_party(party_id)
@reserved_parties ||= {}
party = @reserved_parties[party_id]
return if party == nil
@reserved_parties[party_id] = nil
@reserved_parties[$game_party.id] = $game_party
$game_party = party
$game_player.refresh
$game_party.refresh
$game_map.need_refresh = true
end
def add_party(party_id)
@reserved_parties ||= {}
party = Game_Party.new
party.id = party_id
@reserved_parties[party_id] = party
end
def remove_party(party_id)
@reserved_parties ||= {}
@reserved_parties[party_id] = nil
end
def merge_party(party_id)
@reserved_parties ||= {}
party = @reserved_parties[party_id]
return if party == nil
$game_party.gain_gold(party.gold)
$game_party.actors |= party.actors
(1...$data_items.size).each{|i| $game_party.gain_item(i, party.item_number(i))}
(1...$data_weapon.size).each{|i| $game_party.gain_weapon(i, party.weapon_number(i))}
(1...$data_armors.size).each{|i| $game_party.gain_armor(i, party.armor_number(i))}
@reserved_parties[party_id] = nil
$game_party.refresh
end
end
class Game_Party
attr_accessor :actors
attr_writer :id
def id
@id = 0 if @id.nil?
return @id
end
end
class Game_System
def swap_party(party_id)
@reserved_parties ||= {}
party = @reserved_parties[party_id]
return if party == nil
@reserved_parties[party_id] = nil
@reserved_parties[$game_party.id] = $game_party
$game_party = party
$game_player.refresh
$game_party.refresh
$game_map.need_refresh = true
end
def add_party(party_id)
@reserved_parties ||= {}
party = Game_Party.new
party.id = party_id
@reserved_parties[party_id] = party
end
def remove_party(party_id)
@reserved_parties ||= {}
@reserved_parties[party_id] = nil
end
def merge_party(party_id)
@reserved_parties ||= {}
party = @reserved_parties[party_id]
return if party == nil
$game_party.gain_gold(party.gold)
$game_party.actors |= party.actors
(1...$data_items.size).each{|i| $game_party.gain_item(i, party.item_number(i))}
(1...$data_weapon.size).each{|i| $game_party.gain_weapon(i, party.weapon_number(i))}
(1...$data_armors.size).each{|i| $game_party.gain_armor(i, party.armor_number(i))}
@reserved_parties[party_id] = nil
$game_party.refresh
end
end
class Game_Party
attr_accessor :actors
attr_writer :id
def id
@id = 0 if @id.nil?
return @id
end
end
使用方法:
$game_system.add_party(队伍ID) # 新建一个队伍,队伍ID需要自己指定,不要与已有的重复
$game_system.swap_party(队伍ID) # 将当前队伍设置为指定ID的队伍
$game_system.remove_party(队伍ID) # 删除指定ID的队伍
$game_system.merge_party(队伍ID) # 将指定ID的队伍合并到当前队伍中
$game_system.add_party(队伍ID) # 新建一个队伍,队伍ID需要自己指定,不要与已有的重复
$game_system.swap_party(队伍ID) # 将当前队伍设置为指定ID的队伍
$game_system.remove_party(队伍ID) # 删除指定ID的队伍
$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 编辑
这样就每个人都有一个背包了,
效果是背包根据队伍的第一个成员而定
脚本未经测试效果未知class Game_Party
def item_number(id)
@items[@actors[0].id] ? (@items[@actors[0].id].include?(id) ? @items[@actors[0].id][id] : 0) : 0
end
def weapon_number(id)
@weapons[@actors[0].id] ? (@weapons[@actors[0].id].include?(id) ? @weapons[@actors[0].id][id] : 0) : 0
end
def armor_number(id)
@armors[@actors[0].id] ? (@armors[@actors[0].id].include?(id) ? @armors[@actors[0].id][id] : 0) : 0
end
def gain_item(id, n)
@items[@actors[0].id] = {} unless @items[@actors[0].id]
if item_id > 0
@items[@actors[0].id][id] = [[item_number(id) + n, 0].max, 99].min
end
end
def gain_weapon(id, n)
@weapons[@actors[0].id] = {} unless @weapons[@actors[0].id]
if id > 0
@weapons[@actors[0].id][id] = [[weapon_number(id) + n, 0].max, 99].min
end
end
def gain_armor(id, n)
@armors[@actors[0].id] = {} unless @armors[@actors[0].id]
if id > 0
@armors[@actors[0].id][id] = [[armor_number(id) + n, 0].max, 99].min
end
end
end
class Game_Party
def item_number(id)
@items[@actors[0].id] ? (@items[@actors[0].id].include?(id) ? @items[@actors[0].id][id] : 0) : 0
end
def weapon_number(id)
@weapons[@actors[0].id] ? (@weapons[@actors[0].id].include?(id) ? @weapons[@actors[0].id][id] : 0) : 0
end
def armor_number(id)
@armors[@actors[0].id] ? (@armors[@actors[0].id].include?(id) ? @armors[@actors[0].id][id] : 0) : 0
end
def gain_item(id, n)
@items[@actors[0].id] = {} unless @items[@actors[0].id]
if item_id > 0
@items[@actors[0].id][id] = [[item_number(id) + n, 0].max, 99].min
end
end
def gain_weapon(id, n)
@weapons[@actors[0].id] = {} unless @weapons[@actors[0].id]
if id > 0
@weapons[@actors[0].id][id] = [[weapon_number(id) + n, 0].max, 99].min
end
end
def gain_armor(id, n)
@armors[@actors[0].id] = {} unless @armors[@actors[0].id]
if id > 0
@armors[@actors[0].id][id] = [[armor_number(id) + n, 0].max, 99].min
end
end
end
以下是第二种实现方法(同样未经测试):
class Bag
def initialize
@data = {}
end
def [](id)
return nil unless @data[$game_party.actors[0].id]
return @data[$game_party.actors[0].id][id]
end
def []=(id, n)
@data = {} unless @data[$game_party.actors[0].id]
@data[$game_party.actors[0].id][id] = n
end
end
class Game_Party
alias multi_bag_init initialize unless defined?(multi_bag_init)
def initialize
multi_bag_init
@items = Bag.new
@weapons = Bag.new
@armor = Bag.new
end
end
class Bag
def initialize
@data = {}
end
def [](id)
return nil unless @data[$game_party.actors[0].id]
return @data[$game_party.actors[0].id][id]
end
def []=(id, n)
@data = {} unless @data[$game_party.actors[0].id]
@data[$game_party.actors[0].id][id] = n
end
end
class Game_Party
alias multi_bag_init initialize unless defined?(multi_bag_init)
def initialize
multi_bag_init
@items = Bag.new
@weapons = Bag.new
@armor = Bag.new
end
end
从第二种方法可以简单实现更多种多背包,比如说让背包根据一号变量而定,(其实第一种方法也能做到)
class Bag
def initialize
@data = {}
end
def [](id)
return nil unless @data[$game_variables[1]]
return @data[$game_variables[1]][id]
end
def []=(id, n)
@data = {} unless @data[$game_variables[1]]
@data[$game_variables[1]][id] = n
end
end
class Game_Party
alias multi_bag_init initialize unless defined?(multi_bag_init)
def initialize
multi_bag_init
@items = Bag.new
@weapons = Bag.new
@armor = Bag.new
end
end
class Bag
def initialize
@data = {}
end
def [](id)
return nil unless @data[$game_variables[1]]
return @data[$game_variables[1]][id]
end
def []=(id, n)
@data = {} unless @data[$game_variables[1]]
@data[$game_variables[1]][id] = n
end
end
class Game_Party
alias multi_bag_init initialize unless defined?(multi_bag_init)
def initialize
multi_bag_init
@items = Bag.new
@weapons = Bag.new
@armor = Bag.new
end
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、然后菜单里的-刷新画面 (命令窗口被激活的情况下)进入物品的地方改一下
大概是这样改,不过得根据你的工程
when 3 # 物品
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到物品画面
@command_window.active = false
@status_window.active = true
@status_window.index = 0
when 3 # 物品
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 切换到物品画面
@command_window.active = false
@status_window.active = true
@status_window.index = 0
作者: 英顺的马甲 时间: 2015-1-1 22:15
无敌啊鸡 发表于 2015-1-1 15:06
额 大大,是我不小心输的时候少打了一个1, 脚本里是1231(⊙o⊙)… 。
补上这段- class Game_Party
- attr_accessor :gold, :actors
- end
复制代码
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |