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

Project1

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

[已经解决] 不直接使用全局变量改变另一个对象里的实例变量

[复制链接]

Lv4.逐梦者

梦石
0
星屑
5680
在线时间
782 小时
注册时间
2019-1-20
帖子
191
跳转到指定楼层
1
发表于 2019-10-31 11:05:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 srwjrevenger 于 2019-11-1 12:20 编辑
  1. class Abc
  2. def aa
  3.   @a||=0
  4.   @b||=1 ###
  5.   @a+=@b
  6.   @a
  7. end
  8. end
  9. #######以下不清楚什么类
  10. def bb
  11. @a=10 #
  12. end

  13.   def cc
  14.   @b=10 #
  15.   end
复制代码


我原本的意思是
执行bb 后改变class Abc里面aa生成之后 @a 的值
执行cc 后改变###那里 @b 的值
不过每次执行 aa 时 @a @b 又恢复成 0 1 了

有办法不使用全局变量$game_variables之类的
实现我想要的吗

提高解答机会的方法:
看一下对应版本的帮助文件 看天气预报说今天不下雨
改变问题为更有可能的或常见的 如:天气自动变化下雨→天气系统 果然不准呀~
使用论坛的搜索功能查找相关问题 好丧啊... ...想看女装
清楚说明实际上你想解决的问题  想看坛友的女装  
脚本自己有改过的地方要标明  不要遮脸的
脚本有问题但不是默认的要全部贴出来 大胆点,尽情发
三包原则:包有BUG,包甩锅,包咕咕

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20945
在线时间
9333 小时
注册时间
2012-6-19
帖子
7106

开拓者短篇九导演组冠军

2
发表于 2019-10-31 11:55:58 | 只看该作者
  1. class 你的钱包
  2.   def aa
  3.     @余额||=0
  4.     @账单||=1
  5.     @余额+=@账单
  6.     @余额
  7.   end
  8. end
  9. #######以下是我的钱包
  10. def bb
  11.   @余额=10
  12. end
  13. def cc
  14.   @账单=10
  15. end
复制代码


虽然执行 bb cc 能够改变我的钱包的 @余额 @账单
不过每次执行 你的钱包的 aa 时 @余额 @账单 还是你的钱包的 0 1

有办法不使用全局变量,改变我的钱包的变量 @账单 后,你的钱包的账单就变成我的账单吗?

答:你提供的信息太少了,无法确定具体问题

方法需要具体问题具体分析,比如两个 class 虽然不同类,但是却有同一个父类……或者两个 class 有一个共享的父作用域可以操作等等……
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5680
在线时间
782 小时
注册时间
2019-1-20
帖子
191
3
 楼主| 发表于 2019-10-31 13:59:24 | 只看该作者
喵呜喵5 发表于 2019-10-31 11:55
虽然执行 bb cc 能够改变我的钱包的 @余额 @账单
不过每次执行 你的钱包的 aa 时 @余额 @账单 还是你的钱 ...

我果然还是语文渣吗OTL
  举个例子吧
  class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 生成遇敌计数
  #--------------------------------------------------------------------------
  def make_encounter_count #默认脚本
    n = $game_map.encounter_step
    @encounter_count  =rand(n) + rand(n) + 1
     @encounter_count
  end
  end

  如果用@a随意改变遇敌率
    class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 生成遇敌计数
  #--------------------------------------------------------------------------
  def make_encounter_count
    n = $game_map.encounter_step
    @encounter_count  =rand(n) + rand(n) + 1
    @encounter_count=@encounter_count*@a #123
    @encounter_count
  end
  end

  @a有默认值1,使用函数aa可以改变@a,aa不知道要丢什么类

  或者不要123那一行
  直接使用函数bb直接改变生成之后的@encounter_count ,bb还是不知道要丢什么类
   
  因为只是举例,并没有相关的 @a aa bb
  使用全局变量虽然能简单解决,
  不过不想滥用,
  感觉因为我一定会出bug呀呀呀呀呀呀

提高解答机会的方法:
看一下对应版本的帮助文件 看天气预报说今天不下雨
改变问题为更有可能的或常见的 如:天气自动变化下雨→天气系统 果然不准呀~
使用论坛的搜索功能查找相关问题 好丧啊... ...想看女装
清楚说明实际上你想解决的问题  想看坛友的女装  
脚本自己有改过的地方要标明  不要遮脸的
脚本有问题但不是默认的要全部贴出来 大胆点,尽情发
三包原则:包有BUG,包甩锅,包咕咕
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33178
在线时间
10489 小时
注册时间
2009-3-15
帖子
4756
4
发表于 2019-10-31 16:10:15 | 只看该作者
本帖最后由 soulsaga 于 2019-11-1 10:37 编辑

RUBY 代码复制
  1. class ABC
  2. def aa(a=0,b=1)
  3.   a+=b
  4.   a
  5. end
  6. end
  7.  
  8. class Game_Player < Game_Character
  9.   #--------------------------------------------------------------------------
  10.   # ● 生成遇敌计数
  11.   #--------------------------------------------------------------------------
  12.   def make_encounter_count
  13.     n = $game_map.encounter_step
  14.     @encounter_count  =rand(n) + rand(n) + 1
  15.     @a=ABC.new
  16.     @a=@a.aa(10,10)
  17.     @encounter_count=@encounter_count*@a #123
  18.     @encounter_count
  19.   end
  20.   end
给aa參数再调用就行了么..

点评

我觉得还是用全局变量吧..要在其他类修改另一个类的变量根本不可能..不会啊  发表于 2019-11-1 22:50
测试时,在地图事件使用脚本zz,zz=》def zz ;调用内容;end 调用内容改aa试过几个写法都失败了  发表于 2019-11-1 21:56
你在哪里调用啊..  发表于 2019-11-1 12:43
呃,调用之后失败了,可能是我的写法错误,你是怎么调用的  发表于 2019-11-1 12:07
已更新..ABC要放在前面..  发表于 2019-11-1 10:37

评分

参与人数 1+1 收起 理由
srwjrevenger + 1 谢谢陪我一起想^ - ^

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20945
在线时间
9333 小时
注册时间
2012-6-19
帖子
7106

开拓者短篇九导演组冠军

5
发表于 2019-10-31 17:42:33 | 只看该作者
本帖最后由 喵呜喵5 于 2019-10-31 17:45 编辑

Game_Player 的实例本身就作为全局变量储存在 $game_player 里

给 Game_Player 定义一个方法(选个不容易重复的方法名),然后 $game_player 调用这个方法就好了
例如下面这样

  1. class Game_Player < Game_Character
  2.   attr_accessor :my_var_20191031
  3.   def make_encounter_count
  4.     n = $game_map.encounter_step
  5.     @encounter_count  =rand(n) + rand(n) + 1 + @my_var_20191031
  6.     @encounter_count
  7.   end
  8.   def my_method_20191031(v)
  9.      @my_var_20191031 += v
  10.   end
  11. end
复制代码

  1. $game_player.my_var_20191031= 123456
  2. $game_player.my_method_20191031(654321)
复制代码

点评

第5行上面增加 @my_var_20191031||=1 好像就可以了  发表于 2019-10-31 22:32
在第5行 @encounter_count =rand(n) + rand(n) + 1 + @my_var_20191031 显示nil cann,t be coerced into Fixnum  发表于 2019-10-31 20:45

评分

参与人数 2星屑 +50 +1 收起 理由
VIPArcher + 50 认可答案
srwjrevenger + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9617
在线时间
566 小时
注册时间
2017-9-28
帖子
208
6
发表于 2019-10-31 21:12:48 | 只看该作者
本帖最后由 hyrious 于 2019-11-1 06:40 编辑

LZ 你还是补点 ruby 基础再来问问题吧
首先,游戏里不管是 $game_player 还是其他 $game_xxx,他们都是对应类的“实例”,而实例变量(也就是 @ 开头的变量)是和对象关联的,也就是说同一个类 .new 出来的两个对象拥有实际上不同的实例变量
  1. class A
  2.   def initialize(a=0) @a = a end
  3.   def a() @a end
  4. end
  5. a = A.new(42); a.a #=> 42
  6. b = A.new(24); b.a #=> 24 # 和 a.a 无关
复制代码

所以你的问题其实是:如何改变另一个对象里的实例变量
答案是,要么定义修改实例变量的方法,要么元编程
  1. class A
  2.   def a=(x) @a = x end
  3. end
  4. a = A.new
  5. a.a = 123 # 这里等价于调用了 .a=(123)
  6. a.a #=> 123
复制代码

元编程等你理解了什么是 ruby 对象再看

  1. class Game_Player < Game_Character
  2.   #--------------------------------------------------------------------------
  3.   # ● 生成遇敌计数
  4.   #--------------------------------------------------------------------------
  5.   def make_encounter_count
  6.     n = $game_map.encounter_step
  7.     @encounter_count = rand(n) + rand(n) + 1
  8.     @encounter_count = (@encounter_count * (@a || 1)).to_i
  9.     @encounter_count
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 定义一个方法用于修改 @a
  13.   #--------------------------------------------------------------------------
  14.   def aa a
  15.     @a = a
  16.   end
  17. end

  18. # 修改时:
  19. $game_player.aa(0.5)
复制代码

点评

这样就好理解了,一直纠结class A 和a = A.new那里怎么写,原来是class Game_Player,$game_player啊  发表于 2019-11-1 12:11
描述这方面我语渣没得救啦,基础看过也还是在遇到问题两天之后才想起实例变量那些事T-T。能不能以3楼的情况写个能随时改变@encounter_count 或@a的范例  发表于 2019-10-31 23:37

评分

参与人数 2星屑 +50 +1 收起 理由
VIPArcher + 50 认可答案
srwjrevenger + 1 认可答案

查看全部评分

喵喵喵
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
735
在线时间
42 小时
注册时间
2019-11-26
帖子
28
7
发表于 2019-11-29 16:29:17 | 只看该作者
可以用instance_variable_set方法

  1. class Dog
  2.   def set_name(name)
  3.     @name = name
  4.   end

  5.   def name
  6.     @name
  7.   end
  8. end

  9. dog = Dog.new
  10. dog.set_name("WangCai")
  11. p dog.name     #=> "WangCai"

  12. dog.instance_variable_set(:@name, "AHuang")
  13. p dog.name     # => "Ahuang"
复制代码

  

评分

参与人数 2星屑 +50 +1 收起 理由
VIPArcher + 50 认可答案
srwjrevenger + 1 虽然最近已经知道了,不过还是谢谢你了^ - .

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-26 08:29

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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