搜索
热搜: 活动 交友 discuz
查看: 3871|回复: 6

[演示] 物品掉落系统

[复制链接]

55

主题

356

帖子

3939

积分

大摸导师

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

UID
12
金币
3935
精华
4
节操
-233

黑科技玩的6扛把子我是鸽手隐修议员教程大师创世者开拓者幸运儿!

发表于 2015-7-1 00:19:39 | 显示全部楼层 |阅读模式

前方高能预警!非战斗人员请尽快登录!

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

x
其实这篇帖子已经有很久了,然后也很久之前就见过了,反正打一下字翻译一下,也不会很长时间,就随便弄弄了。
时间有限,有错别字请见谅。

下面开始主题:

这个帖子中完成的是一个动态的物品掉落系统,这对于RPG游戏是很有用的。
当然了,要完成这个东西有很多方法可以做到,其中最常见的当然是在单位的定义当中声明一下…… 但是,如果你的单位定义文件有几千行的话,那就不是一个非常好的选择了。
最好的方式当然是有专门的一个文件来定义说每一个单位可以掉落那些东西,掉落几个,然后当一个单位死亡之后,就会掉落对应的物品。


1、定义物品掉落的KV文件。
推荐在scripts文件夹中新建一个kv文件夹来储存所有的kv文件,KV文件可以是任何的拓展名,这里推荐使用.kv。
[Actionscript3] syntaxhighlighter_viewsource syntaxhighlighter_copycode
"Drops" 
{ 
    "creature_name1"
    { 
        "item_name1" "10"
        "item_name2" "50"
        "item_name3" "100"
    }
}


这个KV文件定义了一个单位,他分别可以按10%,50%,100%的概率掉落三个物品。
之后把这个文件保存好。之后在你的lua文件中,在游戏模式的初始化阶段像这样载入这个文件的内容:
[Golang] syntaxhighlighter_viewsource syntaxhighlighter_copycode
GameRules.DropTable = LoadKeyValues("scripts/kv/item_drops.kv")

通过这样的初始化,每个单位的掉落和另一个单位的掉落是独立的,对于同一个单位,应该有掉落一个,全部掉落,或者不掉落这几种可能。


2、当单位死亡的Lua监听
只要监听entity_killed这个时间就可以了,然后在函数中调用一个RollDrops函数:
[Golang] syntaxhighlighter_viewsource syntaxhighlighter_copycode
ListenToGameEvent('entity_killed', Dynamic_Wrap(GameMode, 'OnEntityKilled'), self)

[Golang] syntaxhighlighter_viewsource syntaxhighlighter_copycode
function GameMode:OnEntityKilled( keys )
    local killedUnit = EntIndexToHScript( keys.entindex_killed )
    if killedUnit:IsCreature() then
        RollDrops(killedUnit)
    end
end



3、随机掉落的RollDrops函数
[Golang] syntaxhighlighter_viewsource syntaxhighlighter_copycode
function RollDrops(unit)
-- 读取上面读取的掉落KV文件,然后读取到对应的单位的定义文件
    local DropInfo = GameRules.DropTable[unit:GetUnitName()]
    if DropInfo then
-- 循环所有需要掉落的物品
        for item_name,chance in pairs(DropInfo) do
            if RollPercentage(chance) then
                -- 创建对应的物品
                local item = CreateItem(item_name, nil, nil)
                local pos = unit:GetAbsOrigin() + RandomVector(200)
-- 用LaunchLoot函数可以有一个掉落动画,当然,也可以用CreateItemOnPositionSync来直接掉落。
                item:LaunchLoot(false, RandomInt(1,200), RandomInt(300,500), pos)
            end
        end
    end
end


4、扩展一下解决方案,来实现多次掉落同一个物品
因为Lua表的限制,你当然不能拥有两个拥有同样key的表元素,如果在KV文件重复定义了物品,那也是没有什么卵用的。
这个时候,你应该要定义每一个物品的掉落啊,概率啊,什么的。
[Actionscript3] syntaxhighlighter_viewsource syntaxhighlighter_copycode
"Drops" 
{ 
    "creature_name1"
    { 
        "1"
        {
            "Item"     "item_name1"
            "Chance"   "10"
            "Multiple" "3"
        }
        "2"
        {
            "Item"     "item_name2"
            "Chance"   "50"
            "Multiple" "1"
        }
    }
}


之后也要修改一下对应的RollDrops函数:
[Golang] syntaxhighlighter_viewsource syntaxhighlighter_copycode
function RollDrops(unit)
    local DropInfo = GameRules.DropTable[unit:GetUnitName()]
    if DropInfo then
        for k,ItemTable in pairs(DropInfo) do
            local chance = ItemTable.Chance or 100
            local max_drops = ItemTable.Multiple or 1
            local item_name = ItemTable.Item
            for i=1,max_drops do -- 其他都是基本一样的,这里加个循环来多次掉落而已
                if RollPercentage(chance) then
                    print("Creating "..item_name)
                    local item = CreateItem(item_name, nil, nil)
                    item:SetPurchaseTime(0)
                    local pos = unit:GetAbsOrigin()
                    local drop = CreateItemOnPositionSync( pos, item )
                    local pos_launch = pos+RandomVector(RandomFloat(150,200))
                    item:LaunchLoot(false, 200, 0.75, pos_launch)
                end
            end
        end
    end
end


5、100%掉落某个物品的方法
因为每次,这些物品的概率是独立计算的,如果你定义了一个物品掉落50%,另一个物品掉落概率50%,这并不能达到不掉落这个物品就掉落那个物品的要求。
这个时候你应该是需要定义一个系列物品,掉落里面的某一个物品:

KV文件:
[Actionscript3] syntaxhighlighter_viewsource syntaxhighlighter_copycode
"Drops" 
{ 
    "creature_name1"
    { 
        "1"
        {
            "ItemSets"
            {
                "1" "item_name_set1"
                "2" "item_name_set2"
                "3" "item_name_set3"
            }
            "Chance"   "100" //of dropping 1 of the set
        }
        "2"
        {
            "Item"     "item_name2"
            "Chance"   "50"
            "Multiple" "3"
        }
    }
}


LUA函数:
[Golang] syntaxhighlighter_viewsource syntaxhighlighter_copycode
function RollDrops(unit)
    local DropInfo = GameRules.DropTable[unit:GetUnitName()]
    if DropInfo then
        print("Rolling Drops for "..unit:GetUnitName())
        for k,ItemTable in pairs(DropInfo) do
            -- If its an ItemSet entry, decide which item to drop
            local item_name
            if ItemTable.ItemSets then
                -- Count how many there are to choose from
                local count = 0
                for i,v in pairs(ItemTable.ItemSets) do
                    count = count+1
                end
                local random_i = RandomInt(1,count)
                item_name = ItemTable.ItemSets[tostring(random_i)]
            else
                item_name = ItemTable.Item
            end
            local chance = ItemTable.Chance or 100
            local max_drops = ItemTable.Multiple or 1
            for i=1,max_drops do
                print("Rolling chance "..chance)
                if RollPercentage(chance) then
                    print("Creating "..item_name)
                    local item = CreateItem(item_name, nil, nil)
                    item:SetPurchaseTime(0)
                    local pos = unit:GetAbsOrigin()
                    local drop = CreateItemOnPositionSync( pos, item )
                    local pos_launch = pos+RandomVector(RandomFloat(150,200))
                    item:LaunchLoot(false, 200, 0.75, pos_launch)
                end
            end
        end
    end
end

点评

海!外直播 t.cn/RxBC0c2 禁闻视频 t.cn/RJJZmvp 一个国家有三千所普通大学,学生大多自费;但却有6000所党校是花纳税人的钱办学,学生全都用纳税人的钱上学!令人发指的是它们的毕业生犯罪率几乎百分之百!  发表于 2019-9-6 03:45

评分

参与人数 1金币 +66 收起 理由
造纸农 + 66 ym窝叉

查看全部评分

回复

使用道具 举报

2

主题

41

帖子

121

积分

大魔导师

UID
1038
金币
234
精华
0
节操
-6

隐修议员

QQ
发表于 2015-7-12 10:39:25 | 显示全部楼层
仔细研读了,对lua中如何使用kv有了正确的认识
回复 支持 1 反对 0

使用道具 举报

8

主题

35

帖子

252

积分

Lv:2 长袍法师

UID
2801
金币
120
精华
0
节操
0
发表于 2015-7-11 09:10:29 | 显示全部楼层
照抄了上面的1、2、3,我设置了10个怪,打死后怎么没有掉装备?
回复 支持 反对

使用道具 举报

4

主题

15

帖子

357

积分

Lv:3 空明术士

UID
4658
金币
152
精华
0
节操
-1
发表于 2015-7-11 14:02:41 | 显示全部楼层
Kakarroto 发表于 2015-7-11 09:10
照抄了上面的1、2、3,我设置了10个怪,打死后怎么没有掉装备?

用第二种方法
回复 支持 反对

使用道具 举报

4

主题

9

帖子

313

积分

Lv:3 空明术士

UID
13804
金币
97
精华
0
节操
0
发表于 2019-3-5 13:38:11 | 显示全部楼层
我想知道2,3 这些代码应该放在哪里
回复 支持 反对

使用道具 举报

0

主题

8

帖子

225

积分

Lv:2 长袍法师

UID
14780
金币
93
精华
0
节操
0
发表于 2019-9-4 16:14:53 | 显示全部楼层
造纸农 发表于 2015-7-12 10:39
仔细研读了,对lua中如何使用kv有了正确的认识

同感,学到了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|Archiver|手机版|小黑屋|AMHC!dota2rpg~ ( 闽ICP备14009209  

GMT+8, 2019-9-17 04:11 , Processed in 0.175036 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc. Theme.Yeei

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