查看: 2556|回复: 6

[有事请教] 为什么在window的update里写this.y-=1会没有效果。

[复制链接]
梦石
0
星屑
1919
在线时间
404 小时
注册时间
2014-7-7
回帖
209

开拓者

发表于 2020-12-19 12:45:53 | 显示全部楼层 |阅读模式

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

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

×
[pre lang="javascript"]
Window_TitleCommand_update = Window_TitleCommand.update
Window_TitleCommand.update = function (params) {
    Window_TitleCommand_update.call(this)
    this.y -= 1
}[/pre]

而直接在控制台里修改的update就可行。
下面就是控制台的代码

[pre lang="javascript"]a=-5
asd = SceneManager._scene._commandWindow.update
SceneManager._scene._commandWindow.update = function(){
  asd.call(this)
  if (this.y>=20){
      a+=0.1
  this.y-=(a**3)/100
  }

}[/pre]
而且在scene_title里改也有效。
奇怪。。
cheap
梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2020-12-19 14:59:04 | 显示全部楼层
说明他在其他地方也有设定这个值
回复

使用道具 举报

梦石
0
星屑
453
在线时间
31 小时
注册时间
2020-12-18
回帖
2
发表于 2020-12-19 20:37:14 | 显示全部楼层
学过一点编程。

Window_TitleCommand 和 SceneManager 是两种变量,所以它们的数据是不互通的。

this 是一种叫本身变量。

<
  1. Window_TitleCommand_update = Window_TitleCommand.update
  2. Window_TitleCommand.update = function (params) {
  3.     Window_TitleCommand_update.call(this)
  4.     this.y -= 1 // 这里可以这样写 Window_TitleCommand_update.y = -1;
  5. }
复制代码
>

所以你在 SceneManager 里修改 this.y 是 SceneManager.y 而不是 Window_TitleCommand_update.y。

如果要在 Window_TitleCommand_update 里修改 SceneManager.y 的话:
  1. Window_TitleCommand_update = Window_TitleCommand.update
  2. Window_TitleCommand.update = function (params) {
  3.     Window_TitleCommand_update.call(this)
  4.     SceneManager.y -= 1 // 这里改成这样
  5. }
复制代码


这是我觉得,所以有可能是错的。
回复

使用道具 举报

梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2020-12-19 20:44:07 | 显示全部楼层
本帖最后由 KB.Driver 于 2020-12-19 20:45 编辑

错误写法:
QQ截图20201219204131.jpg

正确写法:
[pre lang="javascript"]var Window_TitleCommand_update = Window_TitleCommand.prototype.update;
Window_TitleCommand.prototype.update = function (params) {
    Window_TitleCommand_update.call(this, params);
    this.y -= 1; // 顺带一提,窗口会一直往上走,马上就跑到画面外去了
}[/pre]

原因:
需要修改的是Window的实例方法,需要在prototype身上修改。
直接在类身上的方法近似于“静态方法”
具体的需要楼主拥有一些面向对象的知识,可以去了解一下。
用头画头像,用脚写脚本
回复

使用道具 举报

梦石
0
星屑
1919
在线时间
404 小时
注册时间
2014-7-7
回帖
209

开拓者

 楼主| 发表于 2020-12-19 21:24:26 | 显示全部楼层

js的构造函数的this以及prototype的实际含义以及call()的内容,许久没碰js,被遗忘了。
总之感谢解答。
(至于var和窗口飘走什么的就别再意啦,,为了测试方便直接上了。)
cheap
回复

使用道具 举报

梦石
0
星屑
1919
在线时间
404 小时
注册时间
2014-7-7
回帖
209

开拓者

 楼主| 发表于 2020-12-19 21:42:04 | 显示全部楼层
catinfiltrator 发表于 2020-12-19 20:37
学过一点编程。

Window_TitleCommand 和 SceneManager 是两种变量,所以它们的数据是不互通的。

啊这。确实是错了。
有几点我补充一下。
SceneManager里有一个属性叫_scene,指向当前场景的实例。
而当前场景是scene_title,所以
SceneManager._scene._commandWindow.update 里的this指向_commandWindow,
它是Window_TitleCommand的实例。
所以,this.y不是问题所在,同楼上所述。
关键是对象的update实际上是在构造函数的prototype里。
我把这个当作直接定义在Window_TitleCommand里的this.update并成功把它和普通函数的使用混淆了。
嗯,大概就是这样。
总之还是感谢解答啦。
cheap
回复

使用道具 举报

梦石
0
星屑
1919
在线时间
404 小时
注册时间
2014-7-7
回帖
209

开拓者

 楼主| 发表于 2020-12-19 21:47:33 | 显示全部楼层
yang1zhi 发表于 2020-12-19 14:59
说明他在其他地方也有设定这个值

感谢解答。
cheap
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部