gpt4 book ai didi

c++ - Allegro 能否在运行时更新操纵杆的数量?

转载 作者:行者123 更新时间:2023-11-28 03:34:35 26 4
gpt4 key购买 nike

除了不断调用 remove_joystick() 然后 install_joystick 之外,有没有办法更新运行时插入的操纵杆数量?这被证明是非常慢的(从 60 FPS 到大约 5)。

只请 Allegro 4.2 回答...

void Joystick::Update() {
//If joystick input was lost, attempt to reacquire.
if(GetNumJoysticks() == 0) {
throw InputNotAvailableException("Joystick");
}
//If all joysticks were deleted remove input and do nothing.
if(_numjoysticks == 0) {
remove_joystick();
return;
}

//Update state information
if(poll_joystick() < 0) {
throw InputNotAvailableException("Joystick");
}
for(int i = 0; i < _numButtons; ++i) {
_prevButtons[i].b = _curButtons[i].b;
_prevButtons[i].name = _curButtons[i].name;

_curButtons[i].b = joy[_joyNumber].button[i].b;
_curButtons[i].name = joy[_joyNumber].button[i].name;
}
for(int i = 0; i < _numSticks; ++i) {
for(int j = 0; j < joy[_joyNumber].stick[i].num_axis; ++j) {
_prevSticks[i].axis[j].name = _curSticks[i].axis[j].name;
_prevSticks[i].axis[j].pos = _curSticks[i].axis[j].pos;
_prevSticks[i].axis[j].d1 = _curSticks[i].axis[j].d1;
_prevSticks[i].axis[j].d2 = _curSticks[i].axis[j].d2;

_curSticks[i].axis[j].name = joy[_joyNumber].stick[i].axis[j].name;
_curSticks[i].axis[j].pos = joy[_joyNumber].stick[i].axis[j].pos;
_curSticks[i].axis[j].d1 = joy[_joyNumber].stick[i].axis[j].d1;
_curSticks[i].axis[j].d2 = joy[_joyNumber].stick[i].axis[j].d2;
}
_prevSticks[i].flags = _curSticks[i].flags;
_prevSticks[i].name = _curSticks[i].name;

_curSticks[i].flags = joy[_joyNumber].stick[i].flags;
_curSticks[i].name = joy[_joyNumber].stick[i].name;
}
}
int Joystick::GetNumJoysticks() {
remove_joystick();
if(install_joystick(JOY_TYPE_DIRECTX)) {
return 0;
}
return (num_joysticks);
}

最佳答案

4.x 系列没有。 5.x 系列可以。

您必须使用自定义平台特定代码(假设存在此类事件)监听 native 操作系统事件,并且仅在检测到更改时调用 Allegro deinit/init 函数,或者要求用户手动启动操纵杆刷新。

在 Linux 下,您可以使用 inotify_add_watch()/dev/input 来检查更改。查看 4.4 Allegro 代码,您似乎想要调用 Win32 函数 joyGetNumDevs()joyGetPos()。像这样的东西:

int WIN_MAX_JOYSTICKS = joyGetNumDevs(); // this should never change
JOYINFO ji;
int pluggedin_count = 0;
for (int i = 0; i < WIN_MAX_JOYSTICKS; ++i)
if (joyGetPos(i, &ji) == JOYERR_NOERROR) ++pluggedin_count;

if (pluggedin_count != last_pluggedin_count) /* reinit Allegro */

您必须每 N 秒执行一次。

这些 joy* 函数是 Windows 函数,因此请阅读 MSDN 文档以了解如何使用它们。

关于c++ - Allegro 能否在运行时更新操纵杆的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com