Project1

标题: 2100帮忙改个范例。。关于宠物系统的 [打印本页]

作者: 幻耶    时间: 2008-6-17 00:27
标题: 2100帮忙改个范例。。关于宠物系统的
因为某些需要,我在游戏中设置了随时交换角色的位置,比如在公共事件里有以下脚本:

a = $game_party.actors[1]
$game_party.actors[1] = $game_party.actors[
2]
$game_party.actors[2] = a


但是如果战斗场景中角色装备有宠物,宠物不会随着角色队列的改变而改变,只会停留在原来的位置,而且宠物的图片会消失,直到进入下一场战斗才会刷新,如何在战斗中让宠物能随着主人位置的变化而变化呢?



宠物系统ver1.2
http://rpg.blue/web/htm/news169.htm






还是追加悬赏吧。。。麻烦哪位帮我把这个范例修改成功,只要使用范例中的特技"互换"使2个角色交换位置,然后她们所装备的宠物也跟着各自的主人移动位置就可以了

范例
http://rpg.blue/upload_program/files/huhuanweizhi_94082788.rar
[LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: link006007    时间: 2008-6-17 02:06
不能改变是绝对的
@father_id 只是队伍中某个索引对应的角色, 并不是角色本身
1号2号队员换了位置 但是1号索引还是1号, 只是指向2号队员而已
而且你交换队员也并没有炒作@father_id

作者: 幻耶    时间: 2008-6-17 02:11
真的没有办法解决了么??那个脚本其它冲突都解决了,就剩这个了...


作者: 幻耶    时间: 2008-6-17 02:16
如果实在不行的话,那个宠物图片消失的问题能不能解决?因为队伍角色位置互换之后,角色装备的宠物的图片不见了
作者: link006007    时间: 2008-6-17 02:22
   Sprite_Pet 里面   没试过
  def initialize(viewport, father_id = 0)
    super(viewport)
    @father_id = 0
    if $game_party.actors[father_id] != nil
      if $game_party.actors[father_id].pet_id != 0
        @battler = Game_Pet.new($game_party.actors[father_id].pet_id)
        @father_id = $game_party.actors[father_id].id
      else
      
  def update
    ... ...
    # 设置活动块的坐标   
    self.x = $game_party.actors.index($game_party.actors[@father_id]) * 160 + 85
    self.y = 400
    self.z = 5
    self.zoom_x = 0.6
    self.zoom_y = 0.6

作者: 幻耶    时间: 2008-6-17 03:53
改成上面这样一进入战斗就出错了

387行就是这一行吧:   @battler = Game_Pet.new($game_party.actors[father_id].pet_id)




作者: link006007    时间: 2008-6-17 04:14
不是那个错误吧
原脚本长的就那样
作者: 幻耶    时间: 2008-6-17 04:22
不改的话没问题啊,这是我改了之后的脚本,或者哪里改错了??


class Sprite_Pet < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :battler                  # 战斗者
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     viewport : 显示端口;battler  : 战斗者 (Game_Battler)
  #--------------------------------------------------------------------------
  def initialize(viewport, father_id = 0)
    super(viewport)
   @father_id = 0
   if $game_party.actors[father_id] != nil
     if $game_party.actors[father_id].pet_id != 0
       @battler = Game_Pet.new($game_party.actors[father_id].pet_id)
       @father_id = $game_party.actors[father_id].id
      else
        @battler = nil
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 战斗者为 nil 的情况下
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    if self.battler != nil
      self.bitmap = RPG::Cache.battler(@battler.battler_name, @battler.battler_hue)
      if @battler.animation_id != 0
        animation = $data_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit)
        @battler.animation_id = 0
      end
      if $game_party.actors[@father_id].pet_id == 0
        self.battler = nil
        collapse
      end
    end
    # 设置活动块的坐标   
    self.x = $game_party.actors.index($game_party.actors[@father_id]) * 160 + 85
    self.y = 400
    self.z = 5
    self.zoom_x = 0.6
    self.zoom_y = 0.6
  end
end

作者: 幻耶    时间: 2008-6-17 04:27
PS:我是在前天你指导下完成的那个由主人生死决定宠物行动的脚本基础上改的
作者: link006007    时间: 2008-6-17 04:32
以下引用幻耶于2008-6-16 20:27:19的发言:

@battler = Game_Pet.new($game_party.actors[father_id].pet_id, father_id)

不过这样的话, 你那个宠物死了会攻击又有问题了{/gg}
作者: 幻耶    时间: 2008-6-17 04:37
那麻烦看看这工程,用原来的脚本进入战斗没问题,改了之后一进战斗就报错

http://rpg.blue/upload_program/files/huhuanweizhi_94082788.rar
作者: link006007    时间: 2008-6-17 04:38
对不起  对不起
我自己的搞错了...
就算能用   我说的那个方法本身计算也是错的 orz
我先告诉你下{/gg}{/gg}
作者: 幻耶    时间: 2008-6-17 04:44
那个宠物死了会攻击又有问题是什么意思?
作者: link006007    时间: 2008-6-17 04:45
这个帖子我一开始就错了   
你就当成我没有回帖就好了 = =
作者: 幻耶    时间: 2008-6-17 04:48
错在哪里总可以说吧{/gg}
作者: link006007    时间: 2008-6-17 04:52
你先试试吧{/gg}  
Sprite_Pet 里面
def initialize(viewport, father_id = 0)
   super(viewport)
   @father_id = 0
   if $game_party.actors[father_id] != nil
     if $game_party.actors[father_id].pet_id != 0
       @father_id = $game_party.actors[father_id].id
       @battler = Game_Pet.new($game_party.actors[father_id].pet_id,
                               @father_id)      
     else
      
def update
   ... ...
   # 设置活动块的坐标   
   self.x = $game_party.actors.index($game_actors[@father_id]) * 160 + 85

class Game_Pet < Game_Battler
def movable?
   return (not @hidden and restriction < 4) && !$game_actors[@father_id].dead?
end

本来不想用$game_actors的 不过还是算了

作者: link006007    时间: 2008-6-17 05:05
以下引用幻耶于2008-6-16 20:48:32的发言:

错在哪里总可以说吧

因为改过的Game_Pet多传了一个参数
以下引用dbshy于2008-6-16 21:01:00的发言:

公共事件这样做到也是可以呢
作者: 幻耶    时间: 2008-6-17 05:09


以下引用link006007于2008-6-16 20:52:40的发言:

你先试试吧  
Sprite_Pet 里面
def initialize(viewport, father_id = 0)
  super(viewport)
  @father_id = 0
  if $game_party.actors[father_id] != nil
    if $game_party.actors[father_id].pet_id != 0
      @father_id = $game_party.actors[father_id].id
      @battler = Game_Pet.new($game_party.actors[father_id].pet_id,
                              @father_id)      
    else
     
def update
  ... ...
  # 设置活动块的坐标   
  self.x = $game_party.actors.index($game_actors[@father_id]) * 160 + 85

class Game_Pet < Game_Battler
def movable?
  return (not @hidden and restriction < 4) && !$game_actors[@father_id].dead?
end

本来不想用$game_actors的 不过还是算了




改成这样进入战斗也出错了

作者: 幻耶    时间: 2008-6-17 05:12
以下引用dbshy于2008-6-16 21:01:00的发言:

。。。


game_party.actors[father_id].maseter_id_position = father_id放在那个IF中




[本贴由作者于 2008-6-16 21:03:02 最后编辑]




放在哪个IF中?
作者: link006007    时间: 2008-6-17 05:13
{/gg}
这是为什么呢?
$game_party.actors[father_id].pet_id
是这个么...
我已经废了...
作者: dbshy    时间: 2008-6-17 05:14
if $game_party.actors[father_id].pet_id != 0
      
    else

放在这里

作者: 幻耶    时间: 2008-6-17 05:23
以下引用link006007于2008-6-16 21:13:33的发言:


这是为什么呢?
$game_party.actors[father_id].pet_id
是这个么...
我已经废了...




是这一句啊:      if $game_party.actors[@father_id].pet_id == 0
作者: link006007    时间: 2008-6-17 05:24
我没写这一句啊 {/fd}
作者: 幻耶    时间: 2008-6-17 05:35
以下引用dbshy于2008-6-16 21:14:15的发言:

if $game_party.actors[father_id].pet_id != 0
     
   else

放在这里



[本贴由作者于 2008-6-16 21:14:57 最后编辑]





这样??
#==============================================================================
# ■ Sprite_Pet
#——————————————————————————————————————
# 全新定义
#==============================================================================
class Sprite_Pet < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :battler                  # 战斗者  
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     viewport : 显示端口;battler  : 战斗者 (Game_Battler)
  #--------------------------------------------------------------------------
  def initialize(viewport, father_id = 0)
    super(viewport)
    @father_id = father_id
    if $game_party.actors[father_id] != nil
      if game_party.actors[father_id].maseter_id_position = father_id
        @battler = Game_Pet.new($game_party.actors[father_id].pet_id, father_id)
      else
        @battler = nil
      end
    end
  end
作者: 幻耶    时间: 2008-6-17 05:40
以下引用dbshy于2008-6-16 21:01:00的发言:

class Game_Actor中加attr_accessor :maseter_id_position

class Sprite_Pet中加$game_party.actors[father_id].maseter_id_position = father_id
                    self.x = $game_party.actors[@father_id].maseter_id_position * 160 + 85

公共事件a = $game_party.actors[1]
$game_party.actors[1] = $game_party.actors[
2]
$game_party.actors[2] = a
$game_party.actors[1].maseter_id_position= 2
$game_party.actors[2].maseter_id_position= 1


game_party.actors[father_id].maseter_id_position = father_id放在那个IF中




[本贴由作者于 2008-6-16 21:03:02 最后编辑]






这样改的话一进入战斗也出错了?

作者: dbshy    时间: 2008-6-17 05:49
if $game_party.actors[father_id].pet_id != 0
     $game_party.actors[father_id].maseter_id_position = father_id

   else
是这样.....
作者: 幻耶    时间: 2008-6-17 06:00
以下引用dbshy于2008-6-16 21:49:23的发言:

if $game_party.actors[father_id].pet_id != 0
    $game_party.actors[father_id].maseter_id_position = father_id

  else
是这样.....



这样的话装备好宠物进入战斗怎么宠物都没有了?
作者: dbshy    时间: 2008-6-17 06:03
if中加$game_party.actors[father_id].maseter_id_position = father_id
其他的不要删
作者: 幻耶    时间: 2008-6-17 06:04
还是追加悬赏吧。。。麻烦哪位帮我把这个范例修改成功,只要使用范例中的特技"互换"使2个角色交换位置,然后她们所装备的宠物也跟着各自的主人移动位置就可以了

范例
http://rpg.blue/upload_program/files/huhuanweizhi_94082788.rar
作者: dbshy    时间: 2008-6-17 06:16
这样改即可,已成功


class Sprite_Pet < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :battler                  # 战斗者
  
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     viewport : 显示端口;battler  : 战斗者 (Game_Battler)
  #--------------------------------------------------------------------------
  def initialize(viewport, father_id = 0)
    super(viewport)
    @father_id = father_id
    if $game_party.actors[father_id] != nil
      if $game_party.actors[father_id].pet_id != 0
        @battler = Game_Pet.new($game_party.actors[father_id].pet_id, father_id)
#==========================================================
        $game_party.actors[father_id].maseter_id_position = father_id
#==========================================================

      else
        @battler = nil
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 战斗者为 nil 的情况下
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end
    if self.battler != nil
      self.bitmap = RPG::Cache.battler(@battler.battler_name, @battler.battler_hue)
      if @battler.animation_id != 0
        animation = $data_animations[@battler.animation_id]
        animation(animation, @battler.animation_hit)
        @battler.animation_id = 0
      end
      if $game_party.actors[@father_id].pet_id == 0
        self.battler = nil
        collapse
      end
    end
    # 设置活动块的坐标   
    self.x = $game_party.actors[@father_id].maseter_id_position * 160 + 85
    self.y = 400
    self.z = 5
    self.zoom_x = 0.6
    self.zoom_y = 0.6
  end
end [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: dbshy    时间: 2009-6-12 08:00
class Game_Actor中加attr_accessor :maseter_id_position

class Sprite_Pet中加$game_party.actors[father_id].maseter_id_position = father_id
                     self.x = $game_party.actors[@father_id].maseter_id_position * 160 + 85

公共事件a = $game_party.actors[1]
$game_party.actors[1] = $game_party.actors[
2]
$game_party.actors[2] = a
$game_party.actors[1].maseter_id_position= 2
$game_party.actors[2].maseter_id_position= 1


game_party.actors[father_id].maseter_id_position = father_id放在那个IF中






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1