Re: 入力の保存 ( No.1 ) |
- 名前:いっち 日時:2010/01/28 02:12
こういうことでしょうか?
バックスペースキーの押下でキーの再生を開始します。
#include <list>
#include "DxLib.h"
using namespace std;
struct KEYRECORD {
int frame;
int key;
KEYRECORD( int f = 0, int k = 0 ) : frame( f ), key( k ) { }
};
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE );
if( DxLib_Init() < 0 )
return -1 ;
SetDrawScreen( DX_SCREEN_BACK );
int iFontColor = GetColor( 255, 255, 255 );
int iFrameCount = 0;
int iKeyState = 0, iOldState = 0;
list<KEYRECORD> KeyRec; // キーログ保存領域
// 保存
KeyRec.push_back( KEYRECORD( iFrameCount, iKeyState ) ); // 最初の状態を格納
while( ProcessMessage( ) == 0 && !CheckHitKey( KEY_INPUT_BACK ) ) { // バックスペースで記録終了
iKeyState = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
if ( iKeyState != iOldState ) { // 前回入力と差があれば格納
iOldState = iKeyState;
KeyRec.push_back( KEYRECORD( iFrameCount, iKeyState ) ); // 入力されたフレームとセットで格納
}
ClearDrawScreen( );
DrawFormatString( 0, 0, iFontColor, "保存中 frame=%10d Key=%10d Count=%d", iFrameCount, iKeyState, KeyRec.size( ) - 1 );
ScreenFlip( );
iFrameCount++;
}
KeyRec.push_back( KEYRECORD( iFrameCount, iKeyState ) ); // 最後の状態を格納
int iKeyCount = 0;
iFrameCount = 0;
list<KEYRECORD>::iterator it_next = KeyRec.begin( );
list<KEYRECORD>::iterator it_now = it_next++;
// 再生
while( ProcessMessage( ) == 0 ) {
ClearDrawScreen( );
DrawFormatString( 0, 0, iFontColor, "再生中 frame=%10d Key=%10d Count=%d/%d", iFrameCount, it_now->key, iKeyCount, KeyRec.size( ) - 2 );
ScreenFlip( );
if ( iFrameCount == it_next->frame ) { // 次のキーの再生フレームが来たら
it_now = it_next++; iKeyCount++;
if ( it_next == KeyRec.end( ) ) // ログの終わりまできたら再生終了
break;
}
iFrameCount++;
}
DxLib_End( );
return 0;
}
ソースが長くなってしまうのでSTLを使いました。
キーのログを格納する方法はリストが良いと思いますが、
ある程度の大きさがあれば普通の配列でも何とかなるかもしれません。
|
Re: 入力の保存 ( No.2 ) |
- 名前:いっち 日時:2010/01/28 02:34
配列バージョンも作ってみました。
手抜きなので1024個以上キーを保存すると落ちます。
#include "DxLib.h"
const int LOG_MAX = 1024;
int iLogFrame[LOG_MAX];
int iLogKey[LOG_MAX];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE );
if( DxLib_Init( ) < 0 )
return -1 ;
SetDrawScreen( DX_SCREEN_BACK );
int iFontColor = GetColor( 255, 255, 255 );
int iLogCursor = 0;
int iFrameCount = 0;
int iKeyState = 0, iOldState = 0;
while ( ProcessMessage( ) == 0 && !CheckHitKey( KEY_INPUT_BACK ) ) {
iKeyState = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
if ( iKeyState != iOldState ) {
iLogFrame[iLogCursor] = iFrameCount;
iLogKey[iLogCursor] = iOldState;
iLogCursor++;
iOldState = iKeyState;
}
ClearDrawScreen( );
DrawFormatString( 0, 0, iFontColor, "保存中 frame=%10d Key=%10d Count=%d", iFrameCount, iKeyState, iLogCursor );
ScreenFlip( );
iFrameCount++;
}
iLogFrame[iLogCursor] = iFrameCount;
iLogKey[iLogCursor] = iOldState;
iFrameCount = 0;
int iReplayCount = 0;
while ( ProcessMessage( ) == 0 ) {
ClearDrawScreen( );
DrawFormatString( 0, 0, iFontColor, "再生中 frame=%10d Key=%10d Count=%d/%d", iFrameCount, iLogKey[iReplayCount], iReplayCount, iLogCursor );
ScreenFlip( );
if ( iFrameCount >= iLogFrame[iReplayCount] ) {
iReplayCount++;
if ( iReplayCount > iLogCursor )
break;
}
iFrameCount++;
}
DxLib_End( );
return 0;
}
|
Re: 入力の保存 ( No.3 ) |
- 名前:ぽるふぇ 日時:2010/02/02 21:28
いっちさん、どうもありがとうございました。
色々と忙しく、返信できないで、申し訳ありません。
いっちさんのおかげで、入力の保存、再生ができるようになりましたが、その保存した入力が何なのか表示したいのですが、中々うまくいきません。
さらに、このプログラムでは自動再生をバックスペースで行いますが、その自動再生をジョイパッドで行うにはどうすれば良いでしょうか?
何かいい方法があれば教えてください。
重ね重ね質問して、申し訳ありません。
|
Re: 入力の保存 ( No.4 ) |
- 名前:いっち 日時:2010/02/02 21:36
> おかげで、保存できるようになりましたが、その保存した入力が何なのか表示したいできず、中々うまくいきません。
( No.2 )のソースの以下の部分で
> DrawFormatString( 0, 0, iFontColor, "保存中 frame=%10d Key=%10d Count=%d", iFrameCount, iKeyState, iLogCursor );
> DrawFormatString( 0, 0, iFontColor, "再生中 frame=%10d Key=%10d Count=%d/%d", iFrameCount, iLogKey[iReplayCount], iReplayCount, iLogCursor );
入力の内容(iKeyState、iLogKey[iReplayCount])を表示していますが、それでは駄目なのでしょうか?
> そして、その再生を同じジョイパッドで行うにはどうすれば良いでしょうか?
いまいち何をなさりたいのか良くわからないのですが、
STGのデモプレイを作りたいとかそういった用途ではないのでしょうか?
もしかしたら、DxLibで作ったアプリでキーを保存し、
保存したキーを他のアプリに渡すというキーマクロ的な物を考えておいでなのでしょうか?
|
Re: 入力の保存 ( No.5 ) |
- 名前:ぽるふぇ 日時:2010/02/03 19:44
>もしかしたら、DxLibで作ったアプリでキーを保存し、
>保存したキーを他のアプリに渡すというキーマクロ的な物を考えておいでなのでしょうか?
いっちさんの言う通りです。
自分の作ったプログラムをジョイパッドで動かす為にDXライブラリーを使わせてもらっています。
説明不足で申し訳ありませんorz
ですので、保存したキーで他のプログラムを動かすためのプログラムを作成しているため、キーの入力を一つ一つ認識できる(使用できる必要)があります。
何か良い方法がないでしょうか?
|
Re: 入力の保存 ( No.6 ) |
- 名前:いっち 日時:2010/02/03 21:31
つまり、「ぽるふぇさんが以前作成したプログラムを自動で操作するために、現在、DxLibを利用して、
ジョイパッドのロギング&エミュレータ的なプログラムを作成している」と言う事ですね。
(以前作成なさったプログラムはDirectInputによる操作に対応していると言うことでよろしいでしょうか?)
うーん、難しいですね。そういったことが可能かどうかさえもわかりかねます。
以前作成なさったプログラムがどの様なものかにもよると思いますが、
おそらく、そのプログラム自体にロギング&オートパイロットの機能を
組み込んでしまうのが一番の早道かもしれません。
※すこし修正しました。
|
Re: 入力の保存 ( No.7 ) |
- 名前:ぽるふぇ 日時:2010/02/12 21:08
いっちさん、どうもありがとうございます。
色々と試行錯誤した結果、一からまた、作り上げるという結果になってしまいました(^^;)>
いっちさんの意見を元に現在制作中です。
また、何か質問することがあるかもしれませんが、どうもありがとうございました。
|
|