Project1

标题: 怎么样能做到这样的效果 [打印本页]

作者: 小究就是我    时间: 2017-3-16 19:01
标题: 怎么样能做到这样的效果
就是如果有一个角色的魔力值到了0时,他的武器就会消失,但是魔力回满,
如果没有武器那就消耗第二栏装备(也就是护盾)
最好是脚本!谢了!!!!!!!
作者: 魔法丶小肉包    时间: 2017-3-17 20:50
由于是mp和装备相关,那么我们就选择Game_Actor类下手吧
那么,在Game_Actor类中定义了refresh方法,也就是刷新角色数据的方法,于是我们就从这个方法开刀吧=w=
这是默认脚本中定义的方法
RUBY 代码复制
  1. def refresh
  2.     release_unequippable_items
  3.     super
  4.   end

那么,看到super,于是查找一下父类所写的方法,得知
RUBY 代码复制
  1. def refresh
  2.     state_resist_set.each {|state_id| erase_state(state_id) }
  3.     @hp = [[@hp, mhp].min, 0].max
  4.     @mp = [[@mp, mmp].min, 0].max
  5.     @hp == 0 ? add_state(death_state_id) : remove_state(death_state_id)
  6.   end

哦,那么正好,父类中的refresh方法已经定义了@mp
因此,在super之下,我们就可以开始直接使用@mp了
那么,现在的思路是 当mp等于0时,失去装备并回复满mp
于是
RUBY 代码复制
  1. def refresh
  2.     release_unequippable_items
  3.     super
  4.     if @mp == 0
  5.     end
  6. end

先打好框架,接下来,就只需要往里面填入方法了
那么,首先要判断武器是不是装备了?
RUBY 代码复制
  1. !weapons.empty?

这句代码用来判断吧,意思是 武器不为空
那mp怎么回满呢?
RUBY 代码复制
  1. @mp = mmp

那怎么失去装备呢?失去,就是丢掉咯?那么
RUBY 代码复制
  1. discard_equip(equips[0])

其中equips[0]为装备栏的第一行(就是武器栏)
而discard_equip为丢弃装备的方法,在此类中已经定义,所以可以直接使用了
于是,
RUBY 代码复制
  1. def refresh
  2.     release_unequippable_items
  3.     super
  4.     if @mp == 0
  5.       if !weapons.empty?
  6.         @mp = mmp
  7.         discard_equip(equips[0])
  8.       end
  9.     end
  10. end

那么,如果武器栏为空而防具栏装备了防具呢?
RUBY 代码复制
  1. if weapons.empty? && equips[1] != nil

意思是 如果武器为空并且装备栏的第二栏(防具)不为空
于是,同样的方法
RUBY 代码复制
  1. def refresh
  2.     release_unequippable_items
  3.     super
  4.     if @mp == 0
  5.       if !weapons.empty?
  6.         @mp = mmp
  7.         discard_equip(equips[0])
  8.       end
  9.       if weapons.empty? && equips[1] != nil
  10.         @mp = mmp
  11.         discard_equip(equips[1])
  12.       end
  13.     end
  14. end

写到这里,测试一下吧?当你进入游戏的时候迫不及待的打开装备栏想确认装备有没有装备上的时候....咦,你发现了第一个问题,
为什么装备不见了?明明在数据库中设定装备是有的呀?
我们来看一下写好的方法
if @mp == 0
嗯....不对,新游戏角色加入的时候会初始化的吧...嗯....那初始化的时候mp=0呀,哦,原来是因为这个原因啊
于是找到此类中的 初始化装备 方法
RUBY 代码复制
  1. def init_equips(equips)
  2.     @equips = Array.new(equip_slots.size) { Game_BaseItem.new }
  3.     equips.each_with_index do |item_id, i|
  4.       etype_id = index_to_etype_id(i)
  5.       slot_id = empty_slot(etype_id)
  6.       @equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
  7.     end
  8.      refresh
  9.   end

发现是在初始化之后调用了refresh方法,刚刚说了初始化mp=0,那么在这之后调用refresh的话就已经满足了if @mp == 0这个条件,那么怎么办呢?
那就先refresh一下再初始化装备吧
RUBY 代码复制
  1. def init_equips(equips)
  2.     refresh
  3.     @equips = Array.new(equip_slots.size) { Game_BaseItem.new }
  4.     equips.each_with_index do |item_id, i|
  5.       etype_id = index_to_etype_id(i)
  6.       slot_id = empty_slot(etype_id)
  7.       @equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
  8.     end
  9.   end

然后,进去测试了一下嗯...发现这个问题修复了,于是继续测试...咦,发现新问题了!
为什么我mp只回满了一次就让两件装备都消失了呢?!
打开脚本看看条件,发现问题了吧,第二个判断条件是 如果武器为空并有防具时,
那么,思考一下,如果我满足了第一个条件,此时武器已经消失,那要是防具装备着的话不就同时满足了第二个条件了吗?
那么,解决方法很多,我们可以利用最简单的开关来修复此bug
思路是当满足了第一个条件之后(武器消失,mp回满),打开1号开关,然后在第二个条件中加一个判断 如果1号开关为关闭的话
这样的话武器消失时1号开关打开了,于是第二个条件不满足了,防具就不会消失了,
那之后呢,执行为判断之后,让1号开关初始化吧(关闭),这样一来,就能实现我们的目的。
于是,最后,我们把刚刚的思路写到这个方法中。
RUBY 代码复制
  1. class Game_Actor
  2.   def init_equips(equips)
  3.     refresh
  4.     @equips = Array.new(equip_slots.size) { Game_BaseItem.new }
  5.     equips.each_with_index do |item_id, i|
  6.       etype_id = index_to_etype_id(i)
  7.       slot_id = empty_slot(etype_id)
  8.       @equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
  9.     end
  10.   end
  11.   def refresh
  12.     release_unequippable_items
  13.     super
  14.     if @mp == 0
  15.       if !weapons.empty?
  16.         @mp = mmp
  17.         discard_equip(equips[0])
  18.         $game_switches[1] = true
  19.       end
  20.       if weapons.empty? && equips[1] != nil && $game_switches[1] == false
  21.         @mp = mmp
  22.         discard_equip(equips[1])
  23.       end
  24.     end
  25.     $game_switches[1] = false
  26.   end
  27. end


这样一来,便实现了目的,什么?你想要把后面的装备栏也用到此方法中?那么,就自己动手改脚本吧~
作者: 小究就是我    时间: 2017-3-18 12:44
魔法丶小肉包 发表于 2017-3-17 20:50
由于是mp和装备相关,那么我们就选择Game_Actor类下手吧
那么,在Game_Actor类中定义了refresh方法,也就是 ...

可是又有问题了:
二刀流的话武器会消失但是第二个武器不会消失,
这可怎么办????

作者: 魔法丶小肉包    时间: 2017-3-18 13:23
小究就是我 发表于 2017-3-18 12:44
可是又有问题了:
二刀流的话武器会消失但是第二个武器不会消失,
这可怎么办????

那么,我们可以加个判断,思路是如果mp为0并且双持武器的话怎么样?mp为0并且不双持武器的话又怎么样?
在Game_BattlerBase类中定义了一个判断是否双持武器的方法 dual_wield? 于是我们就调用此方法来进行判断
RUBY 代码复制
  1. class Game_Actor
  2.   def init_equips(equips)
  3.     refresh
  4.     @equips = Array.new(equip_slots.size) { Game_BaseItem.new }
  5.     equips.each_with_index do |item_id, i|
  6.       etype_id = index_to_etype_id(i)
  7.       slot_id = empty_slot(etype_id)
  8.       @equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
  9.     end
  10.   end
  11.   def refresh
  12.     release_unequippable_items
  13.     super
  14.     if @mp == 0 && !dual_wield?
  15.       if !weapons.empty?
  16.         @mp = mmp
  17.         discard_equip(equips[0])
  18.       elsif weapons.empty? && equips[1] != nil
  19.         @mp = mmp
  20.         discard_equip(equips[1])
  21.       end
  22.     end
  23.     if @mp == 0 && dual_wield?
  24.       if equips[0] != nil
  25.         @mp = mmp
  26.         discard_equip(equips[0])
  27.       elsif equips[0] == nil && equips[1] != nil
  28.         @mp = mmp
  29.         discard_equip(equips[1])
  30.       end
  31.     end
  32.   end
  33. end

作者: 小究就是我    时间: 2017-3-22 18:22
魔法丶小肉包 发表于 2017-3-18 13:23
那么,我们可以加个判断,思路是如果mp为0并且双持武器的话怎么样?mp为0并且不双持武器的话又怎么样?
...

最后麻烦一下大神:
就是当主角持有第二武器时,两把武器之间随机消失一个(要不然有人发现了这个规律就不好了)

作者: 魔法丶小肉包    时间: 2017-3-23 15:55
小究就是我 发表于 2017-3-22 18:22
最后麻烦一下大神:
就是当主角持有第二武器时,两把武器之间随机消失一个(要不然有人发现了这个规律就 ...

那么就改一下判断双持武器这一块的内容
使用随机数rand(2),随机0,1两个数
然后通过得到的值来实现随机丢掉装备的效果
RUBY 代码复制
  1. class Game_Actor
  2.   def init_equips(equips)
  3.     refresh
  4.     @equips = Array.new(equip_slots.size) { Game_BaseItem.new }
  5.     equips.each_with_index do |item_id, i|
  6.       etype_id = index_to_etype_id(i)
  7.       slot_id = empty_slot(etype_id)
  8.       @equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
  9.     end
  10.   end
  11.   def refresh
  12.     release_unequippable_items
  13.     super
  14.     if @mp == 0 && !dual_wield?
  15.       if !weapons.empty?
  16.         @mp = mmp
  17.         discard_equip(equips[0])
  18.       elsif weapons.empty? && equips[1] != nil
  19.         @mp = mmp
  20.         discard_equip(equips[1])
  21.       end
  22.     end
  23.     if @mp == 0 && dual_wield?
  24.       if equips[0] != nil && equips[1] != nil
  25.         @mp = mmp
  26.         case rand(2)
  27.         when 0
  28.         discard_equip(equips[0])
  29.         when 1
  30.           @item = $data_weapons[equips[0].id]
  31.           change_equip(0, nil)
  32.         discard_equip(equips[1])
  33.         change_equip(0, @item)
  34.         end
  35.       elsif equips[0] != nil && equips[1] == nil
  36.         @mp = mmp
  37.         discard_equip(equips[0])
  38.       elsif equips[0] == nil && equips[1] != nil
  39.         @mp = mmp
  40.         discard_equip(equips[1])
  41.       end
  42.     end
  43.   end
  44. end





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