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

Project1

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

[已经解决] 我想重新定义一下角色的属性,新人刚学脚本

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
33 小时
注册时间
2011-6-27
帖子
49
跳转到指定楼层
1
发表于 2013-12-24 15:40:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我的意思是,角色不止需要攻击力、防御力等属性,还有比如友好度、其他攻击类型的攻击力等。
是不是涉及到数据库的范畴?我只看过va的新人教程,并不能灵活运用,所以请教下该如何为角色新增属性。

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42322
在线时间
7597 小时
注册时间
2009-7-6
帖子
13505

开拓者贵宾

2
发表于 2013-12-24 16:16:20 | 只看该作者
这个只能在脚本里给角色新增属性,增加之后就不能在数据库里编辑了,只能在脚本里编辑,当然可以通过某些取巧的方法比如读取注释之类的方法来写。
普通的数值还好,如果是攻击力那种参与各种计算的东西- -你还是自己琢磨吧。
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
33 小时
注册时间
2011-6-27
帖子
49
3
 楼主| 发表于 2013-12-24 16:21:14 | 只看该作者
fux2 发表于 2013-12-24 16:16
这个只能在脚本里给角色新增属性,增加之后就不能在数据库里编辑了,只能在脚本里编辑,当然可以通过某些取 ...

我应该怎么做?
我的想法是,新增一个角色属性类,里面的实例变量就是新属性,以角色ID作为主键关联每个角色。但是那些属性该如何保存到数据中?
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

4
发表于 2013-12-24 16:25:14 | 只看该作者
本帖最后由 taroxd 于 2013-12-26 06:40 编辑

首先不推荐没事增加属性,用起来肯定是没有官方给定的属性简单的。
以下无环境瞎扯,添加一个非常简单的属性,有帮助就看看吧。

假设要增加一个属性,叫友好度
首先定义友好度

class Game_BattlerBase
  attr_accessor  :fri    #友好度

  alias fri_initialize initialize
  def initialize
    fri_initialize
    @fri = 50
  end                    #默认的友好度为50
end

然后在想要改变某角色(在此称为actor)的友好度的地方写
actor.fri = x # x是变成的数值,支持+=、-=等运算符

举例:在事件中运行脚本 $game_actors[1].fri += 5

在需要用到该角色的友好度时,可以用 actor.fri

比如在技能的伤害公式里写 a.fri - b.def 什么的


继续举例:每升一级友好度+1

在class Game_BattlerBase中继续添加

  alias fri_level_up level_up
  def level_up
    fri_level_up
    @fri += 1  #这里当然可以用更复杂的表达式,看你的需要。
  end

-----------------------以上是超超超简易版本---------------------

如果需要装备,状态等能增加属性,那就不要这样比较好,推荐模仿原来的系统定义新属性。以下考虑敌人也有该属性的情况。

大概是这样(再次重申:没环境没测试,有问题很正常!)

class Game_BattlerBase
  def fri
    (fri_base + fri_plus) * fri_rate    #(基础值 + 装备添加值)* 状态对该属性的影响
  end
end

装备添加值和状态变化率都是可以定义的,可以通过装备和状态的注释来实现
基础值也是要自己定义的,可以设计成等级的函数之类的,这可以依赖职业的注释来实现。

举个例子
class RPG::EquipItem #没环境,拼错了不要怪我。为了方便其实也可以直接在RPG::BaseItem里定义
  def fri
   @note =~ /<FRI\s+(-*\d+)>/i ? $1.to_i : 0  #这里用到了正则表达式,大概意思是只要在装备处注释"<fri x>"就可以实现该装备提升x点友好度。
  end
end

class Game_BattlerBase
  attr_reader  :fri_plus

  alias fri_initialize initialize
  def initialize #把友好度的附加值初始化为0
    fri_initialize
    @fri_plus = 0
  end   

  def add_fri(value) #有了这个方法,就能在事件里增减能力值了。例: $game_actors[1].add_fri(1)。value可以为负数
    @fri_plus += value
    refresh
  end
end

class Game_Actor
  def fri_plus
     equips.compact.inject(super) {|r, item| r + item.fri }  #再增加装备的附加值
  end
end

附加值部分差不多就是上面这一部分

对于基础值,可以这样

class Game_BattlerBase
  def fri_base
    return 0  #填一个防止出错
  end
end

class Game_Actor
  def fri_base
   @level * 2 + 1  #填入对角色的计算公式。这里可以使用@level等数据,也可以使用职业、角色等各种地方填的注释
  end
end

class Game_Enemy
  def fri_base
     #填入对敌人的计算公式。这里当然推荐使用敌人的注释啦~ 方法同“装备增加友好度”,可查F1。
  end
end

同样的方法定义状态对该属性的影响,善用状态的注释。为了防止出错先写一下吧。
class Game_BattlerBase
  def fri_rate
    return 1  #依据实际情况更改!
  end
end

然后需要改写菜单显示这个属性,这个模仿原来的属性窗口就行了,不多作解释。
最后,你就可以在技能公式栏里运用这个属性了。 差不多就这点吧……

评分

参与人数 1星屑 +320 收起 理由
fux2 + 320 给你32个赞

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
33 小时
注册时间
2011-6-27
帖子
49
5
 楼主| 发表于 2013-12-24 16:48:33 | 只看该作者
taroxd 发表于 2013-12-24 16:25
首先不推荐没事增加属性,用起来肯定是没有官方给定的属性简单的。
以下无环境瞎扯,添加一个非常简单的属 ...

多谢你的回答!我会去试试的。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

6
发表于 2013-12-24 17:50:31 | 只看该作者
本帖最后由 taroxd 于 2013-12-26 06:41 编辑

按照第二种方式写的话,最后未完成的结果如下(删去冗长的注释,可自行补加):

RUBY 代码复制
  1. class RPG::BaseItem
  2.   def fri
  3.     @note =~ /<FRI\s+(-*\d+)>/i ? $1.to_i : 0
  4.   end
  5. end
  6.  
  7. class Game_BattlerBase
  8.  
  9.   attr_reader  :fri_plus
  10.  
  11.   def fri
  12.     (fri_base + fri_plus) * fri_rate
  13.   end
  14.  
  15.   alias fri_initialize initialize
  16.   def initialize
  17.     fri_initialize
  18.     @fri_plus = 0
  19.   end   
  20.  
  21.   def add_fri(fri) #用于事件中增减属性
  22.     @fri_plus += fri
  23.     refresh
  24.   end
  25.  
  26.   def fri_base
  27.     return 0
  28.   end
  29.  
  30.   def fri_rate
  31.     return 1        #根据实际情况更改!
  32.   end
  33. end
  34.  
  35. class Game_Actor
  36.  
  37.   def fri_base
  38.     [url=home.php?mod=space&uid=22147]@level[/url] * 2 + 1  #根据实际情况更改!
  39.     #多余的东西不要看,你懂的
  40.   end
  41.  
  42.   def fri_plus
  43.     equips.compact.inject(super) {|r, item| r + item.fri }
  44.   end
  45. end
  46.  
  47. class Game_Enemy
  48.   def fri_base
  49.     enemy.fri
  50.   end
  51. end


没有环境,有错误请指正

评分

参与人数 1梦石 +1 收起 理由
Sion + 1 感谢帮忙

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
33 小时
注册时间
2011-6-27
帖子
49
7
 楼主| 发表于 2013-12-25 12:19:50 | 只看该作者
taroxd 发表于 2013-12-24 17:50
按照第二种方式写的话,最后未完成的结果如下(删去冗长的注释,可自行补加):

class RPG::BaseItem

我想问下RPG::EquipItem 这种写法(命名方式?)是什么意思?
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

8
发表于 2013-12-25 12:35:44 | 只看该作者
阿薯救世主 发表于 2013-12-25 12:19
我想问下RPG::EquipItem 这种写法(命名方式?)是什么意思?

你可以简单理解为就是一个类,这是一个游戏内建的类(参见F1)
------------------------以下可以无视---------------------
和下面是一样的,EquipItem可以看成RPG模块的一个常量
module RPG
  class EquipItem
    #def methods
  end
end
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
33 小时
注册时间
2011-6-27
帖子
49
9
 楼主| 发表于 2013-12-25 13:12:04 | 只看该作者
taroxd 发表于 2013-12-25 12:35
你可以简单理解为就是一个类,这是一个游戏内建的类(参见F1)
------------------------以下可以无视--- ...

我设想:
      因为我不想动元脚本的东西,所以我新建一个类继承了Game_Actor,然后这个类就是处理新增属性的东西。然后使用$game_actor这个全局变量就可以在事件的脚本中调用了吗?

比如说,那个事件脚本是空白的,我想让这个事件将我的角色斩切攻击力提升2点,于是我就写上
$game_actors[0].atk_brade += 2  这一句就行了?

注:atk_brade已经在新类中定义好了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
218 小时
注册时间
2013-12-17
帖子
386
10
发表于 2013-12-25 13:48:55 | 只看该作者
楼主的办法有些纰漏、
好感度是一个相对属性,仅仅一个变量不足以完整的标示好感度。
好感度应该是一个hash(hash还好点)
hash的主键应该为Actor的ID
hash的值应该为对该角色的好感度。
RM脚本定制/修改/整合 群:143356012(入群注明来意)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-12 19:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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