查看: 2519|回复: 6

[已经解决] [已解决]Scene_Equip 刷新部分的一些疑问

[复制链接]
梦石
0
星屑
15041
在线时间
2230 小时
注册时间
2019-1-24
回帖
964

R考场第七期纪念奖

发表于 2019-11-14 19:29:07 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 miantouchi 于 2019-11-14 20:48 编辑

class Scene_Equip 类当中refresh 几点疑问?
看了差不多2天吧,不知道是我笨还是太难了,太绕了有点。
问题一,hp和sp好像在刷新里面根本就没用到?只用了攻击、物防、法防这三个的描绘。
      last_hp = @actor.hp
      last_sp = @actor.sp
      @actor.hp = last_hp
      @actor.sp = last_sp
问题二,
我的疑问是为什么去掉,@actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)这一句后会出现默认的数值和后面的装备后数值是一样的

我看了下Window_EquipLeft的refresh里面,
   draw_actor_parameter(@actor, 4, 64, 0)#描绘能力值0,1,2 攻击、防御、魔法
    draw_actor_parameter(@actor, 4, 96, 1)
    draw_actor_parameter(@actor, 4, 128, 2)
应该是这三句话描绘的装备前的数值,
我注释掉的这句话是如何影响到的?

以下是分别两个类的源码

[pre lang="ruby"]#==============================================================================
# ■ Scene_Equip
#------------------------------------------------------------------------------
#  处理装备画面的类。
#==============================================================================

class Scene_Equip
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    # 设置物品窗口的可视状态
    @item_window1.visible = (@right_window.index == 0)
    @item_window2.visible = (@right_window.index == 1)
    @item_window3.visible = (@right_window.index == 2)
    @item_window4.visible = (@right_window.index == 3)
    @item_window5.visible = (@right_window.index == 4)
    # 获取当前装备中的物品
    item1 = @right_window.item
    # 设置当前的物品窗口到 @item_window
    case @right_window.index
    when 0
      @item_window = @item_window1
    when 1
      @item_window = @item_window2
    when 2
      @item_window = @item_window3
    when 3
      @item_window = @item_window4
    when 4
      @item_window = @item_window5
    end
    # 右窗口被激活的情况下
    if @right_window.active
      # 删除变更装备后的能力
      @left_window.set_new_parameters(nil, nil, nil)
    end
    # 物品窗口被激活的情况下
    if @item_window.active
      # 获取现在选中的物品
      item2 = @item_window.item
      # 变更装备
      last_hp = @actor.hp
      last_sp = @actor.sp
      @actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
      # 获取变更装备后的能力值
      new_atk = @actor.atk
      new_pdef = @actor.pdef
      new_mdef = @actor.mdef
      # 返回到装备
      @actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
      @actor.hp = last_hp
      @actor.sp = last_sp
      # 描画左窗口
      @left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
    end
  end

end[/pre]

[pre lang="ruby"]

#==============================================================================
# ■ Window_EquipLeft
#------------------------------------------------------------------------------
#  装备画面的、显示角色能力值变化的窗口。
#==============================================================================

class Window_EquipLeft < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     actor : 角色
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 64, 272, 192)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_actor_name(@actor, 4, 0)         #描绘姓名 X、Y坐标
    draw_actor_level(@actor, 4, 32)      
    draw_actor_parameter(@actor, 4, 64, 0)#描绘能力值0,1,2 攻击、防御、魔法
    draw_actor_parameter(@actor, 4, 96, 1)
    draw_actor_parameter(@actor, 4, 128, 2)
    #p @new_atk
    if @new_atk != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 64, 40, 32, "→", 1)
      self.contents.font.color = normal_color
      self.contents.draw_text(200, 64, 36, 32, @new_atk.to_s, 2)
    end
    if @new_pdef != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 96, 40, 32, "→", 1)
      self.contents.font.color = normal_color
      self.contents.draw_text(200, 96, 36, 32, @new_pdef.to_s, 2)
    end
    if @new_mdef != nil
      self.contents.font.color = system_color
      self.contents.draw_text(160, 128, 40, 32, "→", 1)
      self.contents.font.color = normal_color
      self.contents.draw_text(200, 128, 36, 32, @new_mdef.to_s, 2)
    end
  end
  #--------------------------------------------------------------------------
  # ● 变更装备后的能力值设置
  #     new_atk  : 变更装备后的攻击力
  #     new_pdef : 变更装备后的物理防御
  #     new_mdef : 变更装备后的魔法防御
  #--------------------------------------------------------------------------
  def set_new_parameters(new_atk, new_pdef, new_mdef)
    if @new_atk != new_atk or @new_pdef != new_pdef or @new_mdef != new_mdef
      @new_atk = new_atk
      @new_pdef = new_pdef
      @new_mdef = new_mdef
      refresh
    end
  end
end
[/pre]

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2019-11-14 20:07:41 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2019-11-14 20:11 编辑



这里每次刷新, 都是经过了 装备上B, 记录增减数值, 装备回A 的过程

所以, 你第一个问题的答案就是 : 这里是为了换回装备后还原为原本的HP SP, 避免因为内部更换装备而导致HP SP的剩余值出现变化, 并不是为了描绘

第二个问题的答案是 : 你把装备B的句子注释掉了, 结果就是一直是装备A的情况, 那自然能力值就没变化啦

知道这个场景的工作流程你应该就能看懂了吧

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
miantouchi + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
15041
在线时间
2230 小时
注册时间
2019-1-24
回帖
964

R考场第七期纪念奖

 楼主| 发表于 2019-11-14 20:42:34 | 显示全部楼层
本帖最后由 miantouchi 于 2019-11-14 20:44 编辑
灯笼菜刀王 发表于 2019-11-14 20:07
这里每次刷新, 都是经过了 装备上B, 记录增减数值, 装备回A 的过程

所以, 你第一个问题的答案 ...


我今天还纳闷呢,这代码闹着玩呢,
比方我手上是铜剑,包里是铁剑,
装备铁剑,然后又装备上铜剑。
来来回回和没处理一样,经过你提醒
这个过程纯粹是为了记录装备后的数值。
然后把装备后的值描绘出来,被装备的原始武器还没有改变,就达到了,光标移动能自动显示对比的数值了。
现在一看看是我思路跟不上趟
回复

使用道具 举报

梦石
0
星屑
15041
在线时间
2230 小时
注册时间
2019-1-24
回帖
964

R考场第七期纪念奖

 楼主| 发表于 2019-11-14 21:23:57 | 显示全部楼层
灯笼菜刀王 发表于 2019-11-14 20:07
这里每次刷新, 都是经过了 装备上B, 记录增减数值, 装备回A 的过程

所以, 你第一个问题的答案 ...

对了还有一个问题
def equip(equip_type, id)
    case equip_type
    when 0  # 武器
      if id == 0 or $game_party.weapon_number(id) > 0
        $game_party.gain_weapon(@weapon_id, 1)
        @weapon_id = id
        $game_party.lose_weapon(id, 1)
      end
end
其中,id == 0 or $game_party.weapon_number(id) > 0这句话不太明白
比方我现在装备的铜剑id==1,物品栏是铁剑id==2
id != 0 ,后面的 $game_party.weapon_number(id)为什么要用这个判断?
1.队伍武器数量也就是id>0何必写那么长呢?
直接id==0 or id >0得了
2.$game_party.weapon_number(id)是队伍所持id这个武器数量,包含人物身上装备的吗?

点评

哈哈,我就理解个字面啊,不过你这么说,我就明白了。  发表于 2019-11-14 23:11
你都知道是为了判断包里有没有这个道具了, 那还问为啥? 要装备的时候自然要先判断包里有没有这东西啦, 而id==0是表示卸下的时候  发表于 2019-11-14 23:01
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部