2016-07-01 2 views
1

Предположим, что я разрабатываю игру, и существует такая вещь, как респаун. Пользователь может возобновиться через 15 минут. Есть ли распространенная практика, чтобы избежать обмана времени? Я имею в виду, ничто не может остановить пользователя от изменения системного времени и установить его в будущем. Я знаю, частично это можно решить, используя серверную часть, но ничто не может помешать пользователю отключить сеть вообще. PS. игра - кросс-платформа, поэтому решение интересно как для Android, так и для iOS. PS2. Я знаю пару игр, в которых есть решение.Timer anti cheat technique

ответ

1

Для чего-то подобного вы можете просто начать свой собственный таймер полностью отдельно от системного времени. Если вы начнете отсчет времени на 15 минут, когда игрок умрет, они не смогут изменить ваш внутренний таймер. Я не так хорошо знаком с прошивкой разработчика (NSTimer выглядит как возможность), но я знаю, что в Android это так же просто, как:

// create 30 second internal countdown timer 
new CountDownTimer(30000, 3000) { 

public void onTick(long millisUntilFinished) { 
    // store time remaining in database every 3 seconds in case user exits the game 
    dbHelper.updateDeathTimer(millisUntilFinished); 
} 

public void onFinish() { 
    // player respawns now 
} 
}.start(); 

Для борьбы с проблемой игроков закрытия игры, которую я хотел бы предложить вам также настроить ваш внутренний таймер для кэширования своего текущего состояния в базе данных с регулярным интервалом, скажем, каждые 30 секунд или около того, если вы собираетесь придерживаться 15-минутного таймера.

Ниже приведен какой-то псевей-код, который может выглядеть, когда игрок выходит из игры, пока они мертвы, и наш респаун-таймер все еще продолжается.

// When game resumes check database and begin updated death timer if necessary 
onGameResume() { 
    if(dbHelper.isUserDead()) { 
     // resume respawn timer 
     new CountDownTimer(dbHelper.getRespawnTime(), 15000) { 

      public void onTick(long millisUntilFinished) { 
      // store time remaining in database every 15 seconds in case user exits the game 
      dbHelper.updateDeathTimer(millisUntilFinished); 
      } 

      public void onFinish() { 
      // player respawns now 
      } 
     }.start(); 
    } 
} 
+0

Это хорошая идея, но если приложение убито пользователем - это не сработает. верный? – DeepThought

+0

@DeepThought Чтобы бороться с этим, вам нужно будет скрыть текущее состояние таймера в каком-то постоянном хранилище (БД) до закрытия приложения. И затем, конечно, загрузите и возобновите таймер, когда приложение (или конкретная игра в приложении) будет возобновлено. – bwegs

+0

это не поможет мне определить, сколько времени приложение было неактивным. – DeepThought

0

Вы можете сохранить время события (икру в вашем случае), а затем запустить timeIntervalSinceReferenceDate против него и посмотреть, если она превышает лимит (15 минут).

Риск со стороны iOS заключается в том, что приложение переходит на задний план и таймеры останавливаются.