Project1

标题: 请问一个RGSS的问题 [打印本页]

作者: kvkv97    时间: 2014-11-9 11:06
标题: 请问一个RGSS的问题
3,
  def draw_actor_graphic(actor, x, y)
    bitmap = RPG::Cache.character(actor.character_name,     actor.character_hue)
    src_rect = Rect.new(0, 0, 32, 48)
    self.contents.blt(x, y , bitmap, src_rect)
  end
a,文件名 的各种表示法:有直接用""的,也有用""+参数.文件名,那么这个语句actor.character_name的表达法合理吗?character_name是哪个类的方法?
b,参数actor是局部变量,不是需要被赋值后才能用吗?我搜了全局了,在 窗口菜单类 里面有,可是里面的actor 似乎 也未被赋值的。


作者: 芯☆淡茹水    时间: 2014-11-9 11:20
本帖最后由 芯☆淡茹水 于 2014-11-9 11:24 编辑

1: actor 是传递过来的参数,比如在 Window_MenuStatus 里的一句:
  1. actor = $game_party.actors[i]
  2. draw_actor_graphic(actor, x - 40, y + 80)
复制代码
这个 actor 也就是 Game_Actor ,而 Game_Actor 里:attr_reader   :character_name 。
所以这个 character_name 就是这么来的。
2:同上面所说, actor 是传递过来的参数,不需要赋值。只需在使用这个方法的时候赋值。也可以预先设定某个参数的
缺省值。
作者: 芯☆淡茹水    时间: 2014-11-9 11:39
  1. # 比如预先定义一个 数值计算 的方法 :numerical ,而这个方法需要 2 个
  2. # 数值相加。这 2 个数值在方法参数里可以随意用变量名表示,这里为:var1 和 var2
  3. def numerical(var1, var2)
  4.   p var1 + var2
  5. end
  6. # 括号里的 var1 和 var2 分别代表使用这个方法是传递过来的2个数值参数。
  7. # 在运用这个方法时:
  8. numerical(2, 3) # 显示是:5
  9. # 所以不用纠结于方法参数里的变量名,也可以把 actor 改为 a ,比如下面这样
  10. #也行:
  11. def draw_actor_graphic(a, x, y)
  12.     bitmap = RPG::Cache.character(a.character_name,     a.character_hue)
  13.     src_rect = Rect.new(0, 0, 32, 48)
  14.     self.contents.blt(x, y , bitmap, src_rect)
  15.   end
  16. # 只要在运用这个方法时,传递过来的参数无误就行。
复制代码

作者: RyanBern    时间: 2014-11-9 12:19
补充芯大的,那个+不是文件名特有的表示法,而是字符串的一个方法self + other,表示把两个字符串连起来。
文件名的话,因为是RPG::Cache.character方法,所以不用输入完整的路径+文件名,只需要图片的名字就可以了。
不过Bitmap.new("filename")这里就要输入路径+文件名。
第二个问题是你没搞清参数和局部变量的区别,形式参数在函数定义中可以放心使用,因为它的值是由实际参数确定的,只要你的实际参数是正确的,那么就没什么问题(所以可以理解为这个变量在方法刚开始执行的时候就有值了,值为你传递的实际参数)。
作者: kvkv97    时间: 2014-11-9 19:21
本帖最后由 RyanBern 于 2014-11-9 19:57 编辑

继续我的问题(回去看了下,还有疑惑,所以继续 下来了):
1,Window_MenuStatus类里面有:
RUBY 代码复制
  1. actor = $game_party.actors[i]
  2. draw_actor_graphic(actor, x, y)
  3. 我就去查Game_Party类了,结果查出
  4. attr_reader   :actors                   # 角色
  5. def initialize
  6.     # 建立角色序列
  7.     @actors = []
  8. end

问题是:我发现$game_party.actors后面带了[ ],actors是属性@actors,那么[ ]不知道什么意思?   
2,Game_Actor类里面有:
attr_reader   :character_name           # 角色 文件名
问题:RPG::Cache.character(aaaactor.character_name,     aaaactor.character_hue)参数aaaactor是传递来的量,是属于Game_Party类的,怎么可以调用起Game_Actor类的方法来呢?

@RyanBern,@芯☆淡茹水,@恐惧剑仞
作者: taroxd    时间: 2014-11-9 19:40
本帖最后由 taroxd 于 2014-11-9 19:42 编辑
kvkv97 发表于 2014-11-9 19:21
继续我的问题(回去看了下,还有疑惑,所以继续 下来了):
1,Window_MenuStatus类里面有:
actor = $gam ...


$game_party 才是 Game_Party 类的。

你想知道 actor 是什么类的实例的话,可以执行 p actor.class 查看。

另外,好的命名习惯很重要。比如说,看到 actor、actors 的变量名,我就知道变量里是什么类的实例了。

作者: 芯☆淡茹水    时间: 2014-11-9 20:10
本帖最后由 芯☆淡茹水 于 2014-11-9 20:17 编辑

Game_Party 的 actors 是包含游戏队伍所有角色的数组,里面的每个单元都是一个 Game_Actor 。
而 [] 是调用与索引相对应的 actors 里的某个角色:Game_Actor
作者: OCTSJimmy    时间: 2014-11-9 20:18
本帖最后由 OCTSJimmy 于 2014-11-9 20:48 编辑
kvkv97 发表于 2014-11-9 19:21
继续我的问题(回去看了下,还有疑惑,所以继续 下来了):
1,Window_MenuStatus类里面有:
actor = $gam ...


首先问题1:@actors = [] 中 []表示数组。
数组举例:
比如现在我有三个数字要放在变量中,可以a=1,b=2,c=3但是使用的时候,就只能使用 x=a, x=b, x=c这样子,可万一在循环中就完蛋了,例如:
for i in 1..3
   p a
   p b
   p c
end
可这样子,循环的时候a、b、c全都被打印了三遍。
假如换成数组的话:
RUBY 代码复制
  1. a[0] = 1
  2. a[1] = 2
  3. a[2] = 3
  4. for i in 0..2
  5.    p a[i]
  6. end

这样子就会a[0]至a[2]每个数字各打印一遍了。
问题二:
楼主或许没有太理解方法/函数/过程(它们指的是一个东东,只是叫法不同)的概念。
函数的定义:

def 函数名称([传入参数1变量名], [传入参数2变量名], [传入参数3变量名]...)
   #代码段
end
例如:
def a(canshu1)
  p canshu1#这里就用到了传入的参数1
end

还是建议楼主多看F1,不行就照抄,觉得该抄什么就抄,抄下来不合用就自己改,改完了就直接运行,挂了就知道没改对,去找找有没有类似的代码片段,与要改的这节有什么不同,不同的地方差不多就是可以改的,继续试。

[line]2[/line]

为了避免连帖,我就在这里编辑吧。

在F1中有说明各个系统自带类的来龙去脉的。
(以下脱离RM环境,纯解释类的概念)

另外Game_Party可以认为是一个队伍类,那么可以这样思考:
队伍类中需要包含什么?
1、队员,队员由角色组成,因此每位队员就是一个Game_Actor
2、队伍需要在地图的任意一个点显示,因此哪个点就很关键了,这就是坐标
3、队伍有一个包裹,用来装每个角色用不到的装备,以及大家都能使用的物品、药剂等
4、队伍里有一个钱袋,放着大家所有的钱钱
5、……等等等等……
如此封装后,就成了队伍类,需要队伍中的数据,就可以通过队伍类中的方法或成员获取到了。
类中可以引用其他类,作为成员封装进该类中。
比如角色,它也是一个类,那么怎样描述一位角色呢?
1、角色有一个炫酷的外形
2、角色有生命值、魔法值、经验值
3、角色有各个部位的装备
4、角色有它的成名绝技,各种技能
5、角色有它的攻击力、防御力、躲避率
6、角色的各种状态
7、……等等……

还比如,生命值,它也可以封装为一个类,例如:
1、当前生命值
2、最大生命值
3、最小生命值,低于这个数就死亡啦。
4、生命值回复周期
5、上一次生命值回复的时间
6、生命值的成长比例
7、变更生命值的方法
       这里为什么把变更生命值的方法放在生命值的类中呢?因为生命值最大不能超过最大生命值,最小不能小于最小生命值(否则返回死亡状态)。
       这样在其他地方应用的时候,就不需要再判定最大生命值、最小生命值等等东西了,直接使用这个方法,是不是轻松得多?
8、……等等……
作者: kvkv97    时间: 2014-11-10 21:02
本帖最后由 kvkv97 于 2014-11-10 21:07 编辑

我还有问题 存在疑惑:
draw_actor_graphic(actor, x, y) 中 的actor参数是引用语句actor = $game_party.actors的 局部变量actor吗?
actor = $game_party.actors中的 actors是 Game_Party的属性,被 attrrc_reader了 ,意思是返回@actors,那么在初始化里 @actors=[ ],意思是 @actors的值是 [ ],那么,actors怎么 可能 是 [ ][ ]——意思是actors实际是返回值@actors,而返回值@actors的值是[ ],所以actors被我理解成了[ ][ ]了?

作者: VIPArcher    时间: 2014-11-10 22:25
draw_actor_graphic(actor, x, y) 中 的actor参数是引用语句actor = $game_party.actors的 局部变量actor吗?

看使用这个方法的上下文,如果有定义actor = $game_party.actors那就是,否则看看这个类里或者父类或者祖父类等等里有没定义actor这个方法
actor = $game_party.actors中的 actors是 Game_Party的属性,被 attrrc_reader了 ,意思是返回@actors,那么在初始化里 @actors=[ ],意思是 @actors的值是 [ ],那么,actors怎么 可能 是 [ ][ ]——意思是actors实际是返回值@actors,而返回值@actors的值是[ ],所以actors被我理解成了[ ][ ]了?

引用实例变量需要初始化,否则为nil。@actors是一个储存队员实例的数组,如果在使用前没有初始化为一个数组的话,对它调用 push 方法就会报错。

作者: kvkv97    时间: 2014-11-11 09:25
本帖最后由 kvkv97 于 2014-11-11 09:27 编辑

  1. Game_Party 的 actors 是包含游戏队伍所有角色的数组,里面的每个单元都是一个 Game_Actor 。
  2. 而 [ ] 是调用与索引相对应的 actors 里的某个角色:Game_Actor
复制代码
我的意思是:我无法理解actor=$game_party.actors[ i ]的actors[ i ]是怎么和@actors=[ ]联系起来解释的?
actors和@actors=[]是一样的吗?
作者: taroxd    时间: 2014-11-11 12:38
kvkv97 发表于 2014-11-11 09:25
我的意思是:我无法理解actor=$game_party.actors[ i ]的actors[ i ]是怎么和@actors=[ ]联系起来解释的?
...

根据优先级,
  1. $game_party.actors[i]
复制代码
等价于
  1. ($game_party.actors)[i]
复制代码
也就相当于

  1. actors = $game_party.actors
  2. actors[i]
复制代码

作者: VIPArcher    时间: 2014-11-11 12:40
这里的方括号[]是数组类的一个方法,
self[nth] 表示获取数组的第nth个元素,索引由0开始,若为负数则倒数。超过范围则返回nil
上面就说过了,一开始的@actors=[ ] 这个只是一个初始化,把@actors赋值为一个空数组。
actors只是Game_Party类的一个方法。
作者: 芯☆淡茹水    时间: 2014-11-11 14:02
本帖最后由 芯☆淡茹水 于 2014-11-11 14:08 编辑

补充LS:
LZ 应该先理解 Game_Party 里的这句:attr_reader   :actors
定义实例变量的读取方法,等同于下面这个效果:
  1. def actors
  2.   return @actors
  3. end
复制代码
在 Game_Party  内部使用时,直接调用 @actors
而在外部调用时,就需要 Game_Party  生成的实例 $game_party ,再加上方法 actors
所以就  $game_party.actors
利用其定义的 actors 方法,调用 Game_Party  内部的实例变量 @actors  。

$game_party.actors  的 actors  是方法。
而在 Game_Party  内部的 @actors  是实例变量。
在外部 --> 使用方法 actors  --> 调用其内部的实变量 @actors  




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1