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

Project1

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

[已经解决] 为何像“+”这样的RGSS3内部语言也会未定义?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1043
在线时间
233 小时
注册时间
2016-2-3
帖子
172

开拓者

跳转到指定楼层
1
发表于 2016-4-15 13:28:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 饿啊 于 2016-4-15 13:30 编辑

本人多日来的疑问,在学会一点点RGSS3后竟然彻底懵逼了——这种RGSS3内部语言会有这种错误...谁能答疑一下?
(如下脚本和错误来自于VA图书馆的CP战斗系统,我原先也问过)
[pre lang="ruby"]#RTAB战斗系统 For RPG Maker VX Ace 编写者:SLICK

#encoding:utf-8
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  战斗画面
#==============================================================================

class Scene_Battle < Scene_Base
  attr_accessor :cp_quota
  attr_accessor :rtab_wait
  attr_accessor :active_members
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    @cp_quota = 0
    create_spriteset
    create_all_windows
    BattleManager.method_wait_for_message = method(:wait_for_message)
  end
  #--------------------------------------------------------------------------
  # ● 战斗开始
  #--------------------------------------------------------------------------
  def battle_start
    @rtab_wait = true
    @active_members = []
    BattleManager.battle_start
    set_cp_quota
    process_event
    #start_party_command_selection
  end
  #--------------------------------------------------------------------------
  # ● 获取敌我双方人物的平均行动速度并决定CP槽的Quota值
  #--------------------------------------------------------------------------
  def set_cp_quota
    sss = 0.0
    for iii in $game_party.members
      sss += iii.param(6)
    end
    sss /= $game_party.members.size
    @cp_quota = sss * 200
    @spriteset.cp_quota = @cp_quota
    for iii in $game_party.members + $game_troop.members
      iii.cp_quota = @cp_quota
    end
  end
  #--------------------------------------------------------------------------
  # ● 进行下一个指令输入
  #--------------------------------------------------------------------------
  def next_command
    if BattleManager.next_command
      start_actor_command_selection
    else
      turn_start(@active_members)
    end
  end
  #--------------------------------------------------------------------------
  # ● 返回上一个指令输入
  #--------------------------------------------------------------------------
  def prior_command
    if BattleManager.prior_command
      start_actor_command_selection
    else
      start_party_command_selection
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    if BattleManager.in_turn?
      process_event
      process_action
    else
      if @rtab_wait
        for iii in $game_party.members + $game_troop.members
          iii.in_turn = false
          iii.rtab_cp += iii.param(6)
          if iii.rtab_cp >= iii.cp_quota
            @active_members.push(iii)
            iii.in_turn = true
          end
        end
        if @active_members.size > 0
          @rtab_wait = false
          start_party_command_selection
        end
      end
    end
    BattleManager.judge_win_loss
  end
  #--------------------------------------------------------------------------
  # ● 回合开始
  #--------------------------------------------------------------------------
  def turn_start(members)
    @party_command_window.close
    @actor_command_window.close
    @status_window.unselect
    @subject = nil
    BattleManager.turn_start(members)
    @log_window.wait
    @log_window.clear
  end
  #--------------------------------------------------------------------------
  # ● 回合结束
  #--------------------------------------------------------------------------
  def turn_end
    @active_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.display_auto_affected_status(battler)
      @log_window.wait_and_clear
    end
    BattleManager.turn_end
    process_event
    @rtab_wait = true
    @active_members = []
  end
  #--------------------------------------------------------------------------
  # ● 处理战斗行动
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    if !@subject || [email protected]_action
      @subject = BattleManager.next_subject
    end
    return turn_end unless @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
    end
    process_action_end unless @subject.current_action
  end
  #--------------------------------------------------------------------------
  # ● 开始队伍指令的选择
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      if BattleManager.input_start
        BattleManager.clear_actor
        BattleManager.next_command
        @status_window.select(BattleManager.actor.index)
        @actor_command_window.setup(BattleManager.actor)
      else
        @party_command_window.deactivate
        @actor_command_window.close
        turn_start(@active_members)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成角色指令窗口
  #--------------------------------------------------------------------------
  def create_actor_command_window
    @actor_command_window = Window_ActorCommand.new
    @actor_command_window.viewport = @info_viewport
    @actor_command_window.set_handler(:attack, method(:command_attack))
    @actor_command_window.set_handler(:skill,  method(:command_skill))
    @actor_command_window.set_handler(:guard,  method(:command_guard))
    @actor_command_window.set_handler(:item,   method(:command_item))
    @actor_command_window.set_handler(:cancel, method(:prior_command))
    @actor_command_window.set_handler(:escape, method(:command_escape))
    @actor_command_window.x = Graphics.width
  end
  #--------------------------------------------------------------------------
  # ● 指令“撤退”
  #--------------------------------------------------------------------------
  def command_escape
    unless BattleManager.process_escape
      turn_start(@active_members)
      for iii in @active_members
        iii.rtab_cp = 0
      end
    end
  end
end

#encoding:utf-8
#==============================================================================
# ■ Window_ActorCommand
#------------------------------------------------------------------------------
#  战斗画面中,选择角色行动的窗口。
#==============================================================================

class Window_ActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 生成指令列表
  #--------------------------------------------------------------------------
  def make_command_list
    return unless @actor
    add_attack_command
    add_skill_commands
    add_guard_command
    add_item_command
    add_escape_command
  end
  #--------------------------------------------------------------------------
  # ● 添加撤退指令
  #--------------------------------------------------------------------------
  def add_escape_command
    add_command(Vocab::escape, :escape, BattleManager.can_escape?)
  end
end

#encoding:utf-8
#==============================================================================
# ■ BattleManager
#------------------------------------------------------------------------------
#  战斗过程的管理器。
#==============================================================================

module BattleManager
  #--------------------------------------------------------------------------
  # ● 战斗开始
  #--------------------------------------------------------------------------
  def self.battle_start
    $game_system.battle_count += 1
    $game_party.on_battle_start
    $game_troop.on_battle_start
    $game_troop.enemy_names.each do |name|
      $game_message.add(sprintf(Vocab::Emerge, name))
    end
    if @preemptive
      $game_message.add(sprintf(Vocab::Preemptive, $game_party.name))
    elsif @surprise
      $game_message.add(sprintf(Vocab::Surprise, $game_party.name))
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● 遇敌时的处理
  #--------------------------------------------------------------------------
  def self.on_encounter
    @preemptive = false
    @surprise = false
  end
  #--------------------------------------------------------------------------
  # ● 回合开始
  #--------------------------------------------------------------------------
  def self.turn_start(members)
    @phase = :turn
    clear_actor
    $game_troop.increase_turn(members)
    make_action_orders(members)
  end
  #--------------------------------------------------------------------------
  # ● 生成行动顺序
  #--------------------------------------------------------------------------
  def self.make_action_orders(members)
    @action_battlers = []
    for iii in $game_party.members
      if members.include?(iii)
        @action_battlers.push(iii) unless @surprise
      end
    end
    for iii in $game_troop.members
      if members.include?(iii)
        @action_battlers.push(iii) unless @preemptive
      end
    end
    @action_battlers.each {|battler| battler.make_speed }
    @action_battlers.sort! {|a,b| b.speed - a.speed }
  end
end

#encoding:utf-8
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
#  处理战斗者的类。Game_Actor 和 Game_Enemy 类的父类。
#==============================================================================

class Game_Battler < Game_BattlerBase
  attr_accessor :turn_count
  attr_accessor :rtab_cp
  attr_accessor :cp_quota
  attr_accessor :in_turn
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias neoinitialize initialize
  def initialize
    @turn_count = 0
    @rtab_cp = 0
    @cp_quota = 100
    @in_turn = false
    neoinitialize
  end
  #--------------------------------------------------------------------------
  # ● 战斗开始处理
  #--------------------------------------------------------------------------
  def on_battle_start
    @turn_count = 0
    @rtab_cp = 0
    @cp_quota = 100
    @in_turn = false
    init_tp unless preserve_tp?
  end
  #--------------------------------------------------------------------------
  # ● 处理伤害
  #    调用前需要设置好
  #    @result.hp_damage   @result.mp_damage
  #    @result.hp_drain    @result.mp_drain
  #--------------------------------------------------------------------------
  def execute_damage(user)
    on_damage(@result.hp_damage) if @result.hp_damage > 0
    self.hp -= @result.hp_damage
    self.mp -= @result.mp_damage
    user.hp += @result.hp_drain
    user.mp += @result.mp_drain
  end
  #--------------------------------------------------------------------------
  # ● 判定是否可以输入指令
  #--------------------------------------------------------------------------
  def inputable?
    normal? && !auto_battle? && @in_turn
  end
  #--------------------------------------------------------------------------
  # ● 回合结束处理
  #--------------------------------------------------------------------------
  def on_turn_end
    @result.clear
    regenerate_all
    update_state_turns
    update_buff_turns
    remove_states_auto(2)
    # 该角色的回合计数加1并清空CP
    @turn_count += 1
    @rtab_cp = 0
  end
end

#encoding:utf-8
#==============================================================================
# ■ Game_Troop
#------------------------------------------------------------------------------
#  管理敌群和战斗相关资料的类,也可执行如战斗事件管理之类的功能。
#   本类的实例请参考 $game_troop 。
#==============================================================================

class Game_Troop < Game_Unit
  #--------------------------------------------------------------------------
  # ● 增加回合
  #--------------------------------------------------------------------------
  def increase_turn(members)
    troop.pages.each {|page| @event_flags

204222l8bshhow8p6yhhol.png (5.97 KB, 下载次数: 15)

204222l8bshhow8p6yhhol.png
究极半吊子
《重生学校》同人作:https://rpg.blue/thread-493882-1-1.html

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21432
在线时间
9386 小时
注册时间
2012-6-19
帖子
7114

开拓者短篇九导演组冠军

2
发表于 2016-4-15 14:05:56 | 只看该作者
本帖最后由 喵呜喵5 于 2016-4-15 14:06 编辑

道理其实很简单:
你问电脑 一张白纸 + 数字1 等于多少,电脑说不知道,你可以理解
为什么你问电脑 一个不是数字的东西 + 一个数字 等于多少,电脑说不知道,你却很奇怪呢?
回复 支持 反对

使用道具 举报

Lv4.逐梦者

「Pemercyia」


Urhurrenna

梦石
0
星屑
9402
在线时间
2749 小时
注册时间
2008-9-5
帖子
3542

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

3
发表于 2016-4-15 15:05:50 | 只看该作者
本帖最后由 cinderelmini 于 2016-4-15 15:08 编辑

不是方法没定义,然后运算方法是定义给特定对象(数字,数组,字符什么的)的,
然后弹这个未定义运算符号方法的问题就是前面要运算的变量并不是能运算的对象,
所以会有这种问题……

举个栗子的话……
乃可以跟一个人说人类的语言,然后对面能懂,
但是也可以跟一只喵说人类的语言,然而它不懂……
人类的语言是已经定义了的方法,但是对象不一样。

点评

我记得是 &. 吧,而且 &. 也不是这么用的  发表于 2016-4-15 19:38
To:miaowm5 某个曾说离开再也不回来的家伙,不好意思用老马甲就只能申请个新的了 以及喵呜女神大法好,喵呜女神赛高~  发表于 2016-4-15 19:01
想了半天 shitake 到底是哪个触的马甲……  发表于 2016-4-15 18:36
好吧我算是明白了,多谢诸位能够再次帮忙.... 看来还是我没有学通透...  发表于 2016-4-15 18:30
然而这种情况基本上都是出现再 undefined method ‘+’ for NilClass 上,以至在ruby2.3.0里多了个孤寂运算符(.&)  发表于 2016-4-15 16:20
回复 支持 反对

使用道具 举报

Lv2.观梦者

永无止境的旅程

梦石
0
星屑
503
在线时间
1552 小时
注册时间
2012-6-19
帖子
1226

开拓者贵宾

4
发表于 2016-4-15 18:58:37 | 只看该作者
在给一个很容易懂的解释。

虽然是内定好的class但是也是可以报错的。

提个简单的例子把,比如调用这个类的时候需要传入数字的参数进去才能正常运行。

但是你给他传入了非数字类型进去肯定会报错的啊。
[url=https://rpg.blue/thread-389697-1-1.html]https://rpg.blue/https://rpg.blue/data/attachment/forum/201602/26/220128cfbxxs47xth4xkz4.jpg[/url]
&lt;font size=&quot;5&quot;&gt;[color=Green][url=https://rpg.blue/forum.php?mod=viewthread&amp;tid=396208&amp;extra=page%3D1][color=DeepSkyBlue]全新配套ACT系统,每周末一大更新,尽请期待。[/color][/url][/color]
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4593
在线时间
1205 小时
注册时间
2016-4-7
帖子
982

开拓者

5
发表于 2016-4-15 20:41:42 | 只看该作者
本帖最后由 shitake 于 2016-4-15 22:46 编辑


@taroxd

就我个人的理解来看,应该是  .& 或者直接写 &。而 &. 应该是个不怎么正确的写法。
. 在ruby里通常表示方法的调用,写作.& 是和 .+ 这样差不多的写法【ruby里实际上是不存在运算符的,所有的运算符本质上都应该是以特殊符号为方法名的拟态方法】
那么 &. 这样的写法怎么来的呢,举个例子:
  1. a = []
  2. a&.each{ |i| p i }
复制代码
而这里实际上应该是先 .& 然后在 .each,这个 . 应该是和其后边的方法连在一起的 。
不过这也不一定说明我是对的,应为在cruby 2.3.0 的环境下,我尝试写 a.&.each{ |i| p i } 会报错。囧
另外,通过调用 methods 方法,发现在常用的类里面,只有 String、Numerc、Array、NilClass、TrueClass、FalseClass、MatchData 这几个类的实例里有 .& 这个方法。

恩,我去查了下最先看到这个的出处
然后发现除了这里,其他提到孤寂运算符的地方都是写做 &. 貌似是这篇翻译的问题(其他语言的版本里也是 &. 囧)
另外看这篇 Matz 开始也是考虑过 .& 这样的,貌似还纠结过使用 ?  还是 & 。

点评

代码里面叫ANDDOT, 至于是什么代码,当然是CRuby2.4的C语言源代码  发表于 2016-4-16 10:29
&. 是语法而不是方法  发表于 2016-4-15 22:03
&.跟&不是一回事,你个人理解没包含进新的情况  发表于 2016-4-15 21:46
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-2-22 00:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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