2

我目前正在为我的游戏添加额外的声音。问题是我有一个速记 if 语句,例如“?...:...”,但不知道如何向其中添加音频。如果不可能,我将如何使其成为正常的 if 语句而不使其崩溃。

    b.clone().addClass(
    b.data("letter") == target.data("letter") ? "wordglow3" : "wordglow").appendTo("table").css({
        background: "transparent",
        position: "absolute",
        top: currentPos.top,
        left: currentPos.left
    })

所以如果“wordglow3”我想添加“hit.play()”和“wordglow”我想添加“miss.play()”

4

2 回答 2

1

好的,首先是带有 if/else 语句的明显解决方案:

var c = b.clone();
if ( b.data("letter") == target.data("letter") ) {
    c.addClass("wordglow3");
    hit.play();
} else {
    c.addClass("wordglow");
    miss.play();
}
c.appendTo(table).css(…);

现在,我们可以使用变量删除一些重复的代码:

var className, sound;
if ( b.data("letter") == target.data("letter") ) {
    className = "wordglow3";
    sound = hit;
} else {
    className = "wordglow";
    sound = miss;
}
b.clone().addClass(className).appendTo(table).css(…);
sound.play();

甚至通过使用默认值初始化它们来缩短它们:

var className, = "wordglow",
    sound = miss;
if ( b.data("letter") == target.data("letter") ) {
    className += "";
    sound = hit;
}
…

使用三元运算符变得更加困难。我们可以使用逗号运算符在同一个表达式中链接不同的操作:

b.clone().addClass( b.data("letter") == target.data("letter")
  ? hit.play(), "wordglow3"
  : miss.play(), "wordglow"
).appendTo(table).css(…);

但这很丑陋。更好的选择是使用一个变量作为条件和两个三元运算符:

var success = b.data("letter") == target.data("letter");
b.clone().addClass(success ? "wordglow3" : "wordglow").appendTo(table).css(…);
(success ? hit : miss).play();

一旦我们到了这里,你甚至可以考虑为你的声音和类名添加一个额外的数据结构,用 key 选择替换数百万个(尤其是嵌套的)if 语句

// global:
var sounds = { // or use an arrays
    "0": …, // miss
    "1": …  // hit
};
var classes = {
    "0": "wordglow",
    "1": "wordglow3"
};
// […]
// then, select values by casting the boolean to numeric keys:
var success = b.data("letter") == target.data("letter");
b.clone().addClass(classes[+success]).appendTo(table).css(…);
sounds[+success].play();

这使得在其他情况下扩展您的应用程序变得容易,并且如果在任何地方都像这样使用它们,则可以更轻松地维护使用的类名或声音(在中心位置)。此外,我们将两个变量减少hitmiss只有一个sounds.

决定哪个代码片段最易读或最适合您的情况。

于 2012-10-26T12:53:40.680 回答
0

我的意思是,如果它不能以速记方式工作,您可以尝试很长的方式:

var class_to_add = "wordglow";
if(b.data("letter") == target.data("letter"))
  class_to_add = "wordglow3";
b.clone().addClass(class_to_add).appendTo("table").css({
        background: "transparent",
        position: "absolute",
        top: currentPos.top,
        left: currentPos.left
    });
于 2012-10-26T09:45:40.060 回答