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

Project1

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

[已经解决] 跪求物品仓库脚本!!

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-6-22
帖子
26
跳转到指定楼层
1
发表于 2010-8-2 15:21:48 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
我用了别人的仓库脚本
#==============================================================================
# 本脚本来自www.66rpg.com,转载和使用请保留此信息
# 脚本名:真实商店,脚本作者:柳柳
#==============================================================================
#
# 功能:
#
# 买进卖出的物品在商店有所体现,卖出后会在商店可买物品中出现,物品有数量限制
# 商店可进货出货————总之就是模拟真实商店。
#  
# 这个脚本和原装商店并不冲突,两个商店可以并存。
#
# 使用方法:
#
# 1、在下面被井号框起来的中间部分,设置初期物品。格式如下:
#    @goods[商店编号] = [ [种类,ID,可卖数量] ,  [种类,ID,可卖数量]......]
#    其中种类,0为道具,1为武器,2为防具;ID是数据库编号
#
# 2、调用:$scene = Scene_Shop_Va.new(商店编号)  
#    比如你可以直接测试$scene = Scene_Shop_Va.new(1),已经设置好了。
#
# 3、商店出货:$game_system.shop_change(商店编号,种类,ID,数量)
#    如果是进货,把数量设置为负数即可
#
class WWWindow_ShopCommand < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, 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 W2Window_ShopCommand < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, 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 Game_System
  attr_accessor :goods   
  alias vaule_shop_66RPG_initialize initialize
  def initialize
    vaule_shop_66RPG_initialize
    @goods = []
  ###########################################################################
    # 初期的时候的商店物品,编号顺序:种类,ID,可卖数量
    @goods[0] = [[-1,-1,-1]]
    @goods[1] = [[0,1,30],[0,2,30],[1,1,10],[1,2,10],[1,3,10]]
  ###########################################################################
  end
  def shop_change(shop,kind,id,delnumber)
    dl = delnumber
    for dt in $game_system.goods[shop]
      if (dt[0]==kind) and (dt[1]==id)
        dt[2] -= dl
        dt[2] = [dt[2],99].min
        if dt[2] == 0
          $game_system.goods[shop].delete(dt)
        end
        return
      end
    end
    $game_system.goods[shop].push([kind,id,-delnumber])
  end
end

class Scene_Shop_Va
  def initialize(shop_number)
    # 当前商店编号
    @shop_now = shop_number
    # 0号商店为物品仓库
    $itembankflag = @shop_now > 0 ? 0 : 1
  end   
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成帮助窗口
    @help_window = Window_Help.new
    # 生成指令窗口
    if $itembankflag == 0 #是不是物品仓库?
      @command_window = WWWindow_ShopCommand.new
    else
      @command_window = W2Window_ShopCommand.new
    end  
    # 生成金钱窗口
    @gold_window = Window_Gold.new
    @gold_window.x = 480
    @gold_window.y = 64
    # 生成时间窗口
    @dummy_window = Window_Base.new(0, 128, 640, 352)
    # 生成购买窗口
    @buy_window = Window_ShopBuy_Va.new($game_system.goods[@shop_now])
    @buy_window.active = false
    @buy_window.visible = false
    @buy_window.help_window = @help_window
    # 生成卖出窗口
    @sell_window = Window_ShopSell.new
    @sell_window.active = false
    @sell_window.visible = false
    @sell_window.help_window = @help_window
    # 生成数量输入窗口
    @number_window = Window_ShopNumber.new
    @number_window.active = false
    @number_window.visible = false
    # 生成状态窗口
    @status_window = Window_ShopStatus.new
    @status_window.visible = false
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @help_window.dispose
    @command_window.dispose
    @gold_window.dispose
    @dummy_window.dispose
    @buy_window.dispose
    @sell_window.dispose
    @number_window.dispose
    @status_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @help_window.update
    @command_window.update
    @gold_window.update
    @dummy_window.update
    @buy_window.update
    @sell_window.update
    @number_window.update
    @status_window.update
    # 指令窗口激活的情况下: 调用 update_command
    if @command_window.active
      update_command
      return
    end
    # 购买窗口激活的情况下: 调用 update_buy
    if @buy_window.active
      update_buy
      return
    end
    # 卖出窗口激活的情况下: 调用 update_sell
    if @sell_window.active
      update_sell
      return
    end
    # 个数输入窗口激活的情况下: 调用 update_number
    if @number_window.active
      update_number
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (指令窗口激活的情况下)
  #--------------------------------------------------------------------------
  def update_command
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换到地图画面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 命令窗口光标位置分支
      case @command_window.index
      when 0  # 购买
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 窗口状态转向购买模式
        @command_window.active = false
        @dummy_window.visible = false
        @buy_window.active = true
        @buy_window.visible = true
        @buy_window.refresh
        @status_window.visible = true
      when 1  # 卖出
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 窗口状态转向卖出模式
        @command_window.active = false
        @dummy_window.visible = false
        @sell_window.active = true
        @sell_window.visible = true
        @sell_window.refresh
      when 2  # 取消
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到地图画面
        $scene = Scene_Map.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (购买窗口激活的情况下)
  #--------------------------------------------------------------------------
  def update_buy
    # 设置状态窗口的物品
    @status_window.item = @buy_window.item
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 窗口状态转向初期模式
      @command_window.active = true
      @dummy_window.visible = true
      @buy_window.active = false
      @buy_window.visible = false
      @status_window.visible = false
      @status_window.item = nil
      # 删除帮助文本
      @help_window.set_text("")
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取物品
      @item = @buy_window.item
      
# 如果是物品仓库就不对金钱做出处理=============================================      
      ppprice = $itembankflag == 0 ? @item.price : 0
      # 物品无效的情况下、或者价格在所持金以上的情况下
      if @item == nil or ppprice > $game_party.gold
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 获取物品所持数
      case @item
      when RPG::Item
        number = $game_party.item_number(@item.id)
      when RPG::Weapon
        number = $game_party.weapon_number(@item.id)
      when RPG::Armor
        number = $game_party.armor_number(@item.id)
      end
      # 如果已经拥有了 99 个情况下
      if number == 99
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 计算可以最多购买的数量
      max = ppprice == 0 ? 99 : $game_party.gold / @item.price
# =============================================================================      
      
      max = [[max, 99 - number].min,@buy_window.item_number].min
      # 窗口状态转向数值输入模式
      @buy_window.active = false
      @buy_window.visible = false
      @number_window.set(@item, max, ppprice)
      @number_window.active = true
      @number_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # ● 画面更新 (卖出窗口激活的情况下)
  #--------------------------------------------------------------------------
  def update_sell
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 窗口状态转向初期模式
      @command_window.active = true
      @dummy_window.visible = true
      @sell_window.active = false
      @sell_window.visible = false
      @status_window.item = nil
      # 删除帮助文本
      @help_window.set_text("")
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取物品
      @item = @sell_window.item
      # 设置状态窗口的物品
      @status_window.item = @item
      # 物品无效的情况下、或者价格为 0 (不能卖出) 的情况下
      if @item == nil or @item.price == 0
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 获取物品的所持数
      case @item
      when RPG::Item
        number = $game_party.item_number(@item.id)
      when RPG::Weapon
        number = $game_party.weapon_number(@item.id)
      when RPG::Armor
        number = $game_party.armor_number(@item.id)
      end
      # 最大卖出个数 = 物品的所持数
      max = number
      # 窗口状态转向个数输入模式
      @sell_window.active = false
      @sell_window.visible = false
      @number_window.set(@item, max, @item.price)
      @number_window.active = true
      @number_window.visible = true
      @status_window.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (个数输入窗口激活的情况下)
  #--------------------------------------------------------------------------
  def update_number
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 设置个数输入窗口为不活动·非可视状态
      @number_window.active = false
      @number_window.visible = false
      # 命令窗口光标位置分支
      case @command_window.index
      when 0  # 购买
        # 窗口状态转向购买模式
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # 卖出
        # 窗口状态转向卖出模式
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 演奏商店 SE
      $game_system.se_play($data_system.shop_se)
      # 设置个数输入窗口为不活动·非可视状态
      @number_window.active = false
      @number_window.visible = false
      # 命令窗口光标位置分支
      case @command_window.index
      when 0  # 购买
        # 购买处理
        temp = 0
        if $超重不能买 > 0
          @number_window.active = true
          @number_window.visible = true
          return
        end  
# 如果是物品仓库就不对金钱做出处理=============================================        
        if $itembankflag == 0
          $game_party.lose_gold(@number_window.number * @item.price)
        end  
# =============================================================================        
        
        case @item
        when RPG::Item
          $game_party.gain_item(@item.id, @number_window.number)
        when RPG::Weapon
          $game_party.gain_weapon(@item.id, @number_window.number)
          temp = 1
        when RPG::Armor
          $game_party.gain_armor(@item.id, @number_window.number)
          temp = 2
        end
        goods_del(temp,@item.id,@number_window.number)
        # 刷新各窗口
        @buy_window = Window_ShopBuy_Va.new($game_system.goods[@shop_now])
        @gold_window.refresh
        @buy_window.refresh
        @status_window.refresh
        # 窗口状态转向购买模式
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # 卖出
        # 卖出处理
        
# 如果是物品仓库就不对金钱做出处理=============================================        
        if $itembankflag == 0
          $game_party.gain_gold(@number_window.number * @item.price)
        end  
# =============================================================================        
        
        temp = 0
        case @item
        when RPG::Item
          $game_party.lose_item(@item.id, @number_window.number)
        when RPG::Weapon
          $game_party.lose_weapon(@item.id, @number_window.number)
          temp = 1
        when RPG::Armor
          $game_party.lose_armor(@item.id, @number_window.number)
          temp = 2
        end
        # 刷新各窗口
        goods_del(temp,@item.id,-@number_window.number)
        @buy_window = Window_ShopBuy_Va.new($game_system.goods[@shop_now])
        @buy_window.active = false
        @buy_window.visible = false
        @buy_window.help_window = @help_window
        @gold_window.refresh
        @sell_window.refresh
        @status_window.refresh
        # 窗口状态转向卖出模式
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
      return
    end
  end
  # 删除可出售商品内容
  def goods_del(kind,id,delnumber)
    dl = delnumber
    for dt in $game_system.goods[@shop_now]
      if (dt[0]==kind) and (dt[1]==id)
        dt[2] -= dl
        dt[2] = [dt[2],99].min
        if dt[2] == 0
          $game_system.goods[@shop_now].delete(dt)
        end
        return
      end
    end
    $game_system.goods[@shop_now].push([kind,id,-delnumber])
  end
end

#==============================================================================
# ■ Window_ShopBuy_Va
#------------------------------------------------------------------------------
#  商店画面、浏览显示可以购买的商品的窗口。
#==============================================================================

class Window_ShopBuy_Va < Window_Selectable
  attr_accessor :shop_goods
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     shop_goods : 商品
  #--------------------------------------------------------------------------
  def initialize(shop_goods)
    super(0, 128, 368, 352)
    @shop_goods = shop_goods
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 获取物品
  #--------------------------------------------------------------------------
  def item
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● 获取物品
  #--------------------------------------------------------------------------
  def item_number
    return @data_number[self.index]
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    @data_number = []
    for goods_item in @shop_goods
      case goods_item[0]
      when 0
        item = $data_items[goods_item[1]]
      when 1
        item = $data_weapons[goods_item[1]]
      when 2
        item = $data_armors[goods_item[1]]
      end
      if (item != nil) and (goods_item[2] != 0)
        @data.push(item)
        @data_number.push(goods_item[2])
      else
        @data.delete(item)
      end
    end
    # 如果项目数不是 0 就生成位图、描绘全部项目
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 描绘羡慕
  #     index : 项目编号
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    # 获取物品所持数
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    # 价格在所持金以下、并且所持数不是 99 的情况下为普通文字颜色
    # 除此之外的情况设置为无效文字色
    if item.price <= $game_party.gold and number < 99
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4
    y = index * 32
    rect = Rect.new(x, y, self.width - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 88, 32, "剩  ", 2)
    self.contents.draw_text(x + 240, y, 88, 32, @data_number[index].to_s, 2)
    if $itembankflag == 0  
      self.contents.draw_text(x + 180, y, 88, 32, item.price.to_s, 2)
    end  
  end
  #--------------------------------------------------------------------------
  # ● 刷新帮助文本
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.description)
  end
end

说142行发生了NomethodError
Undifinedmethod for nil:nilclass
什么意思?
求解决方法,要不给我一个新的脚本。

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
9
发表于 2010-8-3 17:08:22 | 只看该作者
用事件就能弄啊!
把物品的ID带入变量中
然后失去这个物品。    <=存入


取出=>得到物品,物品的ID为变量

评分

参与人数 1星屑 +240 收起 理由
「旅」 + 240 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-6-22
帖子
26
8
 楼主| 发表于 2010-8-3 12:36:18 | 只看该作者
回复 凝馨の恋 的帖子

额,怎么又说59行出错!?我不活了
   

点评

也就是同时使用了多个不是默认的脚本~~  发表于 2010-8-8 17:13
可能是因为其他附加脚本的影响导致的~~这就是所谓的脚本冲突~~只能想办法兼容或是放弃其中的一种~  发表于 2010-8-8 17:12
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-6-22
帖子
26
7
 楼主| 发表于 2010-8-2 21:55:08 | 只看该作者
回复 凝馨の恋 的帖子

谢啦
   
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-8-2
帖子
48
6
发表于 2010-8-2 17:00:22 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-6-22
帖子
26
5
 楼主| 发表于 2010-8-2 16:04:53 | 只看该作者
回复 凝馨の恋 的帖子
我只要物品仓库= =!

   
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-8-2
帖子
48
4
发表于 2010-8-2 16:01:43 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2010-6-22
帖子
26
3
 楼主| 发表于 2010-8-2 15:57:04 | 只看该作者
回复 凝馨の恋 的帖子
汗!!!我说的就是这种!

   
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-8-2
帖子
48
2
发表于 2010-8-2 15:31:55 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-29 04:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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