ページ 11

ちょっとレベルの高いスコア表示の仕方

Posted: 2009年7月28日(火) 08:03
by kai
改造龍神録のことですが
例えば、スコアアイテムを取ったらch.score+=5000;
としたら、スコアの表示は4桁目だけが動きます。
ただ、最近東方をやってみて分かったのですが
東方では点アイテムを取ったら+1000されるとしたら
スコアの表示が1桁目から計算されて
1~4桁目の表示が動きます。
このように実装したいのですが計算式などが分からず・・困ってます・・
どのようにしたらこのような表示ができるのでしょうか?
アドバイスお願いします。

Re:ちょっとレベルの高いスコア表示の仕方

Posted: 2009年7月28日(火) 09:06
by ねこ
実際のスコアと表示するスコアを別変数に保持する事で実装できます。

int real_score = 0, disp_score = 0;
のように二つ変数を用意しておいて、スコアはreal_scoreに加算しておきます。
そして、ループ処理の中に
// 表示スコアが実際のスコアより小さい時
if( disp_score < real_score ){
	// 100点ずつ加算
	disp_score += 100;
	// 実際のスコアを超えたら同じ値にする
	if( disp_score > real_score )
		disp_score = real_score;
}
というようにすると、スコアがあがってからしばらくは100点ずつ増えます。
これを10点ずつや11点ずつにするとスコアがどんどん回転して増え続けるような感じに見せることが出来ます。

Re:ちょっとレベルの高いスコア表示の仕方

Posted: 2009年7月29日(水) 20:43
by kai
ということは実際に表示するのは
disp_score
のほうを表示すればいいのでしょうか?

Re:ちょっとレベルの高いスコア表示の仕方

Posted: 2009年8月01日(土) 23:44
by kai
東方は+1000点でも+100000点の時でも
同じ時間でカウンタが動いてるように見えるんですけど、
これは特殊な関数か何かを使ってるんでしょうか?

Re:ちょっとレベルの高いスコア表示の仕方

Posted: 2009年8月02日(日) 00:07
by チルチル
見た感じ星蓮船では
10,1010,1001010
のような単位で加算しているようですね
これはfor文を使えば簡単に似せる事ができます
まあ同じ方法を使わないと完全に同じにはなりませんが・・

Re:ちょっとレベルの高いスコア表示の仕方

Posted: 2009年8月02日(日) 00:07
by array
特殊な関数は使っていないと思います。
同じ時間でカウンタが動くという事は、加算値が違うということになるので

ねこさんのプログラムを拝借すると
#define SCORE_TIME 100    // スコアを加算するカウント

// 表示スコアが実際のスコアより小さい時
if( disp_score < real_score ){
	int add_score = real_score - disp_score;

	disp_score += add_score / SCORE_TIME;
	// 実際のスコアを超えたら同じ値にする
	if( disp_score > real_score )
		disp_score = real_score;
}
 
この様な形にしてはどうでしょうか、int型で割り算を行うので少数は切り捨てになるので注意が必要ですが
ある程度同じ時間で加算してくれると思います。

Re:ちょっとレベルの高いスコア表示の仕方

Posted: 2009年8月02日(日) 18:00
by kai
disp_score += add_score / SCORE_TIME;
の部分は
disp_score += add_score / SCORE_TIME + SCORE_TIME;
にしたほうがいいかも?
ともあれ
ねこさん、チルチルさん、arrayさん
アドバイスありがとうございます。
とても参考になりました。
おかげさまで無事実装できました。
ありがとうございました!

ジャンプ

Posted: 2009年8月17日(月) 16:12
by 研修生
ゲームプログラミングの館のジャンプの所のサンプルで
#include "DxLib.h"
#include <math.h>
 
#define g 9.8067
#define y_max 2.000
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;          // ウインドウモードに変更
        if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了 
 
        int x=320,y=480,image[16],time1,time2,flag=0;
        double t;                                    
        char Key[256];
 
        SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に設定
 
        LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
                                
        while(1){
                ClearDrawScreen();//裏画面のデータを全て削除
                GetHitKeyStateAll( Key ) ;           // すべてのキーの状態を得る
                if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
 
                if( Key[ KEY_INPUT_RETURN ]  == 1 ){ //エンターが押されたら
                        time1 = GetNowCount();           //time1にエンターが押された時の時間を格納
                        flag=1;                          //飛び上がりフラグを立てる。
                }
                if(flag==1){
                        time2 = GetNowCount() ;                  // 現在経過時間を得る
                        t = (double)(time2 - time1) / 1000.000;  // ミリ秒を秒に変換して、エンターが押されてからの経過時間を計算
                        y = (int)((sqrt ( 2.000 * g * y_max) * t - 0.500 * g * t * t ) * 480.000 / y_max);//y座標を計算
                        if(y>=0)                  // 1回目に回って来たか、画面内にy座標がある時
                                DrawGraph( x , 480-y , image[8] , TRUE );//画像を描画
                        else
                                flag=0;                              // 画面外に来ると、飛び上がりフラグを戻す
                }
        
                if( Key[ KEY_INPUT_ESCAPE ]  == 1 ) break;   //Escボタンが押されたらブレイク
 
                ScreenFlip() ;                               //裏画面データを表画面へ反映
        }
        DxLib_End() ;                                    // DXライブラリ使用の終了処理
        return 0 ;                                       // ソフトの終了
}
これが実行してもジャンプの画像が全くでてこないんですが、見たところずっとyの所がマイナスになっているようでして・・分かる人いませんか?

Re:ジャンプ

Posted: 2009年8月17日(月) 16:34
by 研修生
思いっきりミスしてました。自己解決しました。