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

Project1

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

[原创发布] CustomAdventure事件功能强化——理解与使用

[复制链接]

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

1
发表于 2014-6-22 10:23:17 | 显示全部楼层
本帖最后由 taroxd 于 2014-6-22 10:53 编辑
被这个包围起来的东西一般都是一些提供给用户进行可能的修改的常量。

不要无视 SceneManager 这种东西啦……
咳咳,咱不提Mix-in功能,把module命名空间的功能再解释清楚点(包括SceneManager这类的),这就是提问之一哦~
对实例变量的解释也是问题之一~ hp=(hp) 这段正是我想要看到的。



总之,你都写了这么多了,到时候一定参加活动哦~ 提的问题都很简单的。

点评

我想要的就是这样实际的解释,理论啥的谁想看  发表于 2014-6-22 10:32
moy
我还是喜欢偏实际操作一些,理论就交给你们吧!  发表于 2014-6-22 10:30
moy
所以我才说一般嘛,而且是基础,什么都解释可要说老半天了_(:з」∠)_  发表于 2014-6-22 10:29
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

2
发表于 2014-6-22 17:09:12 | 显示全部楼层
菜鸟飞呀飞 发表于 2014-6-22 16:27
技术贴为啥在水区-v-,另外个人感觉XP更适合入门,VA继承关系不是很喜欢,有些方法更是无节操 一个含一个 ...

我倒是非常喜欢VA的继承方式呢~ 毕竟可扩展性,代码可重用性都高得多
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

3
发表于 2014-6-22 18:52:19 | 显示全部楼层
菜鸟飞呀飞 发表于 2014-6-22 18:50
-v-我比较喜欢独立性自由性
比如说要写一个场景,用更上一层的逻辑直接建立场景更具有独立性,修改移植更 ...

要说入门容易当然是XP

但是知道脚本的运作原理后,VA写/改代码都更加容易。

点评

诶?我有码过教程嘛?  发表于 2014-6-22 19:14
额 如果那些不是你码的那就是错觉了  发表于 2014-6-22 19:05
诶你什么时候产生了我有码教程的错觉?呃,暑假有空也许会码吧……  发表于 2014-6-22 19:00
这倒是-v- 你们码教程的辛苦了  发表于 2014-6-22 18:59
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

4
发表于 2014-6-24 06:11:40 | 显示全部楼层
本帖最后由 taroxd 于 2014-6-24 06:42 编辑

吐槽start。
重要说明:以下内容并不算“入门”,不属于教程活动的范围之中。
教程活动仅需要对 self 的简单理解即可。

在这段脚本中,我们可以看到,同在Game_CharacterBase,pos_nt?方法内部直接使用了pos?方法,也就是说在同一个类(class)里面,方法之间的互相调用是可以直接实现的。这种嵌来套去的调用方式在VA-RGSS3的默认脚本里面可谓遍地都是。
这里还是从类的作用域(也是一个方法可以被使用的范围)开始讨论。


这一段解释非常不好。

这种隐式的方法调用并不一定要在同一个类或子类中,关键在于 self 的设定。隐式方法调用相当于对 self 调用这个方法。

比如说下面的例子。
RUBY 代码复制
  1. class Person
  2.   attr_accessor :name
  3.   include Math
  4. end


你注意到,我们调用了一些方法,分别是 attr_accessor 和 include。显然这个方法并不是在Person或者Person的父类中。
这是因为,在类定义中,self 指的就是这个类
我们翻阅Ruby文档,在 Module 类可以找到 attr_accessor 和 include 的定义。

于是,我们可以尝试
RUBY 代码复制
  1. class Person
  2.   self.attr_accessor :name
  3.   self.include Math
  4. end

什么?你说报错?我才不告诉你为什么呢~

于是,我们在写代码的过程中,有这些方式可以改变 self 的值……
啊,再讲下去就成元编程了。我们还是回到原来的问题。

pos_nt?方法内部为什么可以直接使用pos?方法?

因为:在方法的定义中,self 的值被设为方法的调用者(接收者)。
我们假设对 a 事件调用了 pos_nt? 方法
a.pos_nt?
我们根据方法的定义,可以将其解释为:
a.pos?(x, y) && !a的实例变量@through

我们注意到了这里的实例变量。实例变量访问的,其实也是 self 的实例变量。

我们也可以这么定义 pos_nt? 这是没有任何问题的。
RUBY 代码复制
  1. class Game_CharacterBase
  2.   def pos_nt?(x, y)
  3.     self.pos?(x, y) && !@through
  4.   end
  5. end


我们继续:
RUBY 代码复制
  1. class Person
  2.   attr_accessor :name
  3.   include Math
  4.  
  5.   def do_math
  6.     puts "sin(π / 3) = #{sin(PI / 3)}"
  7.   end
  8.  
  9.   def do_something
  10.     do_math
  11.     do_physics
  12.   end
  13. end
  14.  
  15. m5 = Person.new
  16. m5.name = '喵呜喵5'
  17.  
  18. def m5.do_physics
  19.   puts "#{name}在做物理"
  20. end
  21.  
  22. m5.do_something


在这个例子中,你可以看到,在 Person 类里面并没有定义 sin 和 do_physics。那为什么我们可以直接调用呢?
为什么之后 m5.do_physics 明显在类的作用域外,却可以直接调用方法 name 呢?
没错,一切都在于 self 的切换 。
所以说,“类的作用域“仅仅有切换 self,切换当前类,屏蔽局部变量的功能,和方法的调用没有任何关系!
同理,def 的作用域也是如此!


“切换当前类”是什么东西?我就不告诉你。
当我们不想要屏蔽局部变量的时候怎么办呢?这个时候就应该……咳咳我又要讲多了。嗯就这样吧。

最后:
我觉得我写的东西就是枯燥……所以才让你们写啦~~~
但是,这种错误还是少犯为好。

评分

参与人数 1星屑 +40 收起 理由
moy + 40 没有任何知识是毫无谬误的

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

5
发表于 2014-6-24 10:08:38 手机端发表。 | 显示全部楼层
本帖最后由 taroxd 于 2014-6-24 10:18 编辑
moy 发表于 2014-6-24 09:51
小学可不知道什么叫复数……
姑且添加了说明和跳转。


所以说,你对”类的作用域”的解释是完全错误的。include这一句,显然是在”类的作用域”里面的。

事实上,那些方法的隐式调用,是在 def 的作用域里面的。

你可以不说类的作用域,就像小学生不知道复数一样。你可以说,pos? 就是调用这个类里面刚刚定义过的方法。

但你既然说了,就不要乱说。你回去看看你对”类的作用域”是怎么说的。这不是近似说法,而是错误的说法。

可以近似,可以简略,可以避开,可以卖萌,甚至可以有漏洞,但绝不能错误。这是我的原则。

点评

moy
OK,进行了醒目的标注。  发表于 2014-6-24 10:18
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

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

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

开拓者贵宾

6
发表于 2014-6-24 10:57:29 手机端发表。 | 显示全部楼层
本帖最后由 taroxd 于 2014-6-24 12:09 编辑
moy 发表于 2014-6-24 10:39
class A
  def wryyy
    p self


@余烬之中 会提OOP的。他的解释挺不错的,我很喜欢。
我写的话,就会和上面一样,太理论太枯燥了,也不简单易懂。

这样的解释确实会有不利的影响。首先是“作用域”这个词,不能乱说。
然后,这对Ruby中调用方法的理解也会有影响。这在我上面举的那个Person中已经有所体现。现在继续。
RUBY 代码复制
  1. class Person
  2.   attr_accessor :name
  3.   include Math
  4.  
  5.   def do_math
  6.     puts "sin(π / 3) = #{sin(PI / 3)}"
  7.   end
  8.  
  9.   def do_physics
  10.     puts "#@name 在做物理"
  11.   end
  12.  
  13.   def do_something
  14.     do_math
  15.     do_physics
  16.   end
  17.  
  18. end
  19.  
  20. class Physicist < Person
  21.   def do_physics
  22.     puts 'E = mc²'
  23.   end
  24. end
  25.  
  26. m5 = Physicist.new
  27. m5.do_something


为什么 Person 类的方法 do_something 会引用到Physicist的方法?do_something 明明是在 Person 类定义的,按照你的“作用域理论”,调用的 do_physics 难道不应该是 Person 类的方法吗?

在引人类的继承和模块的 mix-in 后,方法的关系会愈加混乱。方法的调用到底会调用哪个类中的方法?
再举个错误的例子:
RUBY 代码复制
  1. class Battler
  2.   @hp = 20
  3.   def show_hp
  4.     puts @hp
  5.   end
  6. end
  7.  
  8. Battler.new.show_hp # ???
  9. Battler.show_hp     # ???

这不是类与实例的关系,而是对 self 和实例变量的理解问题。

极端点的例子,你可以看看 https://rpg.blue/thread-347871-1-1.html
self 的概念,在其中无比重要。

当然,入门教程只要简单说一下就好了,知道 self 是什么,足矣

点评

我只是想表达,子类方法的覆盖并不是理所当然的  发表于 2014-6-24 13:10
moy
是啊,又不是C++ |||||  发表于 2014-6-24 12:58
RGSS用的是Ruby啊……  发表于 2014-6-24 12:56
moy
横竖我们连ruby都不做重点,聊的是RGSS吧……  发表于 2014-6-24 12:45
只是习惯了Ruby,便会觉得理所当然而已。  发表于 2014-6-24 12:43
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-7 03:19

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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