スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ゲーム制作状況 - 2013/10/24版 -

今日の報告!

なぞときモードをアンロック形式にしてみました。

ストーリーモードで問題が出題されるのですが、
その出題を見るか、ゲームを全クリしないと見れないようにしました。

【参考画像】
Sample_20131024_1.jpg
見れない問題の時に無言になってしまっているので、
「ストーリーモードをクリアするか、問題が出題されたら解けるようになるぞ!」みたいな
コメントを表示させるように修正予定。



このアンロック形式の実装は下記の通り。
-----------------------------------------------------
【1】txt、xlsx、csv、jsonなど、何でも良いので、
   外部データに保存フラグを持たせる。
【2】その外部データを読み込み、何らかの変数にフラグを格納
【3】その変数に基づいて、表示を切り替える

-----------------------------------------------------

読み込み方は、色々あると思うんですが、
自分の場合は、アーカイブファイルをメモリマップドファイルとして開き
そして、ファイル名と実際のデータが読み込まれている場所へのポインタを結び付けて、
後は、その取得したポインタからchar型を取りだしてます。

※メモリドマップファイルとして開く部分は大体こんな感じ。 ↓
(エラー処理は省いて記載してます。)

//ファイルを開く
m_FileHandle = CreateFileA( t_ArchiveFileName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0 );
//ファイルマッピングオブジェクトを作成(読み書き可)
m_MappedFileHandle = CreateFileMapping( m_FileHandle, 0, PAGE_READWRITE, 0, 0, t_ArchiveFileName.c_str() );
//アーカイブファイルへのポインタ取得
m_pFile = (char*)MapViewOfFile( m_MappedFileHandle, FILE_MAP_WRITE , 0, 0, 0);



ポインタから、ファイルの読み込みを行っている箇所はこんな感じです。

CArchiveManager& t_Archive = CArchiveManager::getInstance();
char* t_pFile = t_ArchiveManager.GetPointer( "OptionData.csv" );

if( t_pFile != NULL ){
m_NowLevel = t_pFile[ 0 ] - '0';
m_BGMVolume = t_pFile[ 2 ] - '0';
m_SEVolume = t_pFile[ 4 ] - '0';
}


※上記の場合はcsvファイルなので、 0,1,0,という様な
数値の間には必ずコンマが入ります。

コンマが入るので、偶数番目の文字を読み込むようにしてます。
(下記の様に、奇数番目はコンマのデータになっている。)
----------------------------
0  ← 0番目
,  ← 1番目
1  ← 2番目
,  ← 3番目
0  ← 4番目

----------------------------

読みだす時の注意ですが、 t_pFile[ 0 ]という風にした場合、
あくまでも文字列としての数値が読みだされるので、
文字列としての0を引いて、int型の数値として変数に入れないといけません。

(どこでもいっしょかも知れませんが)自分の環境では、
下記の様になっております。
'0' … 48
'1' … 49
'2' … 50
'3' … 51

つまり上記のソースコードは、下記の様に置き換えられます。

m_NowLevel = t_pFile[ 0 ] - '0';
m_BGMVolume = t_pFile[ 2 ] - '0';
m_SEVolume = t_pFile[ 4 ] - '0';

m_NowLevel = 48 - 48;
m_BGMVolume = 49 - 48;
m_SEVolume = 48 - 48;


それぞれ"数値としての"0,1,0が入る、という寸法です。

データを書き換える場合は、
同様にポインタを使用して、値を入れてやればOKです。
(CreateFileMapping関数で、PAGE_READWRITEを指定する必要あり。)

値を入れてやるときは同様に、
数値としての値ではなく、"文字列としての値"に変換して入れる必要があります。
CArchiveManager& t_Archive = CArchiveManager::getInstance();
char* t_pFile = t_ArchiveManager.GetPointer( "OptionData.csv" );

char t_Char[] = {'0', '1', '2', '3' };
t_pFile[ 0 ] = t_Char[ m_NowLevel ];

上記であれば、t_pFile[ 0 ] = m_NowLevel;という風に、
int型変数をぶち込むのではなくm_NowLevelをchar型配列の添え字として使用し、
char型の値を入れている。


セーブデータなんかの読み書きは
現状こんな感じです。

適宜、jsonとかに置き換えてみたり、
あとLuaとかいうスクリプト言語を採用してみたり
する予定…!
(ちょっと今は新しい事をやっている時間が無い)


【今日のひとこと】
(以前話したかもしれませんが、)
アプリのプログラム側ではない不具合の話。
聞いた話なので、所々事実と異なるかもしれない。

アプリの中には、
「この提携アプリをインストールすると、アプリ内有料通貨が45Gold増えるよ!」
という様なシステムを持たせているアプリがあったりします。

※アプリAがある場合、
「アプリBをインストールすると、アプリAの有料通貨が増えるよ!」という風にしている。


で、ある日起こった異常事態。

~前日~
「あれ…ユーザーの有料通貨が、45000Goldとかになってますよ?
課金決済の履歴はないのに。」
「あぁ、それだけ、アプリをインストールしたんじゃないかな。
提携アプリを落とせば有料通貨が少しもらえるし。
(でも そんなにダウンロードするか…?)」

~次の日~
「ユーザーの有料通貨が、105000Goldとかになってます!!」
「ゲームバランスが崩壊します…!」
バカな!明らかにおかしい、どうなっている…!?」


さて、いったい何が起こったのか。


その時、auスマートパスというのが開始されました。
これは、総額5万円分相当のアプリが月額390円で使い放題になる
というサービスらしい。

仮に、月額390円で、ダウンロード45円のアプリBが使い放題になったらどうなるか。

使い放題なので、ダウンロードの際にアプリの価格は(おそらく)かかりません。
月額390円払えば、

ダウンロード ⇒ 削除 ⇒ ダウンロード ⇒ 削除 ⇒ ダウンロード ⇒ 削除

という動作が可能になります。
アプリAの有料通貨を、月額390円以上に増やしまくる事が可能になってしまったのです。

今は対処されてるっぽいですが、
アプリ自体に不具合は無くても、関連サービスなんかでこんな不具合も発生する、
という事例でした。

ここら辺は、注意しないといけないですね(- -;)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。