2013-11-19 2 views
3

Итак, я создал Arkanoid Paddle, который в основном перемещается влево и вправо с помощью аналогового джойстика.Добавить Cool-Down для умения Использовать

if (GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.X == -1.0f) 
{ 
    // Player one has pressed the left thumbstick up. 
    Position.X = Position.X - (5 + speedup1); 
} 


if (GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.X == 1.0f) 
{ 
    // Player one has pressed the left thumbstick up. 
    Position.X = Position.X + (5 + speedup1); 
} 

speedup1 является начальным целое значение устанавливается на ноль, и, когда Player нажимает на правый триггер, он устанавливает значение до 5, таким образом, увеличивая скорость мешалки.

if (GamePad.GetState(PlayerIndex.One).Triggers.Right > 0) 
{ 
    speedup1 = 5; 
} 

То, что я хочу сделать, это сделать так, чтобы после нажатия на спусковой крючок, значение speedup1 возвращается к 0 после заданного интервала времени, и игрок не в состоянии изменить его снова для другого заданного интервала время.

Помогите, пожалуйста,

+0

Выражаясь просто и вообще, при создании игры, вы обычно хотите обновления часть вашего игрового цикла, где вы отправляете в истекшее время (в клещах или миллисекундах) каждый цикл. Это время затем используется в обновлениях всех сущностей для расчета их расстояния перемещения и т. Д. Это время также можно использовать для вычитания из таймеров, таких как кулдауны. Все это должно быть сделано в методе Update для игрового объекта. – Tobberoth

ответ

0

Я не знаю, как ваша игра строить, нужно размещать больше кода для этого, но, вообще говоря:

Теперь представьте кулдаун что-то в игра. Игрок нажал «a», произошло какое-то классное действие, и хотя он может снова нажать «a», ничего не будет произойдет в течение следующих 5 секунд. Но игра все еще работает и делает все, что может случиться. Это не обычный таймер . Это переменная, позволяет называть ее ActionCooldown и после того, как игрок запускает действие, оно установлено на 5 секунд. Каждый раз, когда меняется мир, timePassed вычитается из этого числа, пока не станет равным нулю. Все время игра идет и обрабатывает ввод и рендеринга. Но только однажды ActionCooldown достигнет нуля, другое нажатие «a» снова запустит это действие.

Проголосовано here.

Создать переменную. Установите его на время восстановления. Вычитайте время, пока оно не достигнет нуля. Перезарядка.

0

Попробуйте что-то вроде этого:

// declare this as a variable in your game class 
public float PaddleSpeedUpCoolDownTime = 0.0f; 

if (GamePad.GetState(PlayerIndex.One).Triggers.Right > 0) 
{ 
    PaddleSpeedUpCoolDownTime = 5.0f; // 5 seconds 
    speedup1 = 5; 
} 

// in your main game loop in an appropriate place 
if (PaddleSpeedUpCoolDownTime > 0.0f) 
{ 
    speedup1 = speedup1 * 0.9f * frameTime; // to slow down gradually 

    PaddleSpeedUpCoolDownTime = PaddleSpeedUpCoolDownTime - frameTime; 
} 
+0

Спасибо за быстрый ответ, но я действительно не понимаю, как добавить код, чтобы остановить проигрыватель от спама RT все время, чтобы продолжать повышать скорость. Кроме того, я пытался помещать медленный код в общедоступную функцию Update(), но это не позволяет мне. – user3007548

+0

Что значит «не позволять мне»? – rhughes

0

Что-то вроде этого, так что, когда пользователь нажимает RT, следующий RT не будет иметь никакого эффекта, пока первый остывания не закончил. Итак:

bool boosting = false; 
bool coolingDown = false; 
float someIncrement = -1; 
float cooldownTime = 0; 
float timeRequired = 10; 
public void updateMovement() 
{ 
    if (GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.X == -1.0f) 
    { 
     // Player one has pressed the left thumbstick up. 
     Position.X = Position.X - (5 + speedup1); 
    } 

    if (GamePad.GetState(PlayerIndex.One).ThumbSticks.Left.X == 1.0f) 
    { 
     // Player one has pressed the left thumbstick up. 
     Position.X = Position.X + (5 + speedup1); 
    }   

    //updates boost speed, then once boostspeed returns to normal, 
    //begin to update cooldown time 
    if(boosting && speedup1 >= 0) 
    { 
     speedup1 -= someIncrement; 
     if(speedup1 <= 0) 
     { 
      speedup1 = 0 
      boosting = false; 
      coolingDown = true; 
     } 
    } 

    //executes once boost has returned to normal 
    //updates time remaining before you can boost again 
    if(coolingDown) 
    { 
     cooldownTime += gameTime.EllapsedMilliseconds; 
     if(cooldownTime >= timeRequired) 
     { 
      coolingDown = false; 
      cooldownTime = 0; 
     } 
    } 

    //will not execute until the boost has finished AND cooldown has finished 
    if (GamePad.GetState(PlayerIndex.One).Triggers.Right > 0 
     && boosting == false && coolingDown == false) 
    { 
     speedup1 = 5; 
     boosting = true; 
    }   
} 
Смежные вопросы