いつもDxLibを使わせてもらっています、platypusと申します。
タッチパネルを使う音楽ゲームを開発しているのですが、
10点タッチに対応しているSurface Pro 4で
複数(大体8本以上)の指を使って高速で連打すると、
2重反応やラグのようなものが発生しました。
関数リファレンス上のGetTouchInputNumのサンプルソースも
試してみたのですが、同様の現象が発生します。
ハードウェアの仕様かと思い、
連打を要求しないゲーム設計で我慢していたのですが、
先日Windows 10に標準で搭載されているペイントソフトで
高速連打を試したところ、ラグが全くなかったため、
少なくとも原因はコンピューターにないことがわかりました。
以上から、DxLibまたはDxLibが依存しているWindows関連のプログラムに
ラグの原因があるのではと踏んでいます。
できればこの現象を修正していただけると幸いです。
最後に、蛇足かと思いますが、
各タップの座標・長押しされたフレーム数・IDを
printfDxで出力するソースコードを載せたいと思います。
#define APPENDをコメントアウトすると関数レファレンスの
サンプルソースと同じ動作をします。
#include "DxLib.h"
#include <map>
//追加プログラムを動作させたい場合はAPPENDを#defineしてください
#define APPEND
//タップデータを管理する構造体
//x,y=座標 frame=タッチされたフレーム数
struct Tap
{
int x, y,frame;
Tap() = default;
Tap(int x_, int y_, int frame_) { x = x_; y = y_; frame = frame_; }
Tap(Tap&) = default;
};
// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//タップデータの集合
std::map<int, Tap>tap;
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// メインループ
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == FALSE)
{
// 画面のクリア
ClearDrawScreen();
clsDx();
#ifdef APPEND
//タップデータの一時的な保管場所
std::map<int, Tap> temp_tap;
// タッチされている箇所の数だけ繰り返し
for (int i = 0; i < GetTouchInputNum(); i++)
{
int PosX, PosY, ID;
// タッチされている箇所の座標を取得
GetTouchInput(i, &PosX, &PosY, &ID, NULL);
//全フレームのタッチデータの中からタッチIDを探す
if (tap.find(ID) == tap.end())
{
//見つからない;
/*
std::pair<const int, Tap> temp_p(ID, Tap(PosX, PosY, 1));
tap.insert(temp_p);
*/
temp_tap[ID] = Tap(PosX,PosY,1);
}
else
{
//見つかる
temp_tap[ID] = Tap(PosX,PosY,tap[ID].frame+1);
}
}
//データを反映
tap = std::move(temp_tap);
for (auto& t_ : tap)
{
auto& t = t_.second;
// タッチされている箇所の座標に円を描画
DrawCircle(t.x, t.y, 40, GetColor(255, 255, 255), TRUE);
//タッチ個所の座標、タッチされたフレーム数、タッチIDを表示
printfDx("%d %d %d ID:%d\n", t.x, t.y, t.frame, t_.first);
}
#else
int PosX, PosY;
// タッチされている箇所の数だけ繰り返し
for (int i = 0; i < GetTouchInputNum(); i++)
{
// タッチされている箇所の座標を取得
GetTouchInput(i, &PosX, &PosY, NULL, NULL);
// タッチされている箇所の座標に円を描画
DrawCircle(PosX, PosY, 40, GetColor(255, 255, 255), TRUE);
}
#endif
// 裏画面の内容を表画面に反映
ScreenFlip();
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
よろしくお願いします。