查看: 2042|回复: 8

[已经解决] 怎么样能做到这样的效果

[复制链接]
梦石
0
星屑
40
在线时间
80 小时
注册时间
2014-11-3
回帖
48
发表于 2017-3-16 19:01:01 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
就是如果有一个角色的魔力值到了0时,他的武器就会消失,但是魔力回满,
如果没有武器那就消耗第二栏装备(也就是护盾)
最好是脚本!谢了!!!!!!!
梦石
0
星屑
6375
在线时间
1473 小时
注册时间
2015-7-25
回帖
609

极短25参与开拓者

发表于 2017-3-17 20:50:29 | 显示全部楼层
由于是mp和装备相关,那么我们就选择Game_Actor类下手吧
那么,在Game_Actor类中定义了refresh方法,也就是刷新角色数据的方法,于是我们就从这个方法开刀吧=w=
这是默认脚本中定义的方法
[pre lang="ruby"]def refresh
    release_unequippable_items
    super
  end[/pre]
那么,看到super,于是查找一下父类所写的方法,得知
[pre lang="ruby"]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[/pre]
哦,那么正好,父类中的refresh方法已经定义了@mp
因此,在super之下,我们就可以开始直接使用@mp了
那么,现在的思路是 当mp等于0时,失去装备并回复满mp
于是
[pre lang="ruby"]def refresh
    release_unequippable_items
    super
    if @mp == 0
    end
end[/pre]
先打好框架,接下来,就只需要往里面填入方法了
那么,首先要判断武器是不是装备了?
[pre lang="ruby"]!weapons.empty?[/pre]
这句代码用来判断吧,意思是 武器不为空
那mp怎么回满呢? [pre lang="ruby"]@mp = mmp[/pre]
那怎么失去装备呢?失去,就是丢掉咯?那么 [pre lang="ruby"]discard_equip(equips[0])[/pre]
其中equips[0]为装备栏的第一行(就是武器栏)
而discard_equip为丢弃装备的方法,在此类中已经定义,所以可以直接使用了
于是,
[pre lang="ruby"]def refresh
    release_unequippable_items
    super
    if @mp == 0
      if !weapons.empty?
        @mp = mmp
        discard_equip(equips[0])
      end
    end
end[/pre]
那么,如果武器栏为空而防具栏装备了防具呢?
[pre lang="ruby"]if weapons.empty? && equips[1] != nil[/pre]
意思是 如果武器为空并且装备栏的第二栏(防具)不为空
于是,同样的方法
[pre lang="ruby"]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[/pre]
写到这里,测试一下吧?当你进入游戏的时候迫不及待的打开装备栏想确认装备有没有装备上的时候....咦,你发现了第一个问题,
为什么装备不见了?明明在数据库中设定装备是有的呀?
我们来看一下写好的方法
if @mp == 0
嗯....不对,新游戏角色加入的时候会初始化的吧...嗯....那初始化的时候mp=0呀,哦,原来是因为这个原因啊
于是找到此类中的 初始化装备 方法
[pre lang="ruby"]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[/pre]
发现是在初始化之后调用了refresh方法,刚刚说了初始化mp=0,那么在这之后调用refresh的话就已经满足了if @mp == 0这个条件,那么怎么办呢?
那就先refresh一下再初始化装备吧
[pre lang="ruby"]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[/pre]
然后,进去测试了一下嗯...发现这个问题修复了,于是继续测试...咦,发现新问题了!
为什么我mp只回满了一次就让两件装备都消失了呢?!
打开脚本看看条件,发现问题了吧,第二个判断条件是 如果武器为空并有防具时,
那么,思考一下,如果我满足了第一个条件,此时武器已经消失,那要是防具装备着的话不就同时满足了第二个条件了吗?
那么,解决方法很多,我们可以利用最简单的开关来修复此bug
思路是当满足了第一个条件之后(武器消失,mp回满),打开1号开关,然后在第二个条件中加一个判断 如果1号开关为关闭的话
这样的话武器消失时1号开关打开了,于是第二个条件不满足了,防具就不会消失了,
那之后呢,执行为判断之后,让1号开关初始化吧(关闭),这样一来,就能实现我们的目的。
于是,最后,我们把刚刚的思路写到这个方法中。
[pre lang="ruby"]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[/pre]

这样一来,便实现了目的,什么?你想要把后面的装备栏也用到此方法中?那么,就自己动手改脚本吧~

点评

或是用遍歷裝備欄 回復MP之後跳出處理  发表于 2017-3-18 12:39
其實可以用elsif判斷這樣就不用開關了=w=  发表于 2017-3-18 12:37
感觉好厉害的样子~虽然不会脚本,但是讲的很棒!非常感谢!!!!  发表于 2017-3-18 07:56

评分

参与人数 2星屑 +55 收起 理由
QQ蚊子湯 + 45 精品文章咬一口=w="
小究就是我 + 10 塞糖

查看全部评分

笨肉包的游戏讨论群932812135 (实时更新) 喜欢的话欢迎加入~
目前的坑
??? #像素风OC游戏 准备中 短篇-约5小时
花城梦之心 #像素风OC游戏 系统开发+素材绘制中
【不可思议的迷宫】幽灵契约外传:歌莉娅 v0.4 游戏文件已更新
同时更新中~ (沉迷摸鱼中~更新速度较慢请见谅w)
这是属于笨肉包一个人的旅行~(这只肉包又在摸鱼!
旅途的最终目标~ ???(保密~
回复 2 0

使用道具 举报

梦石
0
星屑
40
在线时间
80 小时
注册时间
2014-11-3
回帖
48
 楼主| 发表于 2017-3-18 12:44:09 | 显示全部楼层
魔法丶小肉包 发表于 2017-3-17 20:50
由于是mp和装备相关,那么我们就选择Game_Actor类下手吧
那么,在Game_Actor类中定义了refresh方法,也就是 ...

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

使用道具 举报

梦石
0
星屑
6375
在线时间
1473 小时
注册时间
2015-7-25
回帖
609

极短25参与开拓者

发表于 2017-3-18 13:23:44 | 显示全部楼层
小究就是我 发表于 2017-3-18 12:44
可是又有问题了:
二刀流的话武器会消失但是第二个武器不会消失,
这可怎么办????

那么,我们可以加个判断,思路是如果mp为0并且双持武器的话怎么样?mp为0并且不双持武器的话又怎么样?
在Game_BattlerBase类中定义了一个判断是否双持武器的方法 dual_wield? 于是我们就调用此方法来进行判断
[pre lang="ruby"]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
[/pre]

评分

参与人数 1星屑 +10 收起 理由
小究就是我 + 10 我很赞同

查看全部评分

笨肉包的游戏讨论群932812135 (实时更新) 喜欢的话欢迎加入~
目前的坑
??? #像素风OC游戏 准备中 短篇-约5小时
花城梦之心 #像素风OC游戏 系统开发+素材绘制中
【不可思议的迷宫】幽灵契约外传:歌莉娅 v0.4 游戏文件已更新
同时更新中~ (沉迷摸鱼中~更新速度较慢请见谅w)
这是属于笨肉包一个人的旅行~(这只肉包又在摸鱼!
旅途的最终目标~ ???(保密~
回复

使用道具 举报

梦石
0
星屑
40
在线时间
80 小时
注册时间
2014-11-3
回帖
48
 楼主| 发表于 2017-3-22 18:22:21 | 显示全部楼层
魔法丶小肉包 发表于 2017-3-18 13:23
那么,我们可以加个判断,思路是如果mp为0并且双持武器的话怎么样?mp为0并且不双持武器的话又怎么样?
...

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

使用道具 举报

梦石
0
星屑
6375
在线时间
1473 小时
注册时间
2015-7-25
回帖
609

极短25参与开拓者

发表于 2017-3-23 15:55:41 | 显示全部楼层
小究就是我 发表于 2017-3-22 18:22
最后麻烦一下大神:
就是当主角持有第二武器时,两把武器之间随机消失一个(要不然有人发现了这个规律就 ...

那么就改一下判断双持武器这一块的内容
使用随机数rand(2),随机0,1两个数
然后通过得到的值来实现随机丢掉装备的效果
[pre lang="ruby"]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
[/pre]

评分

参与人数 3星屑 +40 梦石 +2 收起 理由
RaidenInfinity + 2 认可答案
小究就是我 + 10 非常感谢!大神万岁!!!!
鸟猫 + 30 精品文章

查看全部评分

笨肉包的游戏讨论群932812135 (实时更新) 喜欢的话欢迎加入~
目前的坑
??? #像素风OC游戏 准备中 短篇-约5小时
花城梦之心 #像素风OC游戏 系统开发+素材绘制中
【不可思议的迷宫】幽灵契约外传:歌莉娅 v0.4 游戏文件已更新
同时更新中~ (沉迷摸鱼中~更新速度较慢请见谅w)
这是属于笨肉包一个人的旅行~(这只肉包又在摸鱼!
旅途的最终目标~ ???(保密~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部