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

Project1

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

[已经解决] XP中该如何制作一个新的状态……附上心路历程若干……

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
59 小时
注册时间
2015-12-24
帖子
41
跳转到指定楼层
1
发表于 2016-1-13 19:56:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
首先假设基本伤害如下:
     在game_battle 3中
      # 计算基本伤害
      atk = 1.0* [attacker.hit / self.pdef ].max    (顺便问一下 .MAX是什么作用呢……)
      self.damage = 1.0* atk * (20 + attacker.str) / 20

此时,我希望角色装备单手剑以后命中增加为:(STR+DEX)/2,双手剑命中增加 STR*1 ……就是不同的武器类型所增加的命中判定条件不同。

那么我首先想到的实现方式是:判断所装备武器的调用动画来锁定武器类型,再根据武器类型来带入不同的公式,然后我就觉得这是个大工程……

另觅出路后,我觉得结合事件来做可能比较容易实现,可能是会繁琐一点,但是对我可能比较容易实现。- -0
1、“变更装备”不同的装备打开不同的开关。
2、根据开关来设定对应的“增加状态”
3、通过脚本增加一个状态。(我觉得通过数据库增加的状态中,好像不能设置“命中 =100+(STR+DEX)/2”这种状态)

问题就是,我通过F1查找“状态”找到了 $data_states 这家伙
然后在脚本中查找 $data_states  觉得应该是game_battle 2或game_battle 1中,然后就……迷路了……找不到参照物来定义一个新的“状态,我现在也就是照猫画虎修修补补的LV……苦-0-

于是就来请求帮助了……到底该如何制作一个状态呢?

点评

顺便回答一下.max的作用是在一个数组里面取一个最大的值。  发表于 2016-1-14 00:15

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

2
发表于 2016-1-13 21:56:30 | 只看该作者
推荐使用下面的方法。
1. 新建[属性],表示武器的类型。在这里,使用的是[属性],而不是[状态],这是因为武器没有[自动状态]这个特性。
例如,你可以在属性里添加名为“单手剑”,“双手剑”的属性,然后在数据库设置的时候勾选即可。
2. 更改命中判定。
在Game_Battler3中,里面有两个方法非常重要,一个是attack_effect,一个是skill_effect。
其中,attack_effect表示受到普通攻击的效果,skill_effect表示受到特技攻击的效果。
看样子楼主是想修改attack_effect,那么我就继续说一下该怎么修改。
在attack_effect定义内,attacker表示攻击方,self表示被攻击方。
首先,获取武器可以用$data_weapons[attacker.weapon_id]进行获取,返回的是一个武器对象。要注意,如果attacker是敌人,那么敌人是没有weapon_id这个属性的,因此最好这样写:
RUBY 代码复制
  1. weapon = attacker.is_a?(Game_Actor) ? $data_weapons[attacker.weapon_id] : nil

上面这句话是说,如果攻击方是主角,那么获取他所持武器,否则返回nil。注意,如果主角身上没有装备武器,也会返回nil。
然后,获取武器的属性,这个可以用weapon.element_set来获取(当weapon为nil时,不能这样获取,需要额外处理即可)。
element_set是一个ID数组,里面包含了所有该武器的属性。假如你的“单手剑”属性ID为8,那么判断该武器是不是单手剑,可以用下面的代码:
RUBY 代码复制
  1. if weapon != nil && weapon.element_set.include?(8)
  2.   # do something
  3. end

在if里面写上你想要的特殊效果就行了。

点评

太坏了,楼下的打击积极性。刚刚花了2个小时,在同事的指导下实现了“拉丁猪文字游戏”……同事评语:悟性E  发表于 2016-1-14 16:22
puts gets.chomp.reverse  发表于 2016-1-14 13:18
收到~~多谢RB大大。我向单位的同事询问怎么学习编程,他说他给我出题,让我用RUBY写。今天的题目是将输入的字符串反转输出……【刚八代】  发表于 2016-1-14 12:58
我是在跟评分的taroxd说话……  发表于 2016-1-14 12:56
因为RMXP已经出了很久了,功能上比VX和VA都少很多。所以很多在VA里面现成的功能在XP里面需要自己做。另外楼主提升论坛等级至[剑士]就可以评分了。  发表于 2016-1-14 12:56

评分

参与人数 1梦石 +2 收起 理由
taroxd + 2 你们XP真是麻烦

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
59 小时
注册时间
2015-12-24
帖子
41
3
 楼主| 发表于 2016-1-14 00:56:17 | 只看该作者
RyanBern 发表于 2016-1-13 21:56
推荐使用下面的方法。
1. 新建[属性],表示武器的类型。在这里,使用的是[属性],而不是[状态],这是因为武 ...


Game_battle 3 55 行 发生了NoMethoderror错误,undefined method 'hit'=for #<Game_Actor:0x2ec9ca8>

代码如下……


去查了下:
ruby 1.7 特性: 若调用了未定义的方法时,就会引发该异常.

self.bar
=> -:1: undefined method `bar' for #<Object:0x401a6c40> (NoMethodError)
但对我==天书

我一度以为:因为@hit是个默认的定值无法这样直接计算……但换成attacter.pdef,也会报错,我就没搞明白为什么了……
再次请求帮助……在下实在是愚钝……喂到嘴边都吞不下……5555

PS:如果将if...end换成case...end
RUBY 代码复制
  1. case weapon != nil && weapon.element_set.include?(i)
  2.      when 8  
  3.           #效果
  4.      when 9
  5.           #效果
  6. end

这样写是否可以达到增添多个武器属性的目的呢?

感谢@cinderelmini的指点

点评

最后,这样使用case是无法达到效果的。最简单的办法是for i in weapon.element_set,然后再使用case i即可  发表于 2016-1-14 01:15
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

4
发表于 2016-1-14 01:10:47 | 只看该作者
本帖最后由 RyanBern 于 2016-1-14 09:45 编辑
阿竹天 发表于 2016-1-14 00:56
Game_battle 3 55 行 发生了NoMethoderror错误,undefined method 'hit'=for #

代码如下……


attacker的hit属性只能读取但是不能赋值的,所以写成attacker.hit=XXX是不对的。另外,楼主这样写是无法达到效果的,因为你把命中率修正写在了命中判定的后面,所以这样做是没有效果的。
解决的办法有两种。
第一种是写成
RUBY 代码复制
  1. hit_rate = 100 + (attacker.str + attacker.dex) / 2

之后所有的判定命中与否用hit变量即可,这个地方放在attack_effect的# 第一命中判定 之前即可。
第二种方法是直接在Game_Actor中定义hit,由于Game_Actor里面已经继承了Game_Battler的hit方法,此处实际上是覆盖了原有的方法。如果采用这种办法,需要将武器的判定也改到hit的定义中去,这样就无需在attack_effect里面再次定义。由于是在Game_Actor下定义,所以不需要判定攻击方是否为Game_Actor。
因此可以在Game_Actor中追加定义如下:
RUBY 代码复制
  1. def hit
  2.   n = 100
  3.   # 获取武器,这里注意@weapon_id就是当前对象的武器ID
  4.   weapon = $data_weapons[@weapon_id]
  5.   # 如果武器持有 8 号属性
  6.   if weapon != nil && weapon.element_set.include?(8)
  7.     # 修改命中率
  8.     n += (self.str + self.dex) / 2
  9.   end
  10.   # 计算状态对命中率的影响
  11.   for i in @states
  12.     n *= $data_states[i].hit_rate / 100.0
  13.   end
  14.   return Integer(n)
  15. end

点评

泪目……叩谢!  发表于 2016-1-14 01:20

评分

参与人数 1星屑 +100 收起 理由
邪月长啸 + 100 顺带学习了

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 22:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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