Могу ли я прервать код JavaScript и затем продолжить нажатие клавиши? - PullRequest
0 голосов
/ 12 июня 2010

Я портирую старую игру с C на Javascript.У меня возникла проблема с отображаемым кодом, из-за которой я хотел бы использовать методы отображения вызова основного игрового кода, не беспокоясь о том, как отображаются эти сообщения о состоянии.

В исходном коде, если сообщение слишкомдолго, программа просто ждет игрока, чтобы переключиться между сообщениями с пробелом, а затем продолжает.Это не работает в javascript, потому что пока я жду события, весь другой программный код продолжается.Я думал использовать обратный вызов, чтобы дополнительный код мог выполняться, когда игрок нажимает назначенную клавишу, но я не понимаю, как это будет жизнеспособно при большом количестве вызовов на display.update(msg), разбросанных по всему коду.

Могу ли я проектировать вещи иначе, чтобы работала асинхронная модель на основе событий, или есть какое-то другое решение, которое позволило бы мне реализовать более традиционный цикл обработки событий?

смысл?

Пример:

// this is what the original code does, but obviously doesn't work in Javascript
display = {
    update : function(msg) {
          // if msg is too long
          //     wait for user input
          // ok, we've got input, continue
    }
};


// this is more javascript-y...
display = {
    update : function(msg, when_finished) {
          // show part of the message

          $(document).addEvent('keydown', function(e) {
               // display the rest of the message

               when_finished();
          });
    }
};
// but makes for amazingly nasty game code
do_something(param, function() {
    // in case do_something calls display I have to 
    // provide a callback for everything afterwards

    // this happens next, but what if do_the_next_thing needs to call display?
    // I have to wait again
    do_the_next_thing(param, function() {
        // now I have to do this again, ad infinitum
    }
}

Ответы [ 2 ]

1 голос
/ 12 июня 2010

Короткий ответ «нет».

Более длинный ответ заключается в том, что с помощью «веб-работников» (часть HTML5) вы можете сделать это, потому что это позволяет поставить игрулогику в отдельном потоке и использовать обмен сообщениями для нажатия клавиш из пользовательского ввода в игровой поток.Однако затем вам нужно будет использовать обмен сообщениями и другим способом, чтобы иметь возможность фактически отображать вывод, который, вероятно, не будет работать так хорошо.

0 голосов
/ 12 июня 2010

Есть флаг, который вы ожидаете пользовательского ввода.

var isWaiting = false;

, а затем проверьте значение этого флага в do_something (очевидно, установите его и там, где необходимо :)).

if (isWaiting) return;

Возможно, вы захотите реализовать это выше в стеке вызовов (что вызывает do_something()?), Но вам нужен именно такой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...