Erlang中的怪物AI-如何勾选进程,如何读取玩家';健康
我想了解一下Erlang的流程,这里有两个关于游戏服务器的问题: 第一个问题:如果怪物空闲,它应该每x秒随机移动一次。每x秒更新或勾选一个进程的正确方法是什么?最优雅的方式是什么 第二个问题:怪物想攻击一名玩家,但想先检查其位置。常见的方法是:Erlang中的怪物AI-如何勾选进程,如何读取玩家';健康,erlang,Erlang,我想了解一下Erlang的流程,这里有两个关于游戏服务器的问题: 第一个问题:如果怪物空闲,它应该每x秒随机移动一次。每x秒更新或勾选一个进程的正确方法是什么?最优雅的方式是什么 第二个问题:怪物想攻击一名玩家,但想先检查其位置。常见的方法是: if dist(mob_pos, player_pos) < 10 then send attack message to player 如果距离(移动位置,玩家位置)。。。; 镁硼->。。。; ... 之后-> 做你必须做的事 结束。 erl
if dist(mob_pos, player_pos) < 10 then send attack message to player
如果距离(移动位置,玩家位置)<10,则向玩家发送攻击消息
我知道我可以通过发送“询问pos”消息并在下次更新中读取结果来检查玩家的pos。但问题是:这是下一次更新,怪物不会知道它只是要求pos攻击玩家。Erlang如何检查位置,然后向玩家发送攻击信息?对于问题1:
标准库中有一个很好的计时器模块:
这可以为你的申请打勾
关于问题2:
你似乎想知道怪物和玩家之间的同步。
如果你在玩家和怪物之间进行异步消息传递,那么问题和回复之间可能会有计时器发出的滴答声(尽管可能性很小)。
您可以做的是执行一个同步调用,该调用将阻止进程,直到操作得到解决
您可以将monster和player建模为gen_服务器,并使用它们的cast(异步)和call(同步)方法。见:
第一个问题:怪物应该每x秒随机移动一次
如果空闲。每x更新或勾选一个进程的正确方法是什么
秒?最优雅的方式是什么
如果使用receive/after子句,erlang进程将在“
代码块。这是做你想做的事情最有效的方法:
receive
msg_a -> ...;
mg_b -> ...;
...
after <milliseconds> ->
do_whatever you have to
end.
接收
味精a->。。。;
镁硼->。。。;
...
之后->
做你必须做的事
结束。
erlang VM不能跳过“after”代码块。另外,由于“after”代码块不是来自邮箱的消息,所以不能丢失它。而且保证它会被执行
但是如果你使用这个方案,你的怪物将是独立的演员。
例如怪物1诞生了。然后他睡了10000毫秒。在一秒钟内,另一个怪物诞生了——他睡了10000毫秒。所以怪物1将被唤醒一秒钟,而第二个怪物将睡眠一秒钟
但在现实世界中,一切都像我上面描述的那样发生:)
每个人的生物时间都是独立的。但是物理所有对象的时间同时滴答作响
所以这取决于你想使用的时间——生物的还是物理的(就游戏性而言)
Erlang更适合生物技术。但是,可以使用同步来实现物理同步
第二个问题:怪物想攻击一个玩家,但却想
首先检查它的位置。常见的方法是:
如果距离(移动位置,玩家位置)<10,则向玩家I发送攻击消息
知道我可以通过发送“询问pos”来检查玩家的pos
消息并在下次更新中读取结果。但这是答案
问题:这是下一次更新,怪物不会知道
只是要求pos攻击玩家。去爱尔兰的路怎么走
检查位置,然后向玩家发送攻击信息
后来呢
这是你系统的设计缺陷。
当一个强盗想抢劫你的时候,他会问你你的位置吗
应该有一个“游戏”过程。此过程应