关于hud样式设计的问题 来个大佬

Home Home
引用 | 编辑 Yougmula
2023-02-19 22:11
楼主
推文 x0
我在修改zp的人类士气插件,想把hud做到【像cxol】的那种【士气条样式】要怎么实现呢?


想实现的样式是这样的::




攻击力:100% + 10% [0级士气,同时身边有1个队友额外加成10%攻击力]
[ |                           ]


攻击力:150% + 50% [5级士气,同时身边有5个队友额外加成50%攻击力]
[ | | | | | | | | | |          ]


攻击力:200% + 50% [10级士气,同时身边有5个队友额外加成50%攻击力]
[ | | | | | | | | | | | | | | | ]




每提升一级人类士气,也就是【每提升10%攻击力】,【就自动【增减】一条竖线】 。相当于【用一条竖线来表示10%攻击力】只用一个hudmessage的情况下要怎么实现。



上边的攻击力加成后面的数字是我加了【人类抱团】时候会【根据身边队友数量】【额外增加攻击力】的功能,所以我上边才会说 【自动增减一条竖线】 。

献花 x0
引用 | 编辑 弑血
2023-02-19 23:00
1楼
  
下面是引用 Yougmula 于 2023-02-19 22:11 发表的 关于hud样式设计的问题 来个大佬: 到引言文
我在修改zp的人类士气插件,想把hud做到【像cxol】的那种【士气条样式】要怎么实现呢?


想实现的样式是这样的::




攻击力:100% + 10% [0级士气,同时身边有1个队友额外加成10%攻击力]
[ |                           ]


攻击力:150% + 50% [5级士气,同时身边有5个队友额外加成50%攻击力]
[ | | | | | | | | | |          ]


攻击力:200% + 50% [10级士气,同时身边有5个队友额外加成50%攻击力]
[ | | | | | | | | | | | | | | | ]




每提升一级人类士气,也就是【每提升10%攻击力】,【就自动【增减】一条竖线】 。相当于【用一条竖线来表示10%攻击力】只用一个hudmessage的情况下要怎么实现。



上边的攻击力加成后面的数字是我加了【人类抱团】时候会【根据身边队友数量】【额外增加攻击力】的功能,所以我上边才会说 【自动增减一条竖线】 。



首先先用回圈检查玩家距离,在设定多少距离离内的人数


在来使用阵列字串纪录1-10等的能量变化,再来把人数放进对应的能量字串阵列显示出来即可


例如


new human_power[33][10][16] = {"I", "II", "III"} //以此类推  &  33 = 玩家编号顺序 & 10 = 能量顺序 & 16 = 能量字串显示长度


再来把对应的hud显示字串放入对应的顺序即可 human_power[玩家ID][目前周围几人]

献花 x0
引用 | 编辑 Yougmula
2023-02-20 01:44
2楼
  
下面是引用 弑血 于 2023-02-19 23:00 发表的 : 到引言文




首先先用回圈检查玩家距离,在设定多少距离离内的人数


在来使用阵列字串纪录1-10等的能量变化,再来把人数放进对应的能量字串阵列显示出来即可


例如


new human_power[33][10][16] = {"I", "II", "III"} //以此类推  &  33 = 玩家编号顺序 & 10 = 能量顺序 & 16 = 能量字串显示长度


再来把对应的hud显示字串放入对应的顺序即可 human_power[玩家ID][目前周围几人]


我在别的地方找到了别的士气怒气插件,里面的hud效果就符合我说的。但是我看不懂他的写法,我把hud那段代码发出来,你能说一下他的代码是什么意思吗? 







【代码】



Show_RageHud(id)
{
if(!is_user_alive(id)) return
new szBar[64]
for(new i = 0; i < (floatround(float(g_iRagePercent[id]) / 4.0, floatround_floor)); i++) 
formatex(szBar, sizeof(szBar), "%s|", szBar)
for(new i = 0; i < (25 - (floatround(float(g_iRagePercent[id]) / 4.0, floatround_floor))); i++) 
formatex(szBar, sizeof(szBar), "%s  ", szBar)


set_dhudmessage(250, 250 - g_iRagePercent[id] * 2 , 0,  -1.0, 0.8, 0, 1.0, 1.0, 0.0, 0.0)
show_dhudmessage(id, "[%s]", szBar)
}
Show_MoraleHud(id)
{
if(!is_user_alive(id)) return
new szNotice[32], iMoarleBar = min(g_iMoraleLevel + g_iMoraleAdd[id] + g_iMoraleNear[id], 13)
formatex(szNotice, sizeof(szNotice), "攻击力 : %i%", (g_iMoraleLevel + g_iMoraleAdd[id]) * 10 + 100)
if(g_iMoraleNear[id])
format(szNotice, sizeof(szNotice), "%s% + %i%", szNotice, g_iMoraleNear[id] * 10)
set_hudmessage(COLOR_MORALE[iMoarleBar][0], COLOR_MORALE[iMoarleBar][1], COLOR_MORALE[iMoarleBar][2], -1.0, 0.8 - 0.02, 0, 1.25, 1.25, 0.0, 0.0)
ShowSyncHudMsg(id, CreateHudSyncObj(2), szNotice)

new szBar[42]
for(new i = 0; i < iMoarleBar * 2; i++) formatex(szBar, sizeof(szBar), "%s|", szBar)
for(new i = 0; i < (20 - iMoarleBar * 2); i++) formatex(szBar, sizeof(szBar), "%s  ", szBar)


set_dhudmessage(COLOR_MORALE[iMoarleBar][0], COLOR_MORALE[iMoarleBar][1], COLOR_MORALE[iMoarleBar][2], -1.0, 0.8, 0, 1.0, 1.0, 0.0, 0.0)
show_dhudmessage(id, "[%s]", szBar)
}

献花 x0
引用 | 编辑 Yougmula
2023-02-20 01:49
3楼
  
下面是引用 弑血 于 2023-02-19 23:00 发表的 : 到引言文




首先先用回圈检查玩家距离,在设定多少距离离内的人数


在来使用阵列字串纪录1-10等的能量变化,再来把人数放进对应的能量字串阵列显示出来即可


例如


new human_power[33][10][16] = {"I", "II", "III"} //以此类推  &  33 = 玩家编号顺序 & 10 = 能量顺序 & 16 = 能量字串显示长度


再来把对应的hud显示字串放入对应的顺序即可 human_power[玩家ID][目前周围几人]




【我把贴上来的代码重新排版了一下】



Show_RageHud(id)   ///僵尸怒气HUD代码
{
       if(!is_user_alive(id))            return      
       new szBar[64]
       for(new i = 0; i < (floatround(float(g_iRagePercent[id]) / 4.0, floatround_floor)); i++)
       formatex(szBar, sizeof(szBar), "%s|", szBar)

       for(new i = 0; i < (25 - (floatround(float(g_iRagePercent[id]) / 4.0, floatround_floor))); i++)
        formatex(szBar, sizeof(szBar), "%s ", szBar)

         set_dhudmessage(250, 250 - g_iRagePercent[id] * 2 , 0, -1.0, 0.8, 0, 1.0, 1.0, 0.0, 0.0)
         show_dhudmessage(id, "[%s]", szBar)
}


Show_MoraleHud(id)  ///人类士气HUD代码
{
            if(!is_user_alive(id))            return
            new szNotice[32], iMoarleBar = min(g_iMoraleLevel + g_iMoraleAdd[id] + g_iMoraleNear[id], 13)
             formatex(szNotice, sizeof(szNotice), "攻击力 : %i%", (g_iMoraleLevel + g_iMoraleAdd[id]) * 10 + 100)

          if(g_iMoraleNear[id])
           format(szNotice, sizeof(szNotice), "%s% + %i%", szNotice, g_iMoraleNear[id] * 10)
            set_hudmessage(COLOR_MORALE[iMoarleBar][0], COLOR_MORALE[iMoarleBar][1], COLOR_MORALE[iMoarleBar][2],                   -1.0,  0.8 - 0.02, 0, 1.25, 1.25, 0.0, 0.0)

           ShowSyncHudMsg(id, CreateHudSyncObj(2), szNotice)
     
         new szBar[42]
         for(new i = 0; i < iMoarleBar * 2; i++)      formatex(szBar, sizeof(szBar), "%s|", szBar)
         for(new i = 0; i < (20 - iMoarleBar * 2); i++)      formatex(szBar, sizeof(szBar), "%s ", szBar)

          set_dhudmessage(COLOR_MORALE[iMoarleBar][0], COLOR_MORALE[iMoarleBar][1], COLOR_MORALE[iMoarleBar][2], -1.0, 0.8, 0, 1.0, 1.0, 0.0, 0.0)

     show_dhudmessage(id, "[%s]", szBar)
}

献花 x0
引用 | 编辑 Yougmula
2023-02-20 02:12
4楼
  
下面是引用 弑血 于 2023-02-19 23:00 发表的 : 到引言文




首先先用回圈检查玩家距离,在设定多少距离离内的人数


在来使用阵列字串纪录1-10等的能量变化,再来把人数放进对应的能量字串阵列显示出来即可


例如


new human_power[33][10][16] = {"I", "II", "III"} //以此类推  &  33 = 玩家编号顺序 & 10 = 能量顺序 & 16 = 能量字串显示长度


再来把对应的hud显示字串放入对应的顺序即可 human_power[玩家ID][目前周围几人]



对了再顺便问一下 像cxol的尘埃之光,雷神,【虎王】巴雷特开枪会有一段一段的激光那种是怎么实现的。比如尘埃之光,开枪会有一小段蓝色激光特效向击中的地方飞行,这种激光特效是什么原理?不是那种一开枪就会立即显示完整一段的激光特效的。

献花 x0
引用 | 编辑 弑血
2023-02-20 02:23
5楼
  
下面是引用 Yougmula 于 2023-02-20 01:49 发表的 : 到引言文



【我把贴上来的代码重新排版了一下】

.......



虽然都是先研究再改良,不过还是建议自己写会比较好。只帮解说一次


Show_RageHud(id)   ///僵尸怒气HUD代码
{
       if(!is_user_alive(id))            return      //是否活着
       new szBar[64] //字串空间
       for(new i = 0; i < (floatround(float(g_iRagePercent[id]) / 4.0, floatround_floor)); i++) //怒气运算
       formatex(szBar, sizeof(szBar), "%s|", szBar) //怒气条

       for(new i = 0; i < (25 - (floatround(float(g_iRagePercent[id]) / 4.0, floatround_floor))); i++) //怒气运算
        formatex(szBar, sizeof(szBar), "%s ", szBar) //怒气条

         set_dhudmessage(250, 250 - g_iRagePercent[id] * 2 , 0, -1.0, 0.8, 0, 1.0, 1.0, 0.0, 0.0) //怒气改变颜色
         show_dhudmessage(id, "[%s]", szBar) //怒气条显示
}


Show_MoraleHud(id)  ///人类士气HUD代码
{
            if(!is_user_alive(id))            return //是否活着
            new szNotice[32], iMoarleBar = min(g_iMoraleLevel + g_iMoraleAdd[id] + g_iMoraleNear[id], 13) //士气运算+上限设定13
             formatex(szNotice, sizeof(szNotice), "攻击力 : %i%", (g_iMoraleLevel + g_iMoraleAdd[id]) * 10 + 100) //士气运算

          if(g_iMoraleNear[id])
           format(szNotice, sizeof(szNotice), "%s% + %i%", szNotice, g_iMoraleNear[id] * 10) //士气条运算
            set_hudmessage(COLOR_MORALE[iMoarleBar][0], COLOR_MORALE[iMoarleBar][1], COLOR_MORALE[iMoarleBar][2],                   -1.0,  0.8 - 0.02, 0, 1.25, 1.25, 0.0, 0.0) //设定士气条颜色

           ShowSyncHudMsg(id, CreateHudSyncObj(2), szNotice) //显示士气条

         new szBar[42] // 字串空间
         for(new i = 0; i < iMoarleBar * 2; i++)      formatex(szBar, sizeof(szBar), "%s|", szBar) //士气条运算
         for(new i = 0; i < (20 - iMoarleBar * 2); i++)      formatex(szBar, sizeof(szBar), "%s ", szBar) //士气条运算

          set_dhudmessage(COLOR_MORALE[iMoarleBar][0], COLOR_MORALE[iMoarleBar][1], COLOR_MORALE[iMoarleBar][2], -1.0, 0.8, 0, 1.0, 1.0, 0.0, 0.0) //设定士气条

     show_dhudmessage(id, "[%s]", szBar) //显示士气条
}


以上可以改良空间很大,毕竟用太多回圈会很消耗游戏内存,久了可能会不稳,基本上回圈少用点会比较好。

献花 x0