设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1760|回复: 8
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
40
在线时间
80 小时
注册时间
2014-11-3
帖子
71
跳转到指定楼层
1
发表于 2017-3-16 19:01:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
就是如果有一个角色的魔力值到了0时,他的武器就会消失,但是魔力回满,
如果没有武器那就消耗第二栏装备(也就是护盾)
最好是脚本!谢了!!!!!!!

Lv4.逐梦者

梦石
0
星屑
6260
在线时间
1481 小时
注册时间
2015-7-25
帖子
652

开拓者

2
发表于 2017-3-17 20:50:29 | 只看该作者
由于是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


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

点评

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

评分

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

查看全部评分

笨肉包的首款像素OC游戏《花城梦之心》尝试制作中~
目前的坑 【不可思议的迷宫】幽灵契约外传:歌莉娅
持续更新中~ 当前进度 v0.28
大版本更新时才会更新网盘文件,预计下次大版本更新:v0.30
完成度:
主线 15% 支线 0% 数据库 6% 系统 86% 美术 6%
两边同时填坑~
( 这里是笨肉包~专修魔法!目标是大魔法师!
( 坑太大啦,一个人填不完啦hhh 一定会填完的嗯...
( 每天都和bug们比试魔力~吾之魔法将扫平一切!
( 弱点是美术,魔法修行之余再补补课吧~
( 哼哼哼~这便是魔法的力量!
大家都离开啦,笨肉包也不知道还能坚持多久呀...
这是属于笨肉包一个人的旅行(再见了...蚊子湯,七重酱,笨肉包永远想你们!TwT
回复 支持 2 反对 0

使用道具 举报

Lv1.梦旅人

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

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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6260
在线时间
1481 小时
注册时间
2015-7-25
帖子
652

开拓者

4
发表于 2017-3-18 13:23:44 | 只看该作者
小究就是我 发表于 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

评分

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

查看全部评分

笨肉包的首款像素OC游戏《花城梦之心》尝试制作中~
目前的坑 【不可思议的迷宫】幽灵契约外传:歌莉娅
持续更新中~ 当前进度 v0.28
大版本更新时才会更新网盘文件,预计下次大版本更新:v0.30
完成度:
主线 15% 支线 0% 数据库 6% 系统 86% 美术 6%
两边同时填坑~
( 这里是笨肉包~专修魔法!目标是大魔法师!
( 坑太大啦,一个人填不完啦hhh 一定会填完的嗯...
( 每天都和bug们比试魔力~吾之魔法将扫平一切!
( 弱点是美术,魔法修行之余再补补课吧~
( 哼哼哼~这便是魔法的力量!
大家都离开啦,笨肉包也不知道还能坚持多久呀...
这是属于笨肉包一个人的旅行(再见了...蚊子湯,七重酱,笨肉包永远想你们!TwT
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6260
在线时间
1481 小时
注册时间
2015-7-25
帖子
652

开拓者

6
发表于 2017-3-23 15:55:41 | 只看该作者
小究就是我 发表于 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

评分

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

查看全部评分

笨肉包的首款像素OC游戏《花城梦之心》尝试制作中~
目前的坑 【不可思议的迷宫】幽灵契约外传:歌莉娅
持续更新中~ 当前进度 v0.28
大版本更新时才会更新网盘文件,预计下次大版本更新:v0.30
完成度:
主线 15% 支线 0% 数据库 6% 系统 86% 美术 6%
两边同时填坑~
( 这里是笨肉包~专修魔法!目标是大魔法师!
( 坑太大啦,一个人填不完啦hhh 一定会填完的嗯...
( 每天都和bug们比试魔力~吾之魔法将扫平一切!
( 弱点是美术,魔法修行之余再补补课吧~
( 哼哼哼~这便是魔法的力量!
大家都离开啦,笨肉包也不知道还能坚持多久呀...
这是属于笨肉包一个人的旅行(再见了...蚊子湯,七重酱,笨肉包永远想你们!TwT
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 05:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表