Project1
标题: 怎么样能做到这样的效果 [打印本页]
作者: 小究就是我 时间: 2017-3-16 19:01
标题: 怎么样能做到这样的效果
就是如果有一个角色的魔力值到了0时,他的武器就会消失,但是魔力回满,
如果没有武器那就消耗第二栏装备(也就是护盾)
最好是脚本!谢了!!!!!!!
作者: 魔法丶小肉包 时间: 2017-3-17 20:50
由于是mp和装备相关,那么我们就选择Game_Actor类下手吧
那么,在Game_Actor类中定义了refresh方法,也就是刷新角色数据的方法,于是我们就从这个方法开刀吧=w=
这是默认脚本中定义的方法
def refresh
release_unequippable_items
super
end
def refresh
release_unequippable_items
super
end
那么,看到super,于是查找一下父类所写的方法,得知
def refresh
state_resist_set.each {|state_id| erase_state(state_id) }
@hp = [[@hp, mhp].min, 0].max
@mp = [[@mp, mmp].min, 0].max
@hp == 0 ? add_state(death_state_id) : remove_state(death_state_id)
end
def refresh
state_resist_set.each {|state_id| erase_state(state_id) }
@hp = [[@hp, mhp].min, 0].max
@mp = [[@mp, mmp].min, 0].max
@hp == 0 ? add_state(death_state_id) : remove_state(death_state_id)
end
哦,那么正好,父类中的refresh方法已经定义了@mp
因此,在super之下,我们就可以开始直接使用@mp了
那么,现在的思路是 当mp等于0时,失去装备并回复满mp
于是
def refresh
release_unequippable_items
super
if @mp == 0
end
end
def refresh
release_unequippable_items
super
if @mp == 0
end
end
先打好框架,接下来,就只需要往里面填入方法了
那么,首先要判断武器是不是装备了?
这句代码用来判断吧,意思是 武器不为空
那mp怎么回满呢?
那怎么失去装备呢?失去,就是丢掉咯?那么
其中equips[0]为装备栏的第一行(就是武器栏)
而discard_equip为丢弃装备的方法,在此类中已经定义,所以可以直接使用了
于是,
def refresh
release_unequippable_items
super
if @mp == 0
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
end
end
end
def refresh
release_unequippable_items
super
if @mp == 0
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
end
end
end
那么,如果武器栏为空而防具栏装备了防具呢?
if weapons.empty? && equips[1] != nil
if weapons.empty? && equips[1] != nil
意思是 如果武器为空并且装备栏的第二栏(防具)不为空
于是,同样的方法
def refresh
release_unequippable_items
super
if @mp == 0
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
end
if weapons.empty? && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
end
def refresh
release_unequippable_items
super
if @mp == 0
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
end
if weapons.empty? && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
end
写到这里,测试一下吧?当你进入游戏的时候迫不及待的打开装备栏想确认装备有没有装备上的时候....咦,你发现了第一个问题,
为什么装备不见了?明明在数据库中设定装备是有的呀?
我们来看一下写好的方法
if @mp == 0
嗯....不对,新游戏角色加入的时候会初始化的吧...嗯....那初始化的时候mp=0呀,哦,原来是因为这个原因啊
于是找到此类中的 初始化装备 方法
def init_equips(equips)
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
refresh
end
def init_equips(equips)
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
refresh
end
发现是在初始化之后调用了refresh方法,刚刚说了初始化mp=0,那么在这之后调用refresh的话就已经满足了if @mp == 0这个条件,那么怎么办呢?
那就先refresh一下再初始化装备吧
def init_equips(equips)
refresh
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
end
def init_equips(equips)
refresh
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
end
然后,进去测试了一下嗯...发现这个问题修复了,于是继续测试...咦,发现新问题了!
为什么我mp只回满了一次就让两件装备都消失了呢?!
打开脚本看看条件,发现问题了吧,第二个判断条件是 如果武器为空并有防具时,
那么,思考一下,如果我满足了第一个条件,此时武器已经消失,那要是防具装备着的话不就同时满足了第二个条件了吗?
那么,解决方法很多,我们可以利用最简单的开关来修复此bug
思路是当满足了第一个条件之后(武器消失,mp回满),打开1号开关,然后在第二个条件中加一个判断 如果1号开关为关闭的话
这样的话武器消失时1号开关打开了,于是第二个条件不满足了,防具就不会消失了,
那之后呢,执行为判断之后,让1号开关初始化吧(关闭),这样一来,就能实现我们的目的。
于是,最后,我们把刚刚的思路写到这个方法中。
class Game_Actor
def init_equips(equips)
refresh
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
end
def refresh
release_unequippable_items
super
if @mp == 0
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
$game_switches[1] = true
end
if weapons.empty? && equips[1] != nil && $game_switches[1] == false
@mp = mmp
discard_equip(equips[1])
end
end
$game_switches[1] = false
end
end
class Game_Actor
def init_equips(equips)
refresh
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
end
def refresh
release_unequippable_items
super
if @mp == 0
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
$game_switches[1] = true
end
if weapons.empty? && equips[1] != nil && $game_switches[1] == false
@mp = mmp
discard_equip(equips[1])
end
end
$game_switches[1] = false
end
end
这样一来,便实现了目的,什么?你想要把后面的装备栏也用到此方法中?那么,就自己动手改脚本吧~
作者: 小究就是我 时间: 2017-3-18 12:44
可是又有问题了:
二刀流的话武器会消失但是第二个武器不会消失,
这可怎么办????
作者: 魔法丶小肉包 时间: 2017-3-18 13:23
那么,我们可以加个判断,思路是如果mp为0并且双持武器的话怎么样?mp为0并且不双持武器的话又怎么样?
在Game_BattlerBase类中定义了一个判断是否双持武器的方法 dual_wield? 于是我们就调用此方法来进行判断
class Game_Actor
def init_equips(equips)
refresh
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
end
def refresh
release_unequippable_items
super
if @mp == 0 && !dual_wield?
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
elsif weapons.empty? && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
if @mp == 0 && dual_wield?
if equips[0] != nil
@mp = mmp
discard_equip(equips[0])
elsif equips[0] == nil && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
end
end
class Game_Actor
def init_equips(equips)
refresh
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
end
def refresh
release_unequippable_items
super
if @mp == 0 && !dual_wield?
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
elsif weapons.empty? && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
if @mp == 0 && dual_wield?
if equips[0] != nil
@mp = mmp
discard_equip(equips[0])
elsif equips[0] == nil && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
end
end
作者: 小究就是我 时间: 2017-3-22 18:22
最后麻烦一下大神:
就是当主角持有第二武器时,两把武器之间随机消失一个(要不然有人发现了这个规律就不好了)
作者: 魔法丶小肉包 时间: 2017-3-23 15:55
那么就改一下判断双持武器这一块的内容
使用随机数rand(2),随机0,1两个数
然后通过得到的值来实现随机丢掉装备的效果
class Game_Actor
def init_equips(equips)
refresh
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
end
def refresh
release_unequippable_items
super
if @mp == 0 && !dual_wield?
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
elsif weapons.empty? && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
if @mp == 0 && dual_wield?
if equips[0] != nil && equips[1] != nil
@mp = mmp
case rand(2)
when 0
discard_equip(equips[0])
when 1
@item = $data_weapons[equips[0].id]
change_equip(0, nil)
discard_equip(equips[1])
change_equip(0, @item)
end
elsif equips[0] != nil && equips[1] == nil
@mp = mmp
discard_equip(equips[0])
elsif equips[0] == nil && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
end
end
class Game_Actor
def init_equips(equips)
refresh
@equips = Array.new(equip_slots.size) { Game_BaseItem.new }
equips.each_with_index do |item_id, i|
etype_id = index_to_etype_id(i)
slot_id = empty_slot(etype_id)
@equips[slot_id].set_equip(etype_id == 0, item_id) if slot_id
end
end
def refresh
release_unequippable_items
super
if @mp == 0 && !dual_wield?
if !weapons.empty?
@mp = mmp
discard_equip(equips[0])
elsif weapons.empty? && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
if @mp == 0 && dual_wield?
if equips[0] != nil && equips[1] != nil
@mp = mmp
case rand(2)
when 0
discard_equip(equips[0])
when 1
@item = $data_weapons[equips[0].id]
change_equip(0, nil)
discard_equip(equips[1])
change_equip(0, @item)
end
elsif equips[0] != nil && equips[1] == nil
@mp = mmp
discard_equip(equips[0])
elsif equips[0] == nil && equips[1] != nil
@mp = mmp
discard_equip(equips[1])
end
end
end
end
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |