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

Project1

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

[有事请教] 请问:注释掉3行代码后错误

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3925
在线时间
254 小时
注册时间
2013-10-13
帖子
790
跳转到指定楼层
1
发表于 2023-10-23 21:14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
module Mercenaries
  class Window_Help < ::Window_Base
    def initialize
      super(0, 0, 196, 256)
      self.contents = Bitmap.new(width - 32, height - 32)
      self.z += 10
    end
    def draw_actor(actor)
      self.contents.clear
      bitmap=RPG::Cache.battler(actor.battler_name, actor.battler_hue)
      self.contents.blt(0,0,bitmap,bitmap.rect)
      self.contents.draw_text(0,0,64,32,actor.price.to_s)
      self.contents.draw_text(0,32,64,32,actor.name)
      self.contents.draw_text(0,64,64,32,actor.class_name)
      self.contents.draw_text(0,96,64,32,"武器:#{$data_weapons[actor.weapon_id].name}")
      self.contents.draw_text(0,128,64,32,"铠甲:#{$data_armors[actor.armor3_id].name}")
      self.contents.draw_text(0,160,64,32,"攻击力:#{actor.atk}")
      self.contents.draw_text(0,192,64,32,"防御力:#{actor.pdef}")
      self.contents.draw_text(0,224,64,32,"魔御力:#{actor.mdef}")
    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
      for i in [email protected]
        x=i*160
        self.contents.draw_text(x,0,128,32,@commands)
      end
    end
  end#买卖指令窗口
  class Window_Mercenaries<::Window_Selectable
    attr_reader :mercenaries
    attr_reader :column_max
    def initialize(mercenaries)
      super(80, 90, 480, 320)
      @mercenaries = mercenaries
      @column_max = 7
      refresh
      self.index = 0
    end
    def id
      @mercenaries[self.index]
    end
    def set_mercenaries(mercenaries)
      @mercenaries=mercenaries
      refresh
    end
    def refresh
      @[email protected]
      if @item_max>0
        self.contents=Bitmap.new(width-32,row_max*80)
        for i in 0...@item_max
          draw_actor(i)
        end
      end
    end
    def draw_actor(index)
      x=index%@column_max*64
      y=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.draw_text(x,y+48,64,32,actor.name)
      self.contents.draw_text(x,y+32,64,32,"Lv"+sprintf("%03d",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
      @windows = []
      @temp = @mercenaries.dup
    end
    def main
      main_start
      Graphics.transition
      main_loop
      Graphics.freeze
      main_end
    end
    def main_start
      @window_shopcommand = Window_ShopCommand.new #最上面的窗口
      @window_help = Window_Help.new               #帮助窗口
      @window_mercenaries = Window_Mercenaries.new(@mercenaries)#下面的窗口
      @window_mercenaries.active = false
      @window_mercenaries.index = -1

      @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
      @spriteset = Spriteset_Map.new
    end
    def main_loop
      while $scene == self
        rm_update
        update_window
        input_update
     end
    end
    def main_end
      @windows.each{ |window|window.dispose }
      @spriteset.dispose
    end
    def rm_update
      Graphics.update
      Input.update
    end
    def update_window
      @windows.each{ |window|window.update }
      update_help
    end
    def update_help
      if @window_mercenaries.active
        @window_help.visible=true
        cw=@window_mercenaries.index%@window_mercenaries.column_max*64
        ch=@window_mercenaries.index/@window_mercenaries.column_max*80
        @window_help.x=cw+@window_mercenaries.x+64
        @window_help.y=ch+@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.draw_actor($game_actors[@window_mercenaries.id])
      else
        @window_help.visible=false
      end
    end
    def input_update
      if Input.trigger?(Input::B)
        @window_shopcommand.active=true
        @window_mercenaries.active=true
        @window_mercenaries.index=-1
      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
            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_Menu.new
          end
        end#@window_shopcommand.active
        case @type
        when 0
          if $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 !=1#$game_party.actors != 1
            $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#case @type
        @window_gold.refresh
      end#Input::C
    end#input_update
  end#场景类

end

class Game_Actor
  def price
    [email protected](/,/)[1].nil? ? 0 : @name.split(/,/)[1]
    return price*self.level
  end
  def name
    [email protected](/,/)[0]
  end
end
在地图上建一事件,用脚本:
a=[2,3,4,5,6,7,8]
$scene=\
Mercenaries::\
Scene_Mercenaries.new(a)
注释掉if @window_mercenaries.index>@window_mercenaries.mercenaries.size-1的3行代码
把数据库的系统中的初期同伴改成1号角色,然后雇佣2号角色,然后解雇2号角色,出现错误,为什么?为什么 更改光标位置就不会错误?

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
380 小时
注册时间
2012-11-8
帖子
272
2
发表于 2023-10-26 15:46:42 | 只看该作者
问题在于下一次循环的update_help,由于没调整@window_mercenaries.index,这时候是越界的。
  1. def update_help
  2.       if @window_mercenaries.active
  3.         @window_help.visible=true
  4.         cw=@window_mercenaries.index%@window_mercenaries.column_max*64
  5.         ch=@window_mercenaries.index/@window_mercenaries.column_max*80
  6.         @window_help.x=cw+@window_mercenaries.x+64
  7.         @window_help.y=ch+@window_mercenaries.y+80
  8.         if @window_help.x+@window_help.width>640
  9.           @window_help.x=640-@window_help.width
  10.         end
  11.         if @window_help.y+@window_help.height>480
  12.           @window_help.y=480-@window_help.height
  13.         end
  14.         @window_help.draw_actor($game_actors[@window_mercenaries.id])#@window_mercenaries.id返回的是@mercenaries[self.index],越界,返回nil,$game_actors[nil]当然会出错
  15.       else
  16.         @window_help.visible=false
  17.       end
  18.     end
复制代码

点评

真谢谢你了  发表于 2023-10-27 20:54
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3925
在线时间
254 小时
注册时间
2013-10-13
帖子
790
3
 楼主| 发表于 2023-10-30 20:39:44 | 只看该作者
      if Input.trigger?(Input::C)
        if @window_shopcommand.active
          case @window_shopcommand.index
          when 0#解雇转入雇佣时的窗口
p  @window_mercenaries.id
            @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
            end
p  @window_mercenaries.id
            @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
注意在数据库留ID为1的角色。我在@window_mercenaries.set_mercenaries(参数)上面1行P  @window_mercenaries.id,为什么返回的是角色ID的最大值,例如,设定[2,3,4,5,6],就会返回6,不知道为什么?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3925
在线时间
254 小时
注册时间
2013-10-13
帖子
790
4
 楼主| 发表于 2023-11-2 21:03:40 | 只看该作者
   if Input.trigger?(Input::C)
         if @window_shopcommand.active
           case @window_shopcommand.index
           when 0#解雇转入雇佣时的窗口
p  @window_mercenaries.id
             @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
             end
p  @window_mercenaries.id
             @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在地图上建一事件,用脚本:
a=[2,3,4,5,6,7,8]
$scene=\
Mercenaries::\
Scene_Mercenaries.new(a)

注意在数据库留ID为1的角色。我在@window_mercenaries.set_mercenaries(参数)上面1行P  @window_mercenaries.id,为什么返回的是角色ID的最大值,例如,设定[2,3,4,5,6],就会返回6,不知道为什么?
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5680
在线时间
782 小时
注册时间
2019-1-20
帖子
191
5
发表于 2023-11-3 22:55:37 | 只看该作者
别光顾着看不变的结果
逆推着看啊
结果是6
@mercenaries 是[2,3,4,5,6]
@window_mercenaries.id返回的是@mercenaries[self.index]
self.index要么是4要么是-1
到底是哪一个其实你自己1楼都把答案贴出来了OTL
好好想想吧。

提高解答机会的方法:
看一下对应版本的帮助文件 看天气预报说今天不下雨
改变问题为更有可能的或常见的 如:天气自动变化下雨→天气系统 果然不准呀~
使用论坛的搜索功能查找相关问题 好丧啊... ...想看女装
清楚说明实际上你想解决的问题  想看坛友的女装  
脚本自己有改过的地方要标明  不要遮脸的
脚本有问题但不是默认的要全部贴出来 大胆点,尽情发
三包原则:包有BUG,包甩锅,包咕咕
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-30 12:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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