Re: スコアの記録 ( No.1 ) |
- 名前:けいし 日時:2009/11/09 13:11
アトリエミュート開発担当、けいしと申します。
以下の関数をプログラムに追加し、
RefreshScore(スコア);
のように呼び出すと、スコアがハイスコアとして更新されます。
もちろん、今までのハイスコアより低ければ、更新はされません。
どうでしょうか。
#include <stdio.h>
void RefreshScore(int score)
{
FILE* fp;
int hiscore;
fp = fopen("score.txt", "r");
if(fp != NULL)
{
fscanf(fp, "%d", &hiscore);
fclose(fp);
}
if(fp == NULL || hiscore < score)
{
fp = fopen("score.txt", "w");
fprintf(fp, "%d", score);
fclose(fp);
}
}
|
Re: スコアの記録 ( No.2 ) |
- 名前:けいし 日時:2009/11/09 13:15
追加。
以下は、今までのハイスコアを取得する関数です。
int hiscore = GetHiScore();
のように呼び出すと、hiscoreにハイスコアが代入されます。
#include <stdio.h>
int GetHiScore(void)
{
FILE* fp = fopen("score.txt", "r");
int hiscore;
if(fp == NULL)
return 0;
fscanf(fp, "%d", &hiscore);
fclose(fp);
return hiscore;
}
|
Re: スコアの記録 ( No.3 ) |
- 名前:sk 日時:2009/11/11 00:04
>けいしさん
丁寧にありがとうございます。
えっと、上記ふたつのプログラムをゲームオーバー時の処理のときに続けて書けば良いんですか?
普通に続けて書いたらエラーが出てしまってよくわかりません。。
|
Re: スコアの記録 ( No.4 ) |
- 名前:ゆう 日時:2009/11/11 07:35
横槍すみませんが、
けいしさんの書いているプログラムは
解りやすい簡単なものなので、
どういう処理を行っているか自分で考えてみると
勉強になって良いと思いますよ。
|
Re: スコアの記録 ( No.5 ) |
- 名前:けいし 日時:2009/11/11 23:28
>どういう処理を行っているか自分で考えてみると
>勉強になって良いと思いますよ。
余力があれば、ゆうさんの仰るように、
自分で消化してみると良いと思います。
ですが、まずは動かしたいですよね。
ということで、少し説明を。
skさんがどこまで解っているのか判らないので、
一応基礎的なところから全部書きます。
ポイントは、3つです。
1.C言語のプログラムは、「関数」というものが集まって出来ている。
2.「関数」は、処理をひとまとめにしたもので、必要に応じて「呼び出す」ことができる。
3.「呼び出す」命令は、呼び出す関数よりも後に書かなければならない。
skさんのプログラムを探すと、
「WinMain」か「main」のどちらかがあると思います。
これはメイン関数と呼ばれ、一番最初に呼び出される「関数」です。
そして、メイン関数の処理を終えると、プログラムは終了してしまいます。
なので、メイン関数の中にゲーム全体の処理を書くか、必要に応じて別の関数を呼び出すかする必要があります。
ちなみに、メイン関数内で「DxLib_Init()」とも書いていると思いますが、
これが「別の関数の呼び出し」になります。
補足すると、
関数自体を作るときは、
int 関数名(...)
{
ここに中身;
}
のように長ったらしく書き、
呼び出すときは
関数名(...);
のように書きます。
さて、ここからがいよいよ質問の答えとなるわけですが、
僕が書いた2つの関数
void RefreshScore(int score)
{
略
}
int GetHiScore(void)
{
略
}
は、関数自体の記述なので、
メイン関数と同列に書く必要があります。
そして、ポイント3で言った通り、
呼び出す命令よりも前に中身を書く必要があるので、
void RefreshScore(int score)
{
略
}
int GetHiScore(void)
{
略
}
int WINAPI WinMain(略)
{
この辺にゲームのプログラムを書いてる?
ゲームオーバー処理もこの辺?
← ここでハイスコア処理を呼び出したい!
}
こんな感じに書けば良いと思います。
#include <stdio.h>
は、
#include "DxLib.h"
の辺りに1つだけ追加すればOKです。
で、肝心のハイスコア処理をしたいなら、
1つ目の僕の書き込みで書いたように、
RefreshScore(スコア);
をプログラムに書けば良いです。つまり、
int WINAPI WinMain(略)
{
この辺にゲームのプログラムを書いてる?
ゲームオーバー処理もこの辺?
RefreshScore(スコア);
}
という感じ。
「スコア」の部分には、スコアを入れている変数
とかを入れて下さい。
RefreshScore(score);
のように。
以上、非常に長くなってしまいましたが、
この通り書けば動くと思います。
「関数」の概念は非常に重要ですので、
暇があれば解説サイト等を見てみるのも良いと思いますよ><
|
Re: スコアの記録 ( No.6 ) |
- 名前:sk 日時:2009/11/12 00:02
>けいしさん
すごく詳しい解説ありがとうございます。
おかげでちゃんとハイスコアを実装することができました。
でも、エラーではないのですが警告が5つでてきてしまうようになってしまいました。
fopenやfscanfの宣言を確認してください、みたいな警告が5つほどです。
|
Re: スコアの記録 ( No.7 ) |
- 名前:けいし 日時:2009/11/12 00:07
忘れていました><
fopen、fscanf
のように警告の出た関数は、
fopen_s、fscanf_s
のように、「_s」を付けて書き換えてみて下さい。
もしかしたら引数も変わってるかもしれませんが><
まあ警告は出ても、実害は無いので、
気にならなければ放置しても大丈夫です。
|