Как реализовать игровой цикл в Erlang?

Я хочу реализовать игровой цикл (действующий как сервер) в 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 так же, как здесь... Моя единственная мысль - это какой-то рекурсивный цикл, где координаты являются аргументами, но я не знаю, правильный ли это путь. ..


person rablentain    schedule 17.04.2014    source источник


Ответы (1)


Ваша интуиция верна: рекурсивный цикл с состоянием в качестве параметра — это стандартный подход Erlang.

Эту концепцию часто абстрагируют, используя одно из поведений сервера в OTP.

Простой пример, может содержать ошибки:

game_loop(X, Y) ->
    receive
        {moveto, {NewX, NewY}} ->
            notifyClient(NewX, NewY),
            game_loop(NewX, NewY)
    end.
person macintux    schedule 17.04.2014
comment
Ок, отлично! Как я могу реализовать это с помощью OTP? Если я использую gen_server, где рекурсивная часть? - person rablentain; 18.04.2014
comment
Рекурсия скрыта. Если вы просмотрите приложение, использующее OTP, вы увидите, что каждая функция, выполняемая в процессе сервера, принимает и возвращает аргумент состояния; вы решаете, каким должно быть состояние, и OTP продолжает возвращать вам информацию о состоянии, возвращенном последним вызовом функции. - person macintux; 19.04.2014