Изменение скорости анимации
Я создаю новую игру стиля "whack-a-mole", в которой дети должны набирать правильные цифры в соответствии с вопросом. Пока все идет хорошо, у меня есть таймер, подсчитывают правильные и неправильные ответы, и когда игра запущена, у меня есть несколько div, называемых "символами", которые появляются в контейнере случайным образом в заданное время.
Я забрал кнопку "play" и заменил ее "легким", "средним" и "жестким". Когда нажимается режим, я хочу, чтобы скорость изменилась. Три кнопки разделяют класс "game_settings"
Вот код, который заключает сделки с анимацией
function randomFromTo(from, to) {
return Math.floor(Math.random() * (to - from + 1) + from);
}
function scramble() {
var children = $('#container').children();
var randomId = randomFromTo(1, children.length);
moveRandom("char" + randomId);
}
var currentMoving = [];
function moveRandom(id) {
// If this one already animating, skip it
if ($.inArray(id, currentMoving) !== -1) {
return;
}
// Mark this one as animating
currentMoving.push(id);
var cPos = $('#container').offset();
var cHeight = $('#container').height();
var cWidth = $('#container').width();
var bWidth = $('#' + id).width();
var bHeight = $('#' + id).css('top', '395px').fadeIn(100).animate({
'top': '-55px'
}, 6000).fadeOut(100);
maxWidth = cPos.left + cWidth - bWidth;
minWidth = cPos.left;
newWidth = randomFromTo(minWidth, maxWidth);
$('#' + id).css({
left: newWidth
}).fadeIn(1000, function () {
setTimeout(function () {
$('#' + id).fadeOut(1000);
// Mark this as no longer animating
var ix = $.inArray(id, currentMoving);
if (ix !== -1) {
currentMoving.splice(ix, 1);
}
window.cont++;
}, 1000);
});
}
Как я могу сделать это так, чтобы эти настройки менялись в соответствии с трудностью, нажатой в начале?
Fiddle: http://jsfiddle.net/pUwKb/53/
Ответы
Ответ 1
Ваши кнопки не разделяют класс 'game_ettings', они находятся внутри div с классом 'game_settings', поэтому игра начинается также, если вы нажмете между кнопками. измените его так:
// remove this line
$(".game_settings").find('input').click(
// replace it with...
var AnimationSpeed = 6000;
$(".game_settings").find('input').click(function () {
// here you could set a different timer value for each variant
// or simply send the classname to startplay and handle the
// settings there.
switch($(this).attr('class')) {
case 'easy':
AnimationSpeed = 6000;
break;
case 'medium':
AnimationSpeed = 3000;
break;
case 'hard':
AnimationSpeed = 1000;
break;
}
startplay();
});
В вашей функции таймера удалите строку:
$("#btnstart").bind("click", startplay);
И в вашей функции moveRandom вы используете AnitmationSpeed:
var bHeight = $('#' + id).css('top', '395px').
fadeIn(100).animate({'top': '-55px'}, AnimationSpeed).
fadeOut(100);
Здесь вы найдете рабочую демонстрацию .
Ответ 2
Я думаю, что вы хотите сделать, это установить timeInterval в соответствии с трудностью игры. Вот как я думаю, вы можете заставить его работать.
Изменения должны быть сделаны:
HTML:
//Change
<div class="game_settings">
<div><input class="easy" type="button" value="Easy"></div>
<div><input class="medium" type="button" value="Medium"></div>
<div><input class="hard" type="button" value="Hard"></div>
</div>
//To
<div class="game_settings">
<div><input class="game-speed" id="easy" type="button" value="Easy"></div>
<div><input class="game-speed" id="medium" type="button" value="Medium"></div>
<div><input class="game-speed" id="hard" type="button" value="Hard"></div>
</div>
Sript:
//Change
$(".game_settings").click(function () {
startplay();
});
//To
$(".game-speed").click(function () {
startplay($(this).attr('id'));
});
//Change in startPlay()
startPlay()
play = setInterval(function () {
if (window.cont) {
window.cont--;
scramble();
}
}, 500);
//To
startplay(speed_check) // As it is now expecting a variable
if(speed_check == 'easy'){
play = setInterval(function () {
if (window.cont) {
window.cont--;
scramble();
}
}, 2000);
}
else if(speed_check == 'medium'){
play = setInterval(function () {
if (window.cont) {
window.cont--;
scramble();
}
}, 1000);
}
else if(speed_check == 'hard'){
play = setInterval(function () {
if (window.cont) {
window.cont--;
scramble();
}
}, 400);
}
else{
play = setInterval(function () {
if (window.cont) {
window.cont--;
scramble();
}
}, 1000);
}
Задайте временные интервалы, как вам нравится.
Примечание. Это просто идея, как это должно быть. Вы можете, конечно, сделать его более эффективным, так как вы знаете свой код лучше, чем кто-либо еще.
Ответ 3
В DotNet вам нужно "остановить" раскадровку и перезапустить с изменением скорости.
Dim sb as Storyboard = ctype(Me.FindRessources("Storyboard1"), Storyboard)
sb.Stop
Select Case Level
Case "easy": sb.SpeedRatio = 0.75
Case "medium": sb.SpeedRatio = 1
Case "hard": sb.SpeedRatio = 2.0
End Select
sb.Begin
Возможно, это то же самое в JavaScript?