我在网上到处搜索,但没能解决这个问题。
我在编码一个游戏。在游戏开始之前,我提示用户难度,用户必须通过单击其中一个按钮来选择一个难度来启动游戏。
function GameManager(){
this.current = 0;
this.difficulty = 0;
this.toolbox = new Toolbox();
this.promptDifficulty(); // Here it should wait for user input
this.grid = new Grid(this.difficulty);
this.start();
}
GameManager.prototype.promptDifficulty = function() {
$("#difficulty").show();
this.toolbox.center();
var selected = false;
$('.selection').click(function(){
var $diff = $(this).attr('id');
if($diff === 'easy')
this.difficulty = 8;
else if($diff === 'medium')
this.difficulty = 9;
else if($diff === 'hard')
this.difficulty = 10;
$('#difficulty').hide();
});
};
然而,它在用户选择困难之前就创建了网格,这给整个设计带来了混乱。如何让它等到用户单击其中一个困难设置?
发布于 2014-03-27 03:09:23
问题是困难提示是一个异步方法,当您调用promptDifficulty()
方法时,它会显示困难选择器,但是脚本执行的其余部分将在用户选择项目之前继续执行。因此,您需要使用回调来继续,一旦用户选择一个项,就会调用这个回调。
function GameManager() {
this.current = 0;
this.difficulty = 0;
this.toolbox = new Toolbox();
this.promptDifficulty($.proxy(function (difficulty) {
this.grid = new Grid(this.difficulty);
this.start();
}, this));
}
GameManager.prototype.promptDifficulty = function (callback) {
$("#difficulty").show();
this.toolbox.center();
var selected = false;
$('.selection').click($.proxy(function (e) {
var $diff = e.currentTarget.id;
if ($diff === 'easy') this.difficulty = 8;
else if ($diff === 'medium') this.difficulty = 9;
else if ($diff === 'hard') this.difficulty = 10;
$('#difficulty').hide();
callback(this.difficulty);
}, this));
};
还请注意$.proxy()的使用,因为在单击处理程序中,默认情况下this
指的是单击元素,因此当您设置this.difficulty
时,它不会设置为GameManager
实例,您可以通过传递回调方法的自定义执行上下文来解决问题。
演示:小提琴
https://stackoverflow.com/questions/22677482
复制相似问题