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

Project1

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

[已经解决] 两个很晦涩的疑点,程序闹情绪了吗?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
跳转到指定楼层
1
发表于 2014-11-14 11:15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 kvkv97 于 2014-11-14 11:17 编辑

问题1:
  1. 为什么我在main前面插入
  2. p $game_actors = Game_Actors.new
  3. p $game_actors[1]
  4. Game_Actors类的23行会出现错误
  5. def [](actor_id)
  6.   if actor_id > 999 or $data_actors[actor_id] == nil
  7.      return nil
  8.   end
  9.   if @data[actor_id] == nil
  10.      @data[actor_id] = Game_Actor.new(actor_id)
  11.   end
  12.   return @data[actor_id]##@data[actor_id]
  13. end
  14. 说nil:NilClass找不到方法[]
复制代码
问题2:

  1. Game_Party类中
  2. for i in $data_system.party_members
  3.    @actors.push($game_actors[i])
  4. end
  5. 我在Game_Actors类加入了模块attr_reader :data
  6. 问题是:
  7. $game_actors[i]和$game_actors.data[i]相同吗?
  8. 如果相同,为什么Game_Actor类的character_name就召唤不了?
复制代码

点评

问题2,如果只写了这句:attr_reader :data 的话,p $game_actors.data #=> nil  发表于 2014-11-14 23:10

Lv1.梦旅人

梦石
0
星屑
55
在线时间
218 小时
注册时间
2013-12-17
帖子
386
2
发表于 2014-11-14 18:07:14 | 只看该作者
本帖最后由 国产吃货 于 2014-11-14 18:14 编辑

1-

错误的: 调用 $game_actors 变量,这个时候还没有被创建。
  ↓
main 运行
   ↓
场景管理器 初始化
  ↓
数据管理器初始化 →  Game_Actors 的实例创建保存在 →$game_actors 变量内。
  ↓
正确的:应该在实例创建之后再调用 $game_actors

------------------------------------------------
2-

想要知道是否一样,分别P他们,得到内存地址进行比对。

点评

看了魔主宝的录象,受益非浅,建议大家去看你的录象  发表于 2014-11-15 22:11
我在地图里面建造了,结果显示出来的结果相同,就是程序运行不了  发表于 2014-11-15 22:07
RM脚本定制/修改/整合 群:143356012(入群注明来意)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

薄凉看客

梦石
0
星屑
50
在线时间
1269 小时
注册时间
2010-6-20
帖子
1316
3
发表于 2014-11-14 19:43:27 | 只看该作者
本帖最后由 恐惧剑刃 于 2014-11-14 19:48 编辑

第一个问题,“全局变量”没有被定义其值为nil,所以

if actor_id > 999 or $data_actors[actor_id] == nil 必然报错!
Game_Actor,setup 中 actor = $data_actors[actor_id]必然报错!
类似的下方 for j in $data_classes[@class_id].learnings   , update_auto_state(nil, $data_armors[@armor1_id]) 都会报错!
解决方法
  1. $data_actors        = load_data("Data/Actors.rxdata")
  2. $data_classes       = load_data("Data/Classes.rxdata")
  3. $data_armors        = load_data("Data/Armors.rxdata")
  4. p $game_actors = Game_Actors.new
  5. p $game_actors[1]
复制代码
第二个问题,当然不一样!!
attr是定义一个属性(实例变量),不是导入什么模块!!
看来Ry之前给解答的一些问题你还没有懂啊?

最后我的建议:
不要去管那些概念!!照着教学录像做,到时候这些东西自然都会明白!!
举个不恰当的例子,我们学英语,学它的目的是能说而不是会背语法!!
类似的,
学脚本的目的是能写而不是能讲概念!!

点评

见 大,能麻烦给个地址吗?苦于没地址啊  发表于 2014-11-15 22:21
谢谢指导,我按照你指导弄清楚一些了  发表于 2014-11-15 22:09
这真是极好的···什么时候我也去改一个- -|||  发表于 2014-11-15 12:25
一直没有撤掉  发表于 2014-11-15 12:12
你又改ID了?新生的勋章现在还有?  发表于 2014-11-14 21:58

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33071
在线时间
5103 小时
注册时间
2012-11-19
帖子
4878

开拓者

4
发表于 2014-11-14 23:31:58 | 只看该作者
本帖最后由 芯☆淡茹水 于 2014-11-15 00:19 编辑

点评时没把问题看清楚。
问题2:
$game_actors 的 [] 和 其实例变量 @data 的 [] 是不同的。
$game_actors 的 [] 是 Game_Actors 的 [] 方法,
实例变量 @data 的 [] 是  Array 的 [] 方法。#<= 貌似是这样的说法。
只是 $game_actors[] 沿用了其内部的实例变量 @data[] ,这两个 [] 是相等的。
  1. #--------------------------------------------------------------------------
  2.   def [](actor_id)
  3.     if actor_id > 999 or $data_actors[actor_id] == nil
  4.       return nil
  5.     end
  6.     if @data[actor_id] == nil
  7.       @data[actor_id] = Game_Actor.new(actor_id)
  8.     end
  9.     return @data[actor_id]
  10.   end
复制代码
这个只是定义了 Game_Actors 的 [] 的方法,它并没有在生成实例 $game_actors 时把所有角色都加入到 @data 里。
初始时, p $game_actors.data   #=> []
在调用某个角色:$game_actors[actor_id] 时,才往里面添加对应角色。
首先判断 actor_id 是否大于 999 或者 数据库相对应的 actor_id 是否为 nil 。是就返回 nil
然后判断如果数组 @data 里没有添加与 actor_id 相对应的角色,添加一个新的 Game_Actor 类。
最后返回 @data[actor_id]。
下面这样可以用LZ的方法调用添加过的角色:
RUBY 代码复制
  1. p $game_actors.data[1].class  # => NilClass
  2. p $game_actors[1].class       # => Game_Actor
  3. p $game_actors.data[1].class  # => Game_Actor

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

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

开拓者贵宾剧作品鉴家

5
发表于 2014-11-15 11:28:45 | 只看该作者
本帖最后由 RyanBern 于 2014-11-15 11:40 编辑

第一个问题参考恐惧剑刃的回答,问题关键在于$data_actors还没载入。
第二个问题参考芯大的回答,问题的关键在于定义的Game_Actors#[]和Array#[]不一样,Game_Actors#[]多了一步对@data内容的初始化。
两个答案结合起来就是标准回答了,RB在这里不加补充了。

其实我要啰嗦的是,学脚本/编程的时候要格外注重自己的心态,不要过多地增加自己的主观色彩,不要总是觉得程序写出来应该是怎样。一切要以事实为准,头脑中想得再好,弄到实际操作中出现了错误,这基本就说明你的想法是有问题的。不要总把错误归到程序或者计算机上,他们只是奉命行事,做事出了问题肯定是下达命令的人(写代码的人)思路出现了问题。也不要总觉得出现的问题很晦涩,很难懂,实际就是你自己考虑问题不全面不细致或者根本就是想错了。所以写程序就是在锻炼唯物主义思维

点评

能给个视频教程吗?  发表于 2014-11-16 00:42
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

6
发表于 2014-11-15 15:44:41 | 只看该作者
本帖最后由 taroxd 于 2014-11-15 15:46 编辑
RyanBern 发表于 2014-11-15 11:28
第一个问题参考恐惧剑刃的回答,问题关键在于$data_actors还没载入。
第二个问题参考芯大的回答,问题的关 ...


Rb大大快告诉我为什么VA里的 Plane#visible 永远返回 true

你当我想在 ULDS 里面写那个局部变量 visible 啊。害得我还要为了更新 visible 再多写一个方法。

点评

能给个视频教程吗?  发表于 2014-11-16 00:42
XP的Plane也是这样,难道真的是RGSS抽了?  发表于 2014-11-15 19:07
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-21 15:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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