対象の方
- cocos2d-xを用いて開発をしている
- 時間管理を伴うゲーム開発をしている
- サーバプログラムは書きたくない
- そんなに厳密でなくて良い
手順
下記のリポジトリからファイルをコピーして自分のプロジェクトに取り込んでよしなに使う
(cocos2d-x v2.X系のコードになっているので適宜書き換えて使って頂ければ)
下記は画面遷移時にボーナスを付与する使用例(仮に画面をSampleSceneとしてます)
# include "NtpChecker.h"
class SampleScene
: public CCLayer
〜略〜
void bonus(NtpResult result); // コールバック関数の定義
};
void SampleScene::onEnter()
{
〜略〜
// 時間があっているかチェックする
NtpChecker::sharedInstance()->check(this, ntpchecker_selector(SampleScene::bonus));
}
void SampleScene::bonus(NtpResult result)
{
switch(result) {
case NtpResult::OK:
// TODO:ここにボーナス付与の処理を書く
case NtpResult::NG:
// チートしてる可能性あり、懲らしめたい人はなんかやって下さい
case NtpResult::Unknown:
default:
// 通信途絶など
}
}
仕組み
ボーナス付与時に標準時刻と端末の時間を照らし合わせて合っていればボーナスあげるよ、という仕組みになっています、端末時間がずれていればチートの可能性が高いことにしています
最近はデフォルトで端末は標準時刻に合わせるようになっていますしよほどのことがない限りは端末時間がずれるということはありません(海外旅行とか行くとずれますけどね)
詳しい仕組みについてはこちらの記事をご参照下さい
上記の記事でより厳密に対応されているのですが、下記のモチベーションでちょっと調べてました
- iOSしか対応してない、Androidも対応したい
- 依存ライブラリがあるからなくしたい
iOS,Android両対応するためにすべてC++で書きたかったのですが、自分の技術力ではどうにもUDP通信がダルくて色々調べたところ、HTTPで時間がここから取得できることが分かったので書いてみました
HTTPであればcocos2d-xの機能を使えば実現できます
NICTのレスポンスがHTMLだったのでそれを適当にパースして合わせてます。割と長いこと運用されているみたいなのでそんなにフォーマット変わるものでもなさそうなので、まあいいかなーというどんぶり感で作ってます。