2014-12-02 1 views
2

Я пытаюсь сделать простую RPG в Дарт. Мне нужно будет показать текст на экране в div, и мне нужно заставить программу ждать ввода пользователя перед отображением следующего фрагмента текста.Могу ли я сделать функцию Дарта «подождать» на определенное количество времени или ввода?

Например:

void main() { 
    showText("Hello, Adventurer! Welcome to the land of Dartia! (Press ENTER to continue...)"); 
    print("showText has finished"); 
} 

"showText has finished" не должны отображаться до тех пор, пока не появится текст и игрок нажимает на кнопку ввода. Вот (довольно некрасиво, по-моему) код, который я до сих пор:

void showText(String text) { 
    var textBox = querySelector("#sample_text_id") 
     ..text = ""; 
    var timer; 
    var out; 
    out = ([int i = 0]) { 
     textBox.text += text[i]; 
     if (i < text.length - 1) timer = new Timer(const Duration(milliseconds: 10),() => out(i + 1)); 
    }; 
    out(); 
} 

Таймер запускает функцию out() асинхронно, что я не хочу, чтобы это сделать. В идеале я бы хотел написать примерно следующее:

void showText(String text) { 
    var textBox = querySelector("#sample_text_id") 
      ..text = ""; 
    for(int i = 0; i < text.length; i++) { 
     textBox.text += text[i]; 
     pause(const Duration(milliseconds: 10)); // pause the program for given duration 
    } 
    waitFor(KeyEnum.ENTER, KeyStateEnum.DOWN); // pause until key is pressed (pseudo Enum contains char codes) 
} 

Возможно ли это?

+0

Dart имеет ждут выражения, увидеть документ https://www.dartlang.org/articles/await-async/#await-expressions – Leo

+1

'дротик: html' имеет' KeyCode' перечисление со всеми ключевыми коды. Вам не нужно поддерживать свои собственные. –

ответ

3

Вот пример того, как это сделать, используя новую функцию async/await. Обратите внимание на асинхронную декларацию в начале тел метода и оператор ожидания перед вызовом pause() и showText().

Future pause(Duration d) => new Future.delayed(d); 

Future waitFor(int c) => document.body.onKeyDown.firstWhere((e) => e.keyCode == c); 

Future showText(String text) async { 
    var textBox = querySelector("#sample_text_id") 
      ..text = ""; 
    for(int i = 0; i < text.length; i++) { 
     textBox.text += text[i]; 
     await pause(const Duration(milliseconds: 100)); // pause the program for given duration 
    } 
    return waitFor(KeyCode.ENTER); // pause until key is pressed 
} 

main() async { 
    await showText("Hello, Adventurer! Welcome to the land of Dartia! (Press ENTER to continue...)"); 
    print("showText has finished"); 
} 
+0

Спасибо. Я протестировал его и отредактировал, чтобы код работал. Я также отредактировал ваш пост с рабочим кодом –

+1

Спасибо. Я должен был скопировать и вставить в ваше редактирование, потому что он был отвергнут чрезмерно отредактированной полицией. –

2

Эта функция pause() полностью разрушит вашу веб-страницу. В Dart нет нитей, и во время этой паузы никакой другой код не может выполняться (без обработчика событий, без обновлений GUI). Это не так, как работает код в браузере. Дарт по своей сути асинхронный. При работе с Dart важно устроиться с этим стилем программирования.

Это сказало - есть улучшения на пути Async/Await feature in Dart 1.8, который в какой-то степени скрывает эти асинхронные операции.

Смежные вопросы