FPS設定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
名無し

FPS設定

#1

投稿記事 by 名無し » 15年前

FPSを制御しようとして、龍神録プログラミングの館の43を参考に(というかほぼぶち込み)して
自分のプログラムに組み込んだら、エラーは出ないんですけど、画面に何も出力されなくなって
しまいました。
FPS関数を組み込む前には描画されてたものも描画されなくなってしまったので、
どこかで無限ループが起きてると思うのですが、自分で見てみてもよく分かりません。
変なコメントしてるのは、こうでもしないと見にくいためです。
環境はBCC Developerです。 返答お願いします。
#include "DxLib.h"

#define FLAME 60

//宣言////////////////////////////////////////////////////////////////////////////////////////
char Key[256];
int Graph=LoadGraph("Ziki.png");
int X=320,Y=400;
int color=GetColor(255,255,255);

int fps_count,count0t;   //fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int f[FLAME];            //平均を計算するため60回の1周時間を記録
double ave;              //平均fps

//宣言終//////////////////////////////////////////////////////////////////////////////////////

//FLAME fps になるようにfpsを計算・制御
void fps_wait(){
    int term,i,gnt;
    static int t=0;
    if(fps_count==0){//60フレームの1回目なら
        if(t==0)//完全に最初ならまたない
            term=0;
        else//前回記録した時間を元に計算
            term=count0t+1000-GetNowCount();
    }
    else    //待つべき時間=現在あるべき時刻-現在の時刻
        term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount();

    if(term>0)//待つべき時間だけ待つ
        Sleep(term);

    gnt=GetNowCount();

    if(fps_count==0)//60フレームに1度基準を作る
        count0t=gnt;
    f[fps_count]=gnt-t;//1周した時間を記録
    t=gnt;
    //平均計算
    if(fps_count==FLAME-1){
        ave=0;
        for(i=0;i<FLAME;i++)
            ave+=f;
        ave/=FLAME;
    }
    fps_count = (++fps_count)%FLAME ;
}

//x,yの位置にfpsを表示
void draw_fps(int x, int y){
    if(ave!=0){
        DrawFormatString(x, y,color,"[%.1f]",1000/ave);
    }
    return;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

SetDrawScreen(DX_SCREEN_BACK);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
fps_wait();
draw_fps(0,465);


DrawGraph(X,Y,Graph,TRUE);


ScreenFlip();

}
 
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
WaitKey() ;             // キーの入力待ち(『WaitKey』を使用)  DxLib_End() ;           // DXライブラリ使用の終了処理
return 0 ;              // ソフトの終了
}

Dixq (管理人)

Re:FPS設定

#2

投稿記事 by Dixq (管理人) » 15年前

グローバル変数にこのように入れる事は出来ないです。

int Graph=LoadGraph("Ziki.png");
int color=GetColor(255,255,255);

LoadGraphもGetColorもDXライブラリの関数ですから、DXライブラリを初期化する関数を呼んだ後に呼ぶ必要があります。

後、上記のようなコメントを入れてコードを見やすくするのではなく、関数分けするとか、
字下げを明確にするとか、括弧で挟むなどして可読性を向上させるようにする方が良いのではないかと思います。

また、私が書いておいて申し訳ないのですが、グローバル変数にするなら特徴的な名前にし、他のファイルから参照出来ないようにstatic変数にした方が良いですね。

それとメインループ以外にwhileもforもgotoもありませんから、無限ループする可能性は無いので、
この時点で仮に処理が返ってこないのであれば疑うのはSleep位でしょうか。
もしどこかで処理が止まっていると思うのであればブレイクポイントを置いて確認してみて下さい。

最後に、名無しというお名前は使用されないようにお願いしているお名前ですので
よろしければ何か自分だけの名前を付けて頂けたら幸いです。
詳しくは利用規約をご覧ください >http://dixq.net/board/board.html

EX

Re:FPS設定

#3

投稿記事 by EX » 15年前

すみません。名無しは今後使わないようにします。


>LoadGraphもGetColorもDXライブラリ

なるほど・・・ 忘れてたわけではないけど盲点でした
直しても直接は解決しなかったけど、いろいろいじったら表示されるようになりました。
それと、グローバル変数はちょっとした間に合わせなので、このままでも大丈夫です。
指摘ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る