滑らかに数値を増減させたい

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

滑らかに数値を増減させたい

#1

投稿記事 by ろきち » 13年前

お決まりのwhile文の中に以下のプログラムがあります。

コード:

if( CheckHitKey(KEY_INPUT_UP) == 1 ) Value++;
if( CheckHitKey(KEY_INPUT_DOWN) == 1 ) Value--;
DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "%d", Value);
 

UPキーを1秒間長押しするとValueが60進みますが、滑らかに数値を増減させるにはどうすればよいでしょうか。
うまく言えませんがキーを長く押せば押すほど増減のスピードを早くして短く押せば1ずつ増減させるようにしたいのです。
Valueの初期値が0とした場合、UPを長押しするとこんなイメージです。

   1秒   |    2秒   |    3秒   |    4秒   |         ←UPキーを長押ししている時間
11111111111222222222333333344444555566677889...    ←Valueの値

ぴったり上の通りにしなければいけないわけではありません。
よろしくお願い致します。

史上最悪のデスペナ
記事: 521
登録日時: 15年前

Re: 滑らかに数値を増減させたい

#2

投稿記事 by 史上最悪のデスペナ » 13年前

簡単な方法としては、

コード:

if( CheckHitKey(KEY_INPUT_UP) == 1 ) Count++;
if( CheckHitKey(KEY_INPUT_DOWN) == 1 ) Count--;

Value = Count*Count*5 //5は増やす割合にあわせて変える。ゆっくり増やすなら0.1とか
DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "%d", Value);
というのがぱっと思いつきましたがどうでしょう?

もしくは、1秒間押したら1増え、2秒間だと2増え、と決まっているのであれば、経過時間を取得してという方法もありますが

ゆうたろう

Re: 滑らかに数値を増減させたい

#3

投稿記事 by ゆうたろう » 13年前

↓ここが参考になります
http://dixq.net/g/s_02.html

non
記事: 1097
登録日時: 15年前

Re: 滑らかに数値を増減させたい

#4

投稿記事 by non » 13年前

暇だったので作ってみました。

コード:

#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秒ですね。
non

アバター
nullptr
記事: 239
登録日時: 14年前

Re: 滑らかに数値を増減させたい

#5

投稿記事 by nullptr » 13年前

コード:

float speed = 1.f;
bool flag = true;
while( true )
{
    if( CheckHitKey(KEY_INPUT_UP) == 1 )
    {
        if( !flag ){ flag = true; speed = 1.f }
        speed*=1.1f;
        value += static_cast<int> ( speed );
    }
    if( CheckHitKey(KEY_INPUT_DOWN) == 1 )
    {
        if( flag ){ flag = false; speed = 1.f }
        speed*=1.1f;
        value -= static_cast<int> ( speed );
    }
    DrawFormatString( 0, 0, GetColor( 255, 255, 255 ), "%d", Value);
}
自分のプロジェクトではこんなコードじゃないですが手っ取り早くすればこんなんでも
(ただし試してないので望まれた挙動かは不明
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 滑らかに数値を増減させたい

#6

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

これは、「速度」と「加速度」という概念を取り入れたら簡単ですよ。

物理を既に習われたかどうか分かりませんが、
位置xに対して速度vで進んでいる物体が加速度aで加速している時、
難しい物理の公式を使わなくても以下の簡単な計算だけで実現可能です。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	float x=0, v=0, a=0.001;

	while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()){

		x += v;
		v += a;

		DrawFormatString(0,0,GetColor(255,255,255),"%d",(int)x);
	}


	DxLib_End();			//ライブラリの終了処理
	return 0;
} 
早さはaの値を変えれば調整できます。

ろきち

Re: 滑らかに数値を増減させたい

#7

投稿記事 by ろきち » 13年前

みなさんご回答ありがとうございました。
参考にさせていただきます。

閉鎖

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