2014-02-05 4 views
1

У меня есть возможность для игрока. Я хочу, чтобы игрок мог использовать эту способность каждые 5 секунд. Я всегда могу поставить это в моей игре цикла:Способность восстановления в MonoGame

Update(GameTime gameTime) 
{ 
    GamePadState controller = GamePad.GetState(PlayerIndex.One); 
    cooldown--; 
    if(cooldown <= 0 && controller.Buttons.A == ButtonState.Pressed) 
    { 
     UseAbility(); 
     cooldown = 5000; 
    } 
} 

Но я ищу что-то, что будет ровно 5 секунд (в отличие от 5000 обновлений() 'ы), и я хотел бы что-то более изящное, чем этот варвар код. Какие-либо предложения? Благодаря!

ответ

2

Вы можете использовать переменную GameTime. Вы могли бы попробовать что-то вроде этого:

float cooldowntime = 0; 
Update(GameTime gameTime) 
{ 
    GamePadState controller = GamePad.GetState(PlayerIndex.One); 

    cooldowntime += gameTime.ElapsedGameTime.TotalMilliseconds; 
    //if you are using XNA 3.1 or earlier, use GameTime.ElapsedRealTime 

    if(cooldowntime >= 5000 && controller.Buttons.A == ButtonState.Pressed) 
    { 
     UseAbility(); 
     cooldowntime = 0; 
    } 
} 

Используя это, каждый метод обновления, то cooldowntime получит истекшее Gametime в миллисекундах добавленными к нему (если вы используете XNA 3.1, вы можете использовать ElapsedRealTime, что время в «реальной жизни». Это было бы полезно, если бы вы получили менее 60 кадров в секунду). Тогда, если cooldowntime больше 5000 мс (5 секунд), способность будет включена для одного метода обновления. Если вы хотите быть точнее, чем GameTime.ElapsedGameTime.TotalMilliseconds, вы можете использовать, например, Stopwatch или DateTime.Now. HTH

Примечание: если вы получаете ровно 60 кадров в секунду на обновление, ElapsedGameTime должно быть абсолютно точным.

EDIT: Чтобы уменьшить линии, используемые, попробуйте это:

float cooldowntime = 0; 
Update(GameTime gameTime) 
{ 
    GamePadState controller = GamePad.GetState(PlayerIndex.One); 

    cooldowntime = (cooldowntime >= 5000 && controller.Buttons.A == ButtonState.Pressed) ? 0 : cooldowntime + gameTime.ElapsedGameTime.TotalMilliseconds; 
    if (cooldowntime == 0) UseAbility(); 
    // we know to use the ability if cooldowntime = 0 since it will only equal zero 
    // when cooldowntime >= 5000 and the button is pressed. 
} 
+0

Upvote для исправления проблемы синхронизации. Какие-нибудь идеи по очистке кода немного? (В этом примере это неплохо, но в моей игре этот метод довольно запутан.) – Evorlor

+0

Не могли бы вы объяснить, что вы имеете в виду, довольно грязно? Является ли переменная 'cooldowntime', что делает ее грязной? – davidsbro

+0

Да, я надеялся найти однострочный для моего заявления if. В противном случае у меня есть 20 дополнительных переменных для отслеживания. Это не огромная сделка, но у меня уже есть кластер **** с моим кодом. Надеюсь, у него есть один хороший элемент :) – Evorlor

1

простой процедуру, просто вызовите его с числом миллисекунд, которые необходимо подождать, на стороне вызова просто сделать, если заявление как: -

if(DelayGame(gameTime, 5000)) 
{ 
    // after 5 seconds 
    // do this 
} 

здесь: -

private static bool delayFlag = false; 
private static double delayTime = 0; 

public static bool DelayGame(GameTime gameTime,int milliSeconds) 
{ 
    if(delayFlag) 
    { 
    if(gameTime.TotalGameTime.TotalMilliseconds >= delayTime) 
    { 
     delayFlag = false; 
     return true; 
    } 
    } 
    else 
    { 
    delayFlag = true; 
    delayTime = gameTime.TotalGameTime.TotalMilliseconds + milliSeconds; 
    } 
    return false; 
} 

Я использовал статический везде, поэтому вам не придется беспокоиться, где вы его называете, наслаждаться и делать отличные игры

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