查看: 1866|回复: 3
打印 上一主题 下一主题

[交流] BlockUseEvent等事件过多触发的解决办法

[复制链接]

2

主题

6

回帖

5

积分

Lv.1 新手木匠

UID
8075900
小麦
1
金锭
31
下界之星
0
跳转到指定楼层
楼主
发表于 2021-8-13 14:47:26 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 IP:浙江
官方示例中写到:如果一直点着右键会发现背包一下子就被钻石剑填满了。这是因为ServerBlockUseEvent事件每一帧(tick)都会触发,开发者在阅读文档时也应留意。
那么,如何解决这个问题呢?
首先,在服务端初始化时记录时间
def __init__(self, namespace, systemName):
      # ...
      self.timecomp = serverApi.GetEngineCompFactory().CreateTime(0)
      self.Time = self.timecomp.GetTime()

然后,在事件处理函数中,检测事件和上次执行事件是否存在足够间隔,如果没有,就取消执行
def OnServerBlockUseEvent(self, args):
        if self.timecomp.GetTime() < self.Time + self.INTERVAL:
            return "帧数过高,取消执行"
        else:
            self.Time = self.timecomp.GetTime()
其中,self.INTERVAL是间隔帧数

可以完美解决问题

22

主题

93

回帖

51

积分

Lv.3 矿物能手

UID
8595325
小麦
0
金锭
159
下界之星
0
沙发
发表于 2021-8-13 15:18:26 来自手机 | 只看该作者 IP:浙江
本质就是通过一个变量来控制它

22

主题

317

回帖

174

积分

Lv.4 怪物猎人

UID
373726
小麦
3
金锭
608
下界之星
0

开发者认证勋章

板凳
发表于 2021-8-21 00:29:54 | 只看该作者 IP:山西
不需要GetTime,只需要一个类全局变量就行
在手机上点击一次方块只会触发一次BlockUseEvent,电脑上右键方块才会多次触发。所以如果不打算上架电脑,可以不处理此问题。
监听客户端使用方块的事件。再监听鼠标右键,如果玩家右键方块,就判断全局变量是不是True,是的话就return,不是的话就往下走,并把这个变量设为True,然后执行逻辑(如发事件到服务端)。玩家松开鼠标右键时,把这个变量再次设为False。

22

主题

93

回帖

51

积分

Lv.3 矿物能手

UID
8595325
小麦
0
金锭
159
下界之星
0
地板
发表于 2021-8-21 10:41:57 来自手机 | 只看该作者 IP:浙江
我是通过客户端或者服务端自定义一个component,comp里面放着各种控制开关,这个更佳舒服省事,而且它是由entityid创建的comp,各个玩家使用相互不影响,不用担心线程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部