查看: 2433|回复: 6

[已经解决] 怎么把一个变量当成数组来用

[复制链接]
梦石
0
星屑
61
在线时间
696 小时
注册时间
2011-1-4
回帖
176
发表于 2015-2-7 21:26:21 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 cjlzbb 于 2015-2-7 21:27 编辑

起因是这样的。我想做一个类似于WOW中戒律牧师的护盾效果,也就是额外的HP
部分技能可以提供护盾,而在计算伤害时先判断护盾的值,大于0则先扣护盾等等。
但是我发现不管是系统本身自带的属性值还是用脚本添加的新属性,都是不能直接进行运算的。好像是直接按人物等级/装备/状态等等的和得出的一个值
只有HP MP TP才是例外。

于是我想到了另一个办法,之前有在一个帖子里看到过可以把变量当做数组来用(好像是VA的帖子)
没错的话,$game_variables[X]就是事件中的变量X吧?$game_variables[X][Y]是代表这个数组中的某一位?
但是我发现在事件的脚本页里写$game_variables[X][Y] = Z的话会出错的说。
但是在脚本里在TP归0那先写 $game_variables[X] = [],然后再在其他地方写 $game_variables[X][Y] = Z 没问题

到底应该怎么做呢
梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
回帖
550
发表于 2015-2-7 21:34:56 | 显示全部楼层
$game_variables[X]
是一个默认是0的数字 如果你没初始化直接用
$game_variables[X][Y]
当然会报错

你可以在新游戏开始时建个事件
写入 $game_variables[X] = []

并且以后不可对这个X号变量使用”变量操作“的任何功能
只可用 事件脚本的 $game_variables[X][Y] = Z
或脚本中写  $game_variables[X][Y] = Z
回复

使用道具 举报

梦石
0
星屑
61
在线时间
696 小时
注册时间
2011-1-4
回帖
176
 楼主| 发表于 2015-2-7 21:37:58 | 显示全部楼层
本帖最后由 cjlzbb 于 2015-2-7 21:39 编辑
wbsy8241 发表于 2015-2-7 21:34
$game_variables[X]
是一个默认是0的数字 如果你没初始化直接用
$game_variables[X][Y]


那岂不是不能用数据库中的战斗测试了吗

突然转过弯来了,大不了不用战斗测试直接开个地图丢两个小怪进去就是
回头试试看
回复

使用道具 举报

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
回帖
550
发表于 2015-2-7 21:42:05 | 显示全部楼层
cjlzbb 发表于 2015-2-7 21:37
那岂不是不能用数据库中的战斗测试了吗

突然转过弯来了,大不了不用战斗测试直接开个地图丢两个小怪进去 ...

你会点脚本的话就直接在Game_Variables里写啊
  1. class Game_Variables
  2.   #--------------------------------------------------------------------------
  3.   # ● 初始化
  4.   #--------------------------------------------------------------------------
  5.   def initialize
  6.     @data = []
  7.     @data[15] = [] #像这样
  8.   end
  9. end
复制代码

点评

TAT 就是不懂才连这么基础的问题都不会呀  发表于 2015-2-8 12:53

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 认可答案

查看全部评分

回复

使用道具 举报

闇吼者の災悪眷族

梦石
0
星屑
1366
在线时间
2881 小时
注册时间
2014-7-29
回帖
6408
发表于 2015-2-7 22:08:16 | 显示全部楼层
我倒是帮别人写过一个生命护盾的脚本,不知道你是否符合你的需要。

点击展开/收起[pre lang="ruby" line="1"]#==============================================================================
# +++ 角色生命护盾 +++
#==============================================================================
# 作者 By 三途亚梦
#  -- 本脚本来自 https://rpg.blue 使用或转载请保留以上信息。
#==============================================================================
# 本脚本的作用是给玩家人物、敌人添加一个新的能力值“生命护盾”,
# 生命护盾会吸收该角色受到的来自技能造成的体力伤害。
#==============================================================================
#
# ★再次强调,生命护盾仅仅吸收来自“技能”造成的体力伤害!
#
# ★人物的生命护盾是amuhsp,
# 可以通过$game_actors[1].amuhsp之类的方式在事件中改变它的数值。
#
# ★HspClear = true 时,人物的生命护盾将在战斗结束时清零。
# 如果不想清零请将 true改为false
#
# ★HspNoAddition = true 时,
# 生命护盾的恢复将不享受恢复效果、物理及魔法伤害比率的加成,
# 但是会对 make_damage_value 的方法做出改变,会降低本脚本的兼容性。
#
# 设定部分所有文字信息的描述方法修改时请保留“”引号。
#
# ★将技能设置成体力值恢复,并在技能备注栏备注“[护盾恢复]”,
# 那么这个技能将变成增加目标角色的生命护盾值
# ★备注的时候不需要写入“”引号
#
# 角色的生命护盾没有上限,下限为0
#
# 如果需要设置一个技能为角色体力值的10%,又不想令护盾无限的加下去
# 技能公式请参照这个写法:
# b.hp * 0.1 - b.amuhsp
#
#==============================================================================
# ★ 设定部分 ★
#==============================================================================
module Amu
  module Hsp
   
  HspClear = true  #是否在战斗结束时清除掉玩家剩余的生命护盾
  
  HspNoAddition = false #是否采用本脚本的计算伤害的方法
   
  HspName = "生命护盾"  #生命护盾的名字
  
  HspABonus = "%s的%s剩余%s点!"  #玩家人物的生命护盾损伤后显示剩余值的文字
  
  HspEBonus = "%s的%s还剩%s点!"  #敌人的生命护盾损伤后显示剩余值的文字
  
  HspADamage = "%s的%s受到%s点伤害!"  #玩家人物的生命护盾受到伤害的文字
  
  HspEDamage = "%s的%s受到%s点伤害!"  #敌人的生命护盾受到伤害的文字
  
  HspARecovery  = "%s获得了一个%s点的%s保护!" #玩家的生命护盾得到提高的文字

  HspERecovery  = "%s接受了一个%s点的%s保护!" #敌人的生命护盾得到提高的文字

  HspADestory  = "%s的%s受到%s点伤害而遭到击破!" #玩家的生命护盾被击破时的文字
  
  HspEDestroy  = "%s的%s受到%s点伤害而被击破了!" #敌人的生命护盾被击破时的文字
  
  def self.play_actor_amuhspdamage  # 玩家的生命护盾受到伤害的音效
    Audio.se_play("Audio/SE/sword1.ogg", 100, 50)
  end
  
  def self.play_enemy_amuhspdamage   # 敌人的生命护盾受到伤害的音效
    Audio.se_play("Audio/SE/sword1.ogg", 100, 50)
  end
  
  def self.play_amuhsp_destory   # 生命护盾被击破时的音效
    Audio.se_play("Audio/SE/Crash.ogg", 60, 90)
  end
  
  end
end

class Game_ActionResult
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :amuhsp_damage                # 生命护盾 伤害
  #--------------------------------------------------------------------------
  # ● 清除伤害值`
  #--------------------------------------------------------------------------
  alias amu_20141125_clear_damage_values clear_damage_values
  def clear_damage_values
    amu_20141125_clear_damage_values
    @amuhsp_damage = 0
  end
  #--------------------------------------------------------------------------
  # ● 生成伤害
  #--------------------------------------------------------------------------
  alias amu_20141125_make_damage make_damage
  def make_damage(value, item)
    amu_20141125_make_damage(value, item)
    @amuhsp_damage = value if item.damage.to_hp? && @battler.amuhsp > 0 && value > 0
    @amuhsp_damage = value if item.damage.to_hp? && item.damage.recover? && item.note.include?("[护盾恢复]")
  end
  #--------------------------------------------------------------------------
  # ● 获取具有生命护盾时 HP 伤害的文字
  #--------------------------------------------------------------------------
  def hp_damage_text
    if @hp_drain > 0
      fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
      sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
    elsif @hp_damage > 0
      fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
      sprintf(fmt, @battler.name, @hp_damage)
    elsif @hp_damage < 0
      fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
      sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
    elsif @hp_damage = 0 && @battler.amuhsp > 0
      fmt = @battler.actor? ? Amu::Hsp::HspABonus : Amu::Hsp::HspEBonus
      sprintf(fmt, @battler.name, Amu::Hsp::HspName, @battler.amuhsp)
    else
      fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
      sprintf(fmt, @battler.name)
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取 生命护盾 伤害的文字
  #--------------------------------------------------------------------------
  def amuhsp_damage_text
    if @amuhsp_damage > 0 && @battler.amuhsp > 0
      fmt = @battler.actor? ? Amu::Hsp::HspADamage : Amu::Hsp::HspEDamage
      sprintf(fmt, @battler.name, Amu::Hsp::HspName, @amuhsp_damage)
    elsif @amuhsp_damage > 0 && @battler.amuhsp == 0
      fmt = @battler.actor? ? Amu::Hsp::HspADestory : Amu::Hsp::HspEDestroy
      sprintf(fmt, @battler.name, Amu::Hsp::HspName, @amuhsp_damage)
    elsif @amuhsp_damage < 0
      fmt = @battler.actor? ? Amu::Hsp::HspARecovery : Amu::Hsp::HspERecovery
      sprintf(fmt, @battler.name, -@amuhsp_damage, Amu::Hsp::HspName)
    else
      ""
    end
  end
end


class Game_BattlerBase
  attr_reader   :amuhsp                       # 生命护盾
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias amu_20141125_initialize initialize
  def initialize
    amu_20141125_initialize
    @amuhsp = 0
  end
  #--------------------------------------------------------------------------
  # ● 更改 HSP
  #--------------------------------------------------------------------------
  def amuhsp=(amuhsp)
    @amuhsp = amuhsp
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  alias amu_20141125_refresh refresh
  def refresh
    amu_20141125_refresh
    @amuhsp = [@amuhsp, 0].max
  end
end

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 计算伤害
  #--------------------------------------------------------------------------
  if Amu::Hsp::HspNoAddition == true
    def make_damage_value(user, item)
      value = item.damage.eval(user, self, $game_variables)
      value *= item_element_rate(user, item)
      value *= pdr if item.physical? && !make_amuhsp?(item)
      value *= mdr if item.magical? && !make_amuhsp?(item)
      value *= rec if item.damage.recover? && !make_amuhsp?(item)
      value = apply_critical(value) if @result.critical
      value = apply_variance(value, item.damage.variance)
      value = apply_guard(value)
      if make_amuhsp?(item)
        def actor_amuhsp?
          return true
        end
      end
      @result.make_damage(value.to_i, item)
    end
  else
    alias amu_20141125_make_damage_value make_damage_value
    def make_damage_value(user, item)
      amu_20141125_make_damage_value(user, item)
      if make_amuhsp?(item)
        def actor_amuhsp?
          return true
        end
      end
    end
  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
    if self.amuhsp > 0 && @result.hp_damage > 0
      eamuhsp = self.amuhsp
      self.amuhsp -= @result.hp_damage
      self.amuhsp <= 0 ? @result.hp_damage -= eamuhsp : @result.hp_damage = 0
    end
    if actor_amuhsp?
      self.amuhsp -= @result.hp_damage
      @result.hp_damage = 0
      def actor_amuhsp?
        return false
      end
    else
      self.hp -= @result.hp_damage
    end
    self.mp -= @result.mp_damage
    user.hp += @result.hp_drain
    user.mp += @result.mp_drain
  end
  #--------------------------------------------------------------------------
  # ● 判断技能是否用来增加生命护盾
  #--------------------------------------------------------------------------
  def make_amuhsp?(item)
    return false unless item.is_a?(RPG::Skill)
    return item.note.include?("[护盾恢复]")
  end
  def actor_amuhsp?
    return false
  end
  #--------------------------------------------------------------------------
  # ● 清除 生命护盾
  #--------------------------------------------------------------------------
  def clear_amuhsp
    self.amuhsp = 0
  end
  #--------------------------------------------------------------------------
  # ● 战斗结束处理
  #--------------------------------------------------------------------------
  alias amu_20141125_on_battle_end on_battle_end
  def on_battle_end
    amu_20141125_on_battle_end
    clear_amuhsp if Amu::Hsp::HspClear == true
  end
end

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 设置具有生命护盾时玩家被击的效果
  #--------------------------------------------------------------------------
  def perform_hspdamage_effect
    $game_troop.screen.start_shake(5, 5, 10)
    @sprite_effect_type = :blink
    Amu::Hsp.play_actor_amuhspdamage
  end
end

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 设置具有生命护盾时敌人被击的效果
  #--------------------------------------------------------------------------
  def perform_hspdamage_effect
    $game_troop.screen.start_shake(5, 5, 10)
    @sprite_effect_type = :blink
    Amu::Hsp.play_enemy_amuhspdamage
  end
end

class Window_BattleLog < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 显示伤害
  #--------------------------------------------------------------------------
  def display_damage(target, item)
    if target.result.missed
      display_miss(target, item)
    elsif target.result.evaded
      display_evasion(target, item)
    else
      display_amuhsp_damage(target, item)
      display_hp_damage(target, item)
      display_mp_damage(target, item)
      display_tp_damage(target, item)
    end
  end
  #--------------------------------------------------------------------------
  # ● 显示 生命护盾 伤害
  #--------------------------------------------------------------------------
  def display_amuhsp_damage(target, item)
    return if target.dead? || target.result.amuhsp_damage == 0
    if target.result.amuhsp_damage > 0 && target.amuhsp > 0 && target.result.hp_drain == 0
      target.perform_hspdamage_effect
    end
    Amu::Hsp.play_amuhsp_destory if target.result.amuhsp_damage > 0 && target.amuhsp == 0
    Sound.play_recovery if target.result.amuhsp_damage < 0
    add_text(target.result.amuhsp_damage_text)
    wait
  end
end[/pre]

点评

_(:з」∠)_ 直接方向键移动,也就是放弃掉光标操作的做法啦。我不喜欢鼠标,所以要做一定要做成手柄也能操作的很愉快的形式。  发表于 2015-2-8 15:30
应该不会有大问题,因为每次调用前大概都会有一次重定义= = 话说发现移动的战棋系统是啥  发表于 2015-2-8 15:27
写这个的时候我还不懂这个呢,做了一些实测还没有碰到什么显著问题。嘛,如果有人碰到问题我再去该吧……最近在写直接用发现移动的战棋系统  发表于 2015-2-8 15:26
调用 def actor_amuhsp?; true; end 是对整个类起作用的,而不是一个实例  发表于 2015-2-8 15:22
actor_amuhsp? 这东西定义方法略奇葩,而且可能还有问题(虽然不会表现出来)。就不能用一个实例变量嘛!  发表于 2015-2-8 15:21
回复

使用道具 举报

闇吼者の災悪眷族

梦石
0
星屑
1366
在线时间
2881 小时
注册时间
2014-7-29
回帖
6408
发表于 2015-2-8 15:14:14 | 显示全部楼层
如果你只是想知道数组是个大概什么意思,我就粗糙的解说一下。

首先你看数组的初始化是 a = []
这个中括号你可以理解成一个标识,那么我们先假设 a = [1, 2, 3, 4 ,5]
那么我们怎么使用数组中的元素呢?
a[0] 就是 1
a[1] 就是 2
a[X] 中的X代表的就是数组的第X个元素,以为程序是从0为起点的,所以领头的都是0。
你也可以使用a[-1],那么你就会得到 5 也就是素组从倒数第一个数,同理a[-2]就是4了。

如果想要操作数组中个别元素就是
令a[3] = 9 ,那么a就变成了 [1, 2, 3, 9 ,5] 了。

如果是想增加元素呢就是
令a[6] = 7  ,那么a就变成了 [1, 2, 3, 9 ,5 ,nil ,7] 了。
元素可以直接加进去,没有赋值的元素会自动用nil填补。

其实这都是F1帮助中解明的非常清楚的内容,想要学习的话看F1是最快的啦~

然后就是,如果你让一个变量 $game_variables[1] 是一个数组,就是使用$game_variables[1][X]的形式来调用里面的元素。
你不一定要让变量初始化的时候就是空的数组,也就是
$game_variables[1] = []
你可以在调用数组元素前就直接给它赋值成一个数组,比如:
$game_variables[X] = []
$game_variables[X][Y] = Z
也就是执行两句话。

大致明白了吗?如果还有啥疑问就请追问。

点评

忠告:不能完全清楚全局变量的内容时不要改动它。全局变量就是这样一个可怕的东西...  发表于 2015-2-9 10:27
那我是不是该问你为什么不知道值呢? 5000个默认变量上限你能用的完吗?要是用的完还可以扩展上限。  发表于 2015-2-8 17:12
要是不知道v[x]值的话呢?不是故意钻牛角尖的说  发表于 2015-2-8 16:49
$game_variables[X]默认是0,你为什么不用0来判断呢……  发表于 2015-2-8 16:20
直接写 if v[x][y] != 0 的话,假如实际情况是 v[x]不是数组或者v[x][y]==nil的话就会出错吧  发表于 2015-2-8 16:05

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-2-9 10:21:29 | 显示全部楼层
  1. $game_variables[X]=[];$game_variables[X][Y]=Z
复制代码
怎样?
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部