Erlang 我如何实施;“游戏循环”;在二郎?

Erlang 我如何实施;“游戏循环”;在二郎?,erlang,game-loop,Erlang,Game Loop,我想在Erlang中实现一个游戏循环(充当服务器),但我不知道如何处理缺少递增变量的问题 我想做什么,用Java代码描述: class Game { int posX, posY; int wall = 10; int roof = 20; public void newPos(x,y) { if(!collision(x,y)) { posX = x; posY = y; }

我想在Erlang中实现一个游戏循环(充当服务器),但我不知道如何处理缺少递增变量的问题

我想做什么,用Java代码描述:

class Game {
    int posX, posY;
    int wall = 10;
    int roof = 20;

    public void newPos(x,y) {

        if(!collision(x,y)) {
            posX = x;
            posY = y;
        }
    }

    public boolean collision(x,y) {
        if(x == wall || y == roof) {
            // The player hit the wall.
            return true;         
        }
        return false;
    }

    public sendStateToClient() {
        // Send posX and posY back to client
    }


    public static void main(String[] args) {    

        // The game loop
        while(true) {

            // Send current state to the client
            sendStateToClient();

            // Some delay here...
        }
    }
}
如果客户端移动,则调用newPos()函数。如果未发生碰撞,此函数将更改某些坐标变量。游戏循环将永远持续下去,只是将当前状态发送回客户端,以便客户端可以绘制它


现在我想在Erlang中实现这个逻辑,但我不知道从哪里开始。我不能像这里一样设置变量posX和posY。。。我唯一的想法是某种递归循环,其中坐标是参数,但我也不知道这是否是正确的方法…

你的直觉是正确的:以状态作为参数的递归循环是标准的Erlang方法

这一概念通常通过使用OTP中的一种服务器行为抽象出来

简单示例,可能包含错误:

game_loop(X, Y) ->
    receive
        {moveto, {NewX, NewY}} ->
            notifyClient(NewX, NewY),
            game_loop(NewX, NewY)
    end.

好的,太好了!我如何使用OTP实现这一点?如果我使用gen_server,递归部分在哪里?递归是隐藏的。如果您查看使用OTP的应用程序,您将看到服务器进程中运行的每个函数都接受并返回一个状态参数;您决定希望状态是什么,OTP会不断向您反馈上一次函数调用返回的任何状态。