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

Project1

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

[有事请教] 【已解决】可以捡起舍弃物品的事件。

[复制链接]

Lv2.观梦者

梦石
0
星屑
630
在线时间
32 小时
注册时间
2012-1-13
帖子
18
跳转到指定楼层
1
发表于 2023-8-25 01:42:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 flashfox 于 2023-9-10 23:11 编辑

我试图通过脚本来实现游戏内添加地图事件,实现可以捡回丢弃在地上的物品。但是,在游戏里不显示这个事件。求大神指教,存在什么问题。
代码如下:
# 生成事件对象实例
    @drop_event = RPG::Event.new(0, 0)
    @drop_event.pages.push(RPG::Event::Page.new)
    @drop_event.pages[0].graphic.character_name = "Graphics/Characters/剧情使用-2.png"
    @drop_event.pages[0].walk_anime = false
    @drop_event.pages[0].step_anime = true
    @drop_event.pages[0].through = true
    @drop_event.pages[0].list.push(RPG::EventCommand.new(101, 0, [""]))
    @drop_event.pages[0].list.push(RPG::EventCommand.new(101, 0, [""]))
    @drop_event.pages[0].list.push(RPG::EventCommand.new(250, 0, ['GainItem', 100, 100]))
    @drop_event.pages[0].list.push(RPG::EventCommand.new(126, 0, [1, 0, 0, 1]))
    @drop_event.pages[0].list.push(RPG::EventCommand.new(101, 0, [""]))
    @drop_event.pages[0].list.push(RPG::EventCommand.new(123, "A", 0))
    @drop_event.pages.push(RPG::Event::Page.new)
    @drop_event.pages[1].trigger = 4
    @drop_event.pages[1].condition.self_switch_valid = true

# 修改事件对象实例及其子对象实例的参数(@item是一个MRXP原生脚本定义的物品\武器\护具对象)
        @drop_event.x = $game_player.x
        @drop_event.y = $game_player.y
        @drop_event.pages[0].list[0].parameters[2] = "仔细寻找……"
        @drop_event.pages[0].list[1].parameters[2] = "发现了" + @item.name + ""
        case @item
        when RPG::Item
                code = 126
        when RPG::Weapon
                code = 127
        when RPG::Armor
                code = 128
        end
        @drop_event.pages[0].list[3].code = code
        @drop_event.pages[0].list[3].parameters[0] = @item.id
        @drop_event.pages[0].list[4].parameters[2] = "\i[" + @item.name + "]*1*"

# 生成地图事件
        # 如果之前生成过事件实例,移除旧实例数据,以实现只能捡起最后一个舍弃的物品。

        if $game_variables[22] >0 and $game_variables[23] != nil
                drop_map = Game_Map.new
                drop_map.setup($game_variables[22])
                drop_map.events.delete($game_variables[23])
        end

# 当前地图的ID,存储在variables[22]中,用于处理已有的事件实例
        $game_variables[22] = $game_map.map_id
# 升序测试,获得最小的未被添加到地图事件Hash表中的Key值
        k = 1
        while $game_map.events.include?(k)
                k += 1
        end

# 修订事件实例的ID,并存储在variables[23]中,用于处理已有的事件实例
        $game_variables[23] = @drop_event.id = k
# 将新的事件实例添加到当前地图的事件Hash表中
        $game_map.events[k] = Game_Event.new($game_map.map_id, @drop_event)
# 刷新当前地图
        $game_map.refresh

Lv2.观梦者

梦石
0
星屑
630
在线时间
32 小时
注册时间
2012-1-13
帖子
18
2
 楼主| 发表于 2023-8-25 07:58:19 | 只看该作者
跪求大佬临幸啊。要疯掉了。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37814
在线时间
5410 小时
注册时间
2006-11-10
帖子
6547
3
发表于 2023-8-25 09:30:07 | 只看该作者
不显示的原因: 没有去Spriteset_Map登记, 笑
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
630
在线时间
32 小时
注册时间
2012-1-13
帖子
18
4
 楼主| 发表于 2023-8-25 09:49:29 | 只看该作者
灯笼菜刀王 发表于 2023-8-25 09:30
不显示的原因: 没有去Spriteset_Map登记, 笑

哦。酱紫啊。康康起。栓扣。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
630
在线时间
32 小时
注册时间
2012-1-13
帖子
18
5
 楼主| 发表于 2023-8-26 03:03:31 | 只看该作者
本帖最后由 flashfox 于 2023-8-26 14:34 编辑
灯笼菜刀王 发表于 2023-8-25 09:30
不显示的原因: 没有去Spriteset_Map登记, 笑


显示的问题解决了,因为是向地图数据中添加的事件数据,所以,不需要额外的在Spriteset_Map中登记。地图重新加载的时候,会自动登记。

感谢指点。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
630
在线时间
32 小时
注册时间
2012-1-13
帖子
18
6
 楼主| 发表于 2023-8-26 03:29:55 | 只看该作者
本帖最后由 flashfox 于 2023-8-26 23:50 编辑

问题解决了。出在数据错误上。下面在代码中标记出来。后边给出正确代码。
# 生成事件对象实例
    @drop_event = RPG::Event.new(0, 0)     #创建事件实例时,系统默认会new一个RPG::Event::Page实例在pages属性中。
    @drop_event.pages.push(RPG::Event::Page.new)      #因此,这里不需要new新的RPG::Event::Page实例。也就是说需要删掉这行。
    @drop_event.pages[0].graphic.character_name = "Graphics/Characters/剧情使用-2.png"      #这里的参数错误,只需要给出文件名即可,不需要路径。即删除Graphics/Characters/
    @drop_event.pages[0].walk_anime = false
    @drop_event.pages[0].step_anime = true
    @drop_event.pages[0].through = true
    @drop_event.pages[0].list.push(RPG::EventCommand.new(101, 0, [""]))  
    #这里同样因为默认newRPG::Event::Page实例时,会new一个RPG::EventCommand实例在list属性中。因此,不需要push一个新的项进数组,直接给list[0]赋值即可。
    @drop_event.pages[0].list.push(RPG::EventCommand.new(101, 0, [""]))
    @drop_event.pages[0].list.push(RPG::EventCommand.new(250, 0, ['GainItem', 100, 100]))    #这里的参数错误,需要new一个RPG::AudioFile对象来传递参数。
    @drop_event.pages[0].list.push(RPG::EventCommand.new(126, 0, [1, 0, 0, 1]))
    @drop_event.pages[0].list.push(RPG::EventCommand.new(101, 0, [""]))
    @drop_event.pages[0].list.push(RPG::EventCommand.new(123, "A", 0))
    @drop_event.pages.push(RPG::Event::Page.new)
    @drop_event.pages[1].trigger = 4
    @drop_event.pages[1].condition.self_switch_valid = true
# 修改事件对象实例及其子对象实例的参数(@item是一个MRXP原生脚本定义的物品\武器\护具对象)
        @drop_event.x = $game_player.x
        @drop_event.y = $game_player.y
        @drop_event.pages[0].list[0].parameters[2] = "仔细寻找……"
        @drop_event.pages[0].list[1].parameters[2] = "发现了" + @item.name + ""
        case @item
        when RPG::Item
                code = 126
        when RPG::Weapon
                code = 127
        when RPG::Armor
                code = 128
        end
        @drop_event.pages[0].list[3].code = code
        @drop_event.pages[0].list[3].parameters[0] = @item.id
        @drop_event.pages[0].list[4].parameters[2] = "\i[" + @item.name + "]*1*"

# 生成地图事件
        # 如果之前生成过事件实例,移除旧实例数据,以实现只能捡起最后一个舍弃的物品。   这部分有问题,暂时取消了。

        if $game_variables[22] >0 and $game_variables[23] != nil
                drop_map = Game_Map.new
                drop_map.setup($game_variables[22])
                drop_map.events.delete($game_variables[23])
        end

# 当前地图的ID,存储在variables[22]中,用于处理已有的事件实例   这部分有问题,暂时取消了。
        $game_variables[22] = $game_map.map_id
# 升序测试,获得最小的未被添加到地图事件Hash表中的Key值
        k = 1
        while $game_map.events.include?(k)
                k += 1
        end

# 修订事件实例的ID,并存储在variables[23]中,用于处理已有的事件实例   这部分有问题,暂时取消了。
        $game_variables[23] = @drop_event.id = k
# 将新的事件实例添加到当前地图的事件Hash表中
        $game_map.events[k] = Game_Event.new($game_map.map_id, @drop_event)
# 刷新当前地图        这里不需要刷新地图,重新加载地图的时候会刷新。   
        $game_map.refresh

正确的代码在下边

  1. # 生成事件对象实例
  2.     @drop_event = RPG::Event.new(0, 0)
  3.     @drop_event.pages[0].graphic.character_name = "剧情使用-2.png"       #这里是地面上显示物品位置Character动画。
  4.     @drop_event.pages[0].walk_anime = false
  5.     @drop_event.pages[0].step_anime = true
  6.     @drop_event.pages[0].through = true
  7.     @drop_event.pages[0].list[0] = (RPG::EventCommand.new(101, 0, [""]))
  8.     @drop_event.pages[0].list.push(RPG::EventCommand.new(101, 0, [""]))
  9.     @drop_event.pages[0].list.push(RPG::EventCommand.new(250, 0, [RPG::AudioFile.new('GainItem', 100, 100)]))    #这里是获得物品时的提示音se
  10.     @drop_event.pages[0].list.push(RPG::EventCommand.new(126, 0, [1, 0, 0, 1]))
  11.     @drop_event.pages[0].list.push(RPG::EventCommand.new(101, 0, [""]))
  12.     @drop_event.pages[0].list.push(RPG::EventCommand.new(123, "A", 0))
  13.     @drop_event.pages[0].list.push(RPG::EventCommand.new)
  14.     @drop_event.pages.push(RPG::Event::Page.new)
  15.     @drop_event.pages[1].trigger = 4
  16.     @drop_event.pages[1].condition.self_switch_valid = true
  17. # 修改事件对象实例及其子对象实例的参数(@item是一个MRXP原生脚本定义的物品\武器\护具对象)
  18.         @drop_event.x = $game_player.x
  19.         @drop_event.y = $game_player.y
  20.         @drop_event.pages[0].list[0].parameters[2] = "仔细寻找……"
  21.         @drop_event.pages[0].list[1].parameters[2] = "发现了" + @item.name + "。"
  22.         case @item
  23.         when RPG::Item
  24.                 code = 126
  25.         when RPG::Weapon
  26.                 code = 127
  27.         when RPG::Armor
  28.                 code = 128
  29.         end
  30.         @drop_event.pages[0].list[3].code = code
  31.         @drop_event.pages[0].list[3].parameters[0] = @item.id
  32.         @drop_event.pages[0].list[4].parameters[2] = "获得了" + @item.name + "。"     <font color="SeaGreen">#</font><font color="SeaGreen">这里的提示信息跟我的message处理逻辑有关,改成了通用信息。</font>
  33. # 升序测试,获得最小的未被添加到地图事件Hash表中的Key值
  34.         k = 1
  35.         while $game_map.events.include?(k)
  36.                 k += 1
  37.         end
  38. # 修订事件实例的ID
  39.         @drop_event.id = k
  40. # 将新的事件实例添加到当前地图的事件Hash表中
  41.         $game_map.events[k] = Game_Event.new($game_map.map_id, @drop_event)
复制代码
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
630
在线时间
32 小时
注册时间
2012-1-13
帖子
18
7
 楼主| 发表于 2023-8-26 09:46:31 | 只看该作者
事件可以显示了。也可以实现再次获得物品了。不过还存在问题,就是获取物品后,事件的没有消失。仍然存在。也就是,形成了:扔一个物品,然后就可以无限拾取的bug。研究中……
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
630
在线时间
32 小时
注册时间
2012-1-13
帖子
18
8
 楼主| 发表于 2023-8-26 10:17:26 | 只看该作者
本帖最后由 flashfox 于 2023-8-26 14:33 编辑
flashfox 发表于 2023-8-26 09:46
事件可以显示了。也可以实现再次获得物品了。不过还存在问题,就是获取物品后,事件的没有消失。仍然存在。 ...

消失的问题也解决了。还是数据问题。list中总是要在最末位置保留一个空RPG::EventCommand
因为之前把初始化page时new那个空RPG::EventCommand占用掉了,最后必须再new一个。

代码在6楼更新。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-29 20:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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