前回と同じ入力だったらゼロにするアルゴリズム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

前回と同じ入力だったらゼロにするアルゴリズム

#1

投稿記事 by dic » 14年前

メニューの操作方法が、今は入力してから次は5フレームたつまで
常にゼロを返すという仕様にしていたのですが、この5フレームという基準が難しいので
押されたときだけ反応し、押しっぱなしを無効にする方法を試しています

そこで、10個バッファを用意して毎フレームバッファに現在の入力状態を代入していき
押した1フレームだけを有効にし、押しっぱなしの2フレーム以降はゼロにするように
しているソースを書いていますが、思ったとおりに動いてくれません

押しっぱなしは、前回のフレームの入力された状態と比べています
とこかが、うまいぐあいに間違っているのですが、どこだかわかりません
どこがおかしいか、一緒に考えてくれないでしょうか?

使用ライブラリはDxLibです
関数 GetHitKeyStateAll_ は毎フレーム必ず呼び出されます

コード:

void	GetHitKeyStateAll_( char *key )
{
	static	char	key_buff[10][256];
	static	int		index = 1;

	memset( key, 0, sizeof(key) );

	GetHitKeyStateAll( key );

	int	i;
	for( i=0; i<256; i++ )
		key_buff[index][i] = key[i];

	bool	eq = true;
	bool	boost = false;
	if( index == 0 )
		boost = true;
	for( i=0; i<256; i++ )
	{
		//	index-1 が -1のときは index=9を参照
		if( boost )
		{
			if( key_buff[9][i] != key[i] )
			{
				eq = false;
				break;
			}
		}
		else
		{
			if( key_buff[index-1][i] != key[i] )
			{
				eq = false;
				break;
			}
		}
	}

	//	もし前回と同じ入力だったらすべて0にする
	if( eq == true )
		memset( key, 0, sizeof(key) );

	index++;
	if( index >= 10 )
		index = 0;


}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 前回と同じ入力だったらゼロにするアルゴリズム

#2

投稿記事 by softya(ソフト屋) » 14年前

キー数分のカウント配列を作って、押さていたらカウントアップ、離されたら0に戻る。あるいはカウントが5に成れば0に戻るってルールとします。
で、このキー配列に入っている値が1の場合だけ参照するキー配列の値を1それ以外は0ってのでどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

Re: 前回と同じ入力だったらゼロにするアルゴリズム

#3

投稿記事 by dic » 14年前

>>softyaさん
シンプルでわかりやすいですね
おっしゃる通りのやり方で組んでみたら、すぐに解決しました
5フレーム以上の押しっぱなし・・・の処理も追加は楽ですね

ありがとうございました

コード:

void	GetHitKeyStateAll_( char *key )
{
	static	char	key_count[256];	//	カウントアップ用変数

	memset( key, 0, sizeof(char[256]) ); // sizeof( のところが微妙に間違ってました
	GetHitKeyStateAll( key );

	int	i;
	for( i=0; i<256; i++ )
	{
		if( key[i] > 0 )
			key_count[i]++;
		else
			key_count[i] = 0;
	}

	//	代入する
	for( i=0; i<256; i++ )
		key[i] = key_count[i];
}

閉鎖

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