查看: 2150|回复: 1

[已经解决] 求帮忙把佣兵界面的战斗图变成动态行走图

[复制链接]
梦石
0
星屑
1748
在线时间
485 小时
注册时间
2006-1-7
回帖
996
发表于 2015-6-4 15:38:09 | 显示全部楼层 |阅读模式

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

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

×
Data.zip (172.23 KB, 下载次数: 76)

我不知道怎么做好
把原来定义的 draw 换成 refresh 就不会更新角色了,做出之后,只有一个人,光标切换到别人身上还是不更新。

求帮忙

@RyanBern

下面是我自己修改的结果

点击展开/收起
[pre lang="ruby"]
module Mercenaries
class Window_Help < ::Window_Base
  def initialize
    super(0, 0, 196, 276)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.size = 18
    @actor = nil
    self.z += 10
    @o_count = @count = 0
  end
  def refresh#(actor)#draw_actor(actor)
#    if @actor != actor
      self.contents.clear
      
      bitmap = RPG::Cache.character(@actor.character_name, @actor.character_hue)
      bx = (158 - bitmap.width / 4)/ 2
      by = 96 - bitmap.height / 8
      cw = bitmap.width / 4
      ch = bitmap.height / 4
      src_rect = Rect.new(@o_count*cw, 0, cw, ch)
      self.contents.blt(bx, by, bitmap, src_rect)
      
      self.contents.draw_text(4, 4 + 0, 196, 18, "佣金:" + @actor.price.to_s)
      self.contents.draw_text(4, 4 + 20, 196, 18, "姓名:" + @actor.name)
      self.contents.draw_text(4, 160, 196, 18, "物攻:#{@actor.atk}")
      self.contents.draw_text(4, 180, 196, 18, "物防:#{@actor.pdef}")
      self.contents.draw_text(4, 200, 196, 18, "魔攻:#{@actor.int}")
      self.contents.draw_text(4, 220, 196, 18, "魔防:#{@actor.mdef}")
#      @actor = actor
#    end
  end
  
  def update(actor)
    super
    if @actor != actor
      @actor = actor
    end
    @count += 1
    @count = 0 if @count == 40
    if @o_count != @count / 10
      @o_count = @count / 10
      refresh
    end
  end
end

class Window_ShopCommand < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
  def initialize
    super(80, 90 - 64, 480, 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = 3
    @column_max = 3
    @commands = ["雇佣", "解雇", "取消"]
    refresh
    self.index = 0
  end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i)
    end
  end
#--------------------------------------------------------------------------
# ● 描绘项目
# index : 项目编号
#--------------------------------------------------------------------------
  def draw_item(index)
    x = 4 + index * 160
    self.contents.draw_text(x, 0, 128, 32, @commands[index])
  end
end

#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------

class Window_Mercenaries < ::Window_Selectable
  attr_reader :column_max
  attr_reader :item_max
  attr_reader :mercenaries
  def initialize(mercenaries)
    super(80, 90, 480, 320)
    @mercenaries = mercenaries
    @column_max = 7
    refresh
    self.index = 0
  end
  def set_mercenaries(mercenaries)
    @mercenaries = mercenaries
    refresh
  end
  def id
    return @mercenaries[self.index]
  end
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @item_max = @mercenaries.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 80)
      for i in 0...@item_max
        draw_actor(i) if @mercenaries != nil#凌冰
      end
    end
  end
  def draw_actor(index)
    x = 4 + (index % @column_max * 64)
    y = 4 + (index / @column_max * 80)
    actor = $game_actors[@mercenaries[index]]
    bitmap = RPG::Cache.character(actor.character_name,actor.character_hue)
    rect = bitmap.rect
    rect.width /= 4
    rect.height /= 4
    self.contents.blt(x, y, bitmap, rect)
    self.contents.font.size = 12
    self.contents.draw_text(x, y + 64 - 8, 64, 16, actor.name)
    self.contents.font.size = 9
    self.contents.draw_text(x + 4, y + 64 - 16, 64, 9, "Lv."+sprintf("%02d", actor.level))
  end
#--------------------------------------------------------------------------
# ● 更新光标举行
#--------------------------------------------------------------------------
  def update_cursor_rect
    # 光标位置不满 0 的情况下
    if @index < 0
      self.cursor_rect.empty
      return
    end
    # 获取当前的行
    row = @index / @column_max
    # 当前行被显示开头行前面的情况下
    if row < self.top_row
      # 从当前行向开头行滚动
      self.top_row = row
    end
    # 当前行被显示末尾行之后的情况下
    if row > self.top_row + (self.page_row_max - 1)
      # 从当前行向末尾滚动
      self.top_row = row - (self.page_row_max - 1)
    end
    # 计算光标的宽
    cursor_width = self.width / @column_max - 32
    # 计算光标坐标
    x = @index % @column_max * 64
    y = @index / @column_max * 80 - self.oy
    # 更新国标矩形
    self.cursor_rect.set(x, y, 64, 80)
  end
end


#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
#--------------------------------------------------------------------------
class Scene_Mercenaries
  def initialize(mercenaries)
    @mercenaries = mercenaries
    for actor in $game_party.actors
      if @mercenaries.include?(actor.id)
        @mercenaries.delete(actor.id)
      end
    end
    @windows = []
    @temp = @mercenaries.dup
    @type = -1
  end
  
  def main_start
    make_window
    @spriteset = Spriteset_Map.new
  end
  
  def main_loop
    while $scene == self
      rm_update
      input_update
      update_window
    end
  end
  def main_end
    dispose_window
    @spriteset.dispose
  end
  def main
    main_start
    Graphics.transition
    main_loop
    Graphics.freeze
    main_end
  end
  def make_window
    @window_shopcommand = Window_ShopCommand.new
    @window_help = Window_Help.new
    @window_mercenaries = Window_Mercenaries.new(@mercenaries)
    @window_mercenaries.active = false
    @window_mercenaries.index = -1
    wx = (@window_mercenaries.index % @window_mercenaries.column_max * 64)
    wy = (@window_mercenaries.index / @window_mercenaries.column_max * 80)
    @window_help.x = wx + @window_mercenaries.x + 64
    @window_help.y = wy + @window_mercenaries.y + 80
    @window_gold = Window_Gold.new
    @window_gold.x = 640 - @window_gold.width - 32
    @window_gold.y = 480 - @window_gold.height - 32
    @windows << @window_gold << @window_shopcommand << @window_mercenaries << @window_help
    @window_help.visible = false
  end
  def update_window
    @windows.each{ |window|window.update }
    help_update
  end
  def dispose_window
    @windows.each{ |window|window.dispose }
  end
  def help_update
    if @window_mercenaries.active and @window_mercenaries.id != nil#凌冰
      @window_help.visible = true
      wx = (@window_mercenaries.index % @window_mercenaries.column_max * 64)
      wy = (@window_mercenaries.index / @window_mercenaries.column_max * 80)
      @window_help.x = wx + @window_mercenaries.x + 64 #动态调整介绍窗口的坐标
      @window_help.y = wy + @window_mercenaries.y + 80
      if @window_help.x + @window_help.width > 640
        @window_help.x = 640 - @window_help.width
      end
      if @window_help.y + @window_help.height > 480
        @window_help.y = 480 - @window_help.height
      end
      @window_help.update($game_actors[@window_mercenaries.id]) #byakki
    else
      @window_help.visible = false
    end
  end
  def input_update
    if Input.trigger?(Input::B)
      @type = -1
      @window_shopcommand.active = true
      @window_mercenaries.active = false
      @window_mercenaries.index = -1
      return
    end
    if Input.trigger?(Input::C)
      if @window_shopcommand.active
        case @window_shopcommand.index
        when 0
          @window_mercenaries.set_mercenaries(@temp)
          @type = 0
          @window_shopcommand.active = false
          @window_mercenaries.active = true
          @window_mercenaries.index = 0
          return
          when 1
            actors = []
            for actor in $game_party.actors
              actors << actor.id and actors -= [1]
            end
            @window_mercenaries.set_mercenaries(actors)
            @type = 1
            @window_shopcommand.active = false
            @window_mercenaries.active = true
            @window_mercenaries.index = 0
            return
          when 2
            $scene = Scene_Map.new
            return
          end
        end
        case @type
        when 0
          if @window_mercenaries.id != nil and $game_party.gold >= $game_actors[@window_mercenaries.id].price
            if $game_party.actors.size < 4
              $game_party.lose_gold($game_actors[@window_mercenaries.id].price)
              $game_party.add_actor(@window_mercenaries.id)
              @window_mercenaries.mercenaries.delete(@window_mercenaries.id)
              @window_mercenaries.refresh
              if @window_mercenaries.index > @window_mercenaries.mercenaries.size-1
                @window_mercenaries.index = @window_mercenaries.mercenaries.size-1
              end
            end
          end
        when 1
          if @window_mercenaries.id != nil and $game_party.gain_gold($game_actors[@window_mercenaries.id].price / 2)
            $game_party.remove_actor(@window_mercenaries.id)
            @temp << @window_mercenaries.id
            @window_mercenaries.mercenaries.delete(@window_mercenaries.id)
            @window_mercenaries.refresh
            if @window_mercenaries.index > @window_mercenaries.mercenaries.size-1
              @window_mercenaries.index = @window_mercenaries.mercenaries.size-1
            end
          end
        end
        @window_gold.refresh
      end
    end
    def rm_update
      Graphics.update
      Input.update
    end
  end
end
############################################################
class Game_Actor
  def price
    price = @name.split(/,/)[1].nil? ? 0 : @name.split(/,/)[1].to_i
    return price * self.level
  end
  def name
    return @name.split(/,/)[0]
  end
end
   
class Game_System
  attr_reader :mercenaries
  alias old_initialize initialize
  def initialize
    old_initialize
    @mercenaries = {}
  end
end
[/pre]

评分

参与人数 1星屑 +35 收起 理由
RyanBern + 35 手动认可奖励

查看全部评分

初从文,三年不中;后习武,校场发一矢,中鼓吏,逐之出;遂学医,有所成。自撰一良方,服之,卒。
梦石
0
星屑
34462
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2015-6-4 22:46:16 | 显示全部楼层
一个简单的只是显示队伍角色行走图动态的窗口
  1. class Window_Actor_Act < Sprite
  2.   #--------------------------------------------------------------------------
  3.   def initialize
  4.     super()
  5.     self.bitmap = Bitmap.new(640, 480)
  6.     @count = 0
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   def dispose
  10.     self.bitmap.dispose
  11.     super
  12.   end
  13.   #--------------------------------------------------------------------------
  14.   def refresh
  15.     self.bitmap.clear
  16.     x = 320 - (100 * $game_party.actors.size / 2)
  17.     y = 140
  18.     for i in 0...$game_party.actors.size
  19.       ax = i * 100 + x
  20.       actor = $game_party.actors[i]
  21.       bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)
  22.       cw = bitmap.width / 4 ; ch = bitmap.height / 4
  23.       self.bitmap.blt(ax, y, bitmap, Rect.new(@count / 10 * cw, 0, cw, ch))
  24.     end
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   def update
  28.     super
  29.     @count = (@count + 1) % 40
  30.     if @data_count != (@count / 10)
  31.       @data_count = (@count / 10)
  32.       refresh
  33.     end
  34.   end
  35. end
复制代码

点评

瞬间我就开窍了。以前是在draw的位置(actor),的。现在在初始化的时候就(actor),然后就都明白了。不管怎样,多谢了~!  发表于 2015-6-6 19:15
我从未试过~~~我还是先去试一下吧。  发表于 2015-6-5 20:50
多谢芯。不过让它动起来我还是会的。只是这个佣兵的信息窗口是跟其他的东西关联的。一关联我就不明白了。  发表于 2015-6-5 20:48

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部