查看: 79|回复: 0

[转载发布] 【要素收集】礼物盒功能

[复制链接]
  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月五日(秋) | 显示全部楼层 |阅读模式
    是LZ一个游戏制作途中用到的小功能。

    具体是这样的的,NPC会送给玩家一些纪念性的小礼物,放在道具栏里和其他道具混在一起不方便,就做了个礼物盒的功能。放在玩家的房间里,玩家可以在那里查看收集到的小礼物。

    Window_gift里预留了物品ID50~100为礼物
    Window_Item里设置物品ID1~49、101以上为普通道具(具体请看注释)
    可以按照需要自行更改

    主角的道具栏顿时清净了有木有!{:2_268:}


    使用方法:

    将下面三个脚本依次插入Main上
    在事件中调用脚本:$scene=Scene_Gift_Box.new 呼出礼物盒界面即可
    默认是物品ID在50~100的物品为礼物,不会出现在玩家的道具列表里,只出现在礼物盒里。


    效果预览:

    事件:

    物品设置:


    RUBY 代码
    1. #==============================================================================
    2. # ■ Window_Item
    3. #------------------------------------------------------------------------------
    4. #  物品画面、战斗画面、显示浏览物品的窗口。
    5. #==============================================================================
    6. class Window_Item < Window_Selectable
    7.   #--------------------------------------------------------------------------
    8.   # ● 初始化对像
    9.   #--------------------------------------------------------------------------
    10.   def initialize
    11.     super(0, 64, 640, 416)
    12.     @column_max = 2
    13.     refresh
    14.     self.index = 0
    15.     # 战斗中的情况下将窗口移至中央并将其半透明化
    16.     if$game_temp.in_battle
    17.       self.y = 64
    18.       self.height = 256
    19.       self.back_opacity = 160
    20.     end
    21.   end
    22.   #--------------------------------------------------------------------------
    23.   # ● 获取物品
    24.   #--------------------------------------------------------------------------
    25.   def item
    26.     return@data[self.index]
    27.   end
    28.   #--------------------------------------------------------------------------
    29.   # ● 刷新
    30.   #--------------------------------------------------------------------------
    31.   def refresh
    32.     ifself.contents != nil
    33.       self.contents.dispose
    34.       self.contents = nil
    35.     end
    36.     @data = []
    37.     # 添加物品
    38.     for i in1...49#ID1~49为普通道具
    39.       if$game_party.item_number(i) > 0
    40.         @data.push($data_items[i])
    41.       end
    42.     end
    43.     for i in101...$data_items.size#ID101以上为普通道具
    44.       if$game_party.item_number(i) > 0
    45.         @data.push($data_items[i])
    46.       end
    47.     end
    48.     # 在战斗中以外添加武器、防具
    49.     unless$game_temp.in_battle
    50.       for i in1...$data_weapons.size
    51.         if$game_party.weapon_number(i) > 0
    52.           @data.push($data_weapons[i])
    53.         end
    54.       end
    55.       for i in1...$data_armors.size
    56.         if$game_party.armor_number(i) > 0
    57.           @data.push($data_armors[i])
    58.         end
    59.       end
    60.     end
    61.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
    62.     @item_max = @data.size
    63.     if@item_max > 0
    64.       self.contents = Bitmap.new(width - 32, row_max * 32)
    65.       for i in0...@item_max
    66.         draw_item(i)
    67.       end
    68.     end
    69.   end
    70.   #--------------------------------------------------------------------------
    71.   # ● 描绘项目
    72.   #     index : 项目编号
    73.   #--------------------------------------------------------------------------
    74.   def draw_item(index)
    75.     item = @data[index]
    76.     case item
    77.     whenRPG::Item
    78.       number = $game_party.item_number(item.id)
    79.     whenRPG::Weapon
    80.       number = $game_party.weapon_number(item.id)
    81.     whenRPG::Armor
    82.       number = $game_party.armor_number(item.id)
    83.     end
    84.     if item.is_a?(RPG::Item)and
    85.        $game_party.item_can_use?(item.id)
    86.       self.contents.font.color = normal_color
    87.     else
    88.       self.contents.font.color = disabled_color
    89.     end
    90.     x = 4 + index % 2 * (288 + 32)
    91.     y = index / 2 * 32
    92.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    93.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    94.     bitmap = RPG::Cache.icon(item.icon_name)
    95.     opacity = self.contents.font.color == normal_color ? 255 : 128
    96.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    97.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    98.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    99.     self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
    100.   end
    101.   #--------------------------------------------------------------------------
    102.   # ● 刷新帮助文本
    103.   #--------------------------------------------------------------------------
    104.   def update_help
    105.     @help_window.set_text(self.item == nil ? "" : self.item.description)
    106.   end
    107. end
    复制代码


    RUBY 代码
    1. #==============================================================================
    2. # ■ Window_gift
    3. #------------------------------------------------------------------------------
    4. #  物品画面、战斗画面、显示浏览物品的窗口。
    5. #==============================================================================
    6. class Window_gift < Window_Selectable
    7.   #--------------------------------------------------------------------------
    8.   # ● 初始化对像
    9.   #--------------------------------------------------------------------------
    10.   def initialize
    11.     super(0, 200, 640, 416)
    12.     @column_max = 2
    13.     refresh
    14.     self.index = 0
    15.       self.y = 64
    16.       self.height = 200
    17.       self.back_opacity = 160
    18.     # 战斗中的情况下将窗口移至中央并将其半透明化
    19.     if$game_temp.in_battle
    20.       self.y = 64
    21.       self.height = 256
    22.       self.back_opacity = 160
    23.     end  
    24.   end
    25.   #--------------------------------------------------------------------------
    26.   # ● 获取物品
    27.   #--------------------------------------------------------------------------
    28.   def item
    29.     return@data[self.index]
    30.   end
    31.   #--------------------------------------------------------------------------
    32.   # ● 刷新
    33.   #--------------------------------------------------------------------------
    34.   def refresh
    35.     ifself.contents != nil
    36.       self.contents.dispose
    37.       self.contents = nil
    38.     end
    39.     @data = []
    40.     for i in50...100# 添加礼物——预留物品ID50~ID100的物品为“礼物”,可自行修改
    41.       if$game_party.item_number(i) > 0
    42.         @data.push($data_items[i])
    43.       end
    44.     end
    45.     # 如果项目数不是 0 就生成位图、重新描绘全部项目
    46.     @item_max = @data.size
    47.     if@item_max > 0
    48.       self.contents = Bitmap.new(width - 32, row_max * 32)
    49.       for i in0...@item_max
    50.         draw_item(i)
    51.       end
    52.     end
    53.   end
    54.   #--------------------------------------------------------------------------
    55.   # ● 描绘项目
    56.   #     index : 项目编号
    57.   #--------------------------------------------------------------------------
    58.   def draw_item(index)
    59.     item = @data[index]
    60.     case item
    61.     whenRPG::Item
    62.       number = $game_party.item_number(item.id)
    63.     whenRPG::Weapon
    64.       number = $game_party.weapon_number(item.id)
    65.     whenRPG::Armor
    66.       number = $game_party.armor_number(item.id)
    67.     end
    68.     if item.is_a?(RPG::Item)and
    69.        $game_party.item_can_use?(item.id)
    70.       self.contents.font.color = normal_color
    71.       else
    72.       self.contents.font.color = disabled_color
    73.     end
    74.     x = 4 + index % 2 * (288 + 32)
    75.     y = index / 2 * 32
    76.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    77.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    78.     bitmap = RPG::Cache.icon(item.icon_name)
    79.     opacity = self.contents.font.color == normal_color ? 255 : 128
    80.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    81.     self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    82.     self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    83.     self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
    84.   end
    85.   #--------------------------------------------------------------------------
    86.   # ● 刷新帮助文本
    87.   #--------------------------------------------------------------------------
    88.   def update_help
    89.     @help_window.set_text(self.item == nil ? "" : self.item.description)
    90.   end
    91. end
    复制代码


    RUBY 代码
    1. #==============================================================================
    2. # ■ Scene_Gift_Box
    3. #------------------------------------------------------------------------------
    4. #  处理礼物(不可使用)画面的类。
    5. #==============================================================================
    6. class Scene_Gift_Box
    7.   #--------------------------------------------------------------------------
    8.   # ● 主处理
    9.   #--------------------------------------------------------------------------
    10.   def main
    11.     @sprite =Spriteset_Map.new
    12.     # 生成帮助窗口、物品窗口
    13.     @help_window = Window_Help.new
    14.     @item_window = Window_gift.new
    15.     # 关联帮助窗口
    16.     @item_window.help_window = @help_window
    17.     # 生成目标窗口 (设置为不可见・不活动)
    18.     @target_window = Window_Target.new
    19.     @target_window.visible = false
    20.     @target_window.active = false
    21.     # 执行过度
    22.     Graphics.transition
    23.     # 主循环
    24.     loopdo
    25.       # 刷新游戏画面
    26.       Graphics.update
    27.       # 刷新输入信息
    28.       Input.update
    29.       # 刷新画面
    30.       update
    31.       # 如果画面切换就中断循环
    32.       if$scene != self
    33.         break
    34.       end
    35.     end
    36.     # 装备过渡
    37.     Graphics.freeze
    38.     # 释放窗口
    39.     @sprite.dispose
    40.     @help_window.dispose
    41.     @item_window.dispose
    42.     @target_window.dispose
    43.   end
    44.   #--------------------------------------------------------------------------
    45.   # ● 刷新画面
    46.   #--------------------------------------------------------------------------
    47.   def update
    48.     # 刷新窗口
    49.     @help_window.update
    50.     @item_window.update
    51.     @target_window.update
    52.     # 物品窗口被激活的情况下: 调用 update_item
    53.     if@item_window.active
    54.       update_item
    55.       return
    56.     end
    57.     # 目标窗口被激活的情况下: 调用 update_target
    58.     if@target_window.active
    59.       update_target
    60.       return
    61.     end
    62.   end
    63.   #--------------------------------------------------------------------------
    64.   # ● 刷新画面 (物品窗口被激活的情况下)
    65.   #--------------------------------------------------------------------------
    66.   def update_item
    67.     # 按下 B 键的情况下
    68.     if Input.trigger?(Input::B)
    69.       # 演奏取消 SE
    70.       $game_system.se_play($data_system.cancel_se)
    71.       # 切换到菜单画面
    72.       $scene = Scene_Map.new
    73.       return
    74.     end
    75.   end
    76.   #--------------------------------------------------------------------------
    77.   # ● 刷新画面 (目标窗口被激活的情况下)
    78.   #--------------------------------------------------------------------------
    79.   def update_target
    80.     # 按下 B 键的情况下
    81.     if Input.trigger?(Input::B)
    82.       # 演奏取消 SE
    83.       $game_system.se_play($data_system.cancel_se)
    84.       # 切换到菜单画面
    85.       $scene = Scene_Map.new
    86.       return
    87.     end
    88.   end
    89. end
    复制代码




                 本帖来自P1论坛作者小徐,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=344849  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

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

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-10 13:21 , Processed in 0.067849 second(s), 44 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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