CSFML - 切换输入问题

问题描述 投票:0回答:1

所以我试图自己制作一个完整的游戏,并且我进入了制作库存的部分。我想在 E 键上进行切换输入以打开库存,但是当我在游戏中尝试该功能时,有时当我按 E 时,我的库存会同时打开和关闭,有时当它打开时,它不会当我按E时,它不会关闭,但是当我再次按E时,它会关闭。

代码如下: ` int isOpen = 库存->isOpen;

if (inventory->isOpen == NO && sfKeyboard_isKeyPressed(sfKeyE)) {
    openInventory(inventory);
    inventory->isOpen = YES;
    return;
}
if (isOpen == YES && sfKeyboard_isKeyPressed(sfKeyE)) {
    closeInventory(inventory);
    inventory->isOpen = NO;
    return;
}`

我尝试用 0.10f 的刻度来同步 sfClock 上打开的库存,就像我用来为播放器精灵设置动画的刻度一样,但仍然不起作用。

有办法解决这个问题吗?

感谢您的阅读!

c toggle sfml 2d-games
1个回答
0
投票

按下该键时,您的库存屏幕可能会反复打开和关闭。这是因为以下原因。

在循环的第一次迭代中,按下键并且库存屏幕未打开,因此它被打开。

在循环的第二次迭代中,仍然按下键,并且库存屏幕打开,因此它被关闭。

迭代听起来只有 0.01 秒的间隔,并且因为 sfKeyboard_isKeyPressed 只是键盘的 current 状态,所以您需要手动检测何时新按下一个键。 (无论如何,对于这样的事情,角色移动通常可以基于当前状态。)

您应该存储按键的先前状态,并且仅在按键从未按下变为按下时才执行库存打开/关闭逻辑。例如:

bool previousKeyState = false;

// main loop
{
    keyState = sfKeyboard_isKeyPressed(sfKeyE);

    if ((!previousKeyState) && (keyState))
    {
        if (inventory->isOpen == NO) {
        // etc
        }
    }

    previousKeyState = keyState;
}
© www.soinside.com 2019 - 2024. All rights reserved.