暇だったので作ってみました。
コード:
#include "DxLib.h"
unsigned int stateKey[256];
//fps
#define FLAME 60
//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int fps_count,count0t;
//平均を計算するため60回の1周時間を記録
int f[FLAME];
//平均fps
double ave;
//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[i];
ave/=FLAME;
}
fps_count = (++fps_count)%FLAME ;
}
//x,yの位置にfpsを表示
void draw_fps(int x, int y){
if(ave!=0){
DrawFormatString(x, y,GetColor( 255, 255, 255 ),"[%.1f]",1000/ave);
}
return;
}
int GetHitKeyStateAll_2(){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) stateKey[i]++;
else stateKey[i]=0;
}
return 0;
}
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
return 0;
}
void ValueUP(int &value,unsigned char key)
{
unsigned int pushcount[]={1,60,100,130,150,160,165,170,175,180};
for(int i=0;i<10;i++){
if(stateKey[key]<pushcount[i])
return;
if(stateKey[key]==pushcount[i])
break;
}
value++;
}
void ValueDOWN(int &value,unsigned char key)
{
unsigned int pushcount[]={1,60,100,130,150,160,165,170,175,180};
for(int i=0;i<10;i++){
if(stateKey[key]<pushcount[i])
return;
if(stateKey[key]==pushcount[i])
break;
}
value--;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
int Value=0;
ChangeWindowMode( TRUE ); // ウィンドウモードに設定
DxLib_Init(); // DXライブラリ初期化処理
while(ProcessLoop()==0){
ValueUP(Value,KEY_INPUT_UP);
ValueDOWN(Value,KEY_INPUT_DOWN);
DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "%d", Value);
draw_fps(0,465);//fps表示
fps_wait();//フレームの待機を計算
}
DxLib_End() ; // DXライブラリ終了処理
return 0 ;
}
ValueUPとValueDownがそれです。他の関数は、龍神録からコピーしました。
スピードは 配列の値を変えてください。60が1秒ですね。