首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测“任意按钮按”

检测“任意按钮按”
EN

Game Development用户
提问于 2013-08-05 02:03:19
回答 5查看 3K关注 0票数 11

我试图让播放器按下任何按钮继续从主页。我之所以能够做到这一点,是因为我列出了一个按钮列表,然后循环这些按钮,并检查其中一个按钮是否已经关闭;然而,我觉得这段代码有点难看,我想知道是否有一种更简单的方法可以做到这一点,而我并不是这么想的?

下面是我的代码现在的样子:

代码语言:javascript
运行
复制
            if (GamePad.GetState(PlayerIndex.One).IsConnected)
            {
                var buttonList = new List<Buttons>()
                {
                    {Buttons.A},
                    {Buttons.B},
                    {Buttons.Y},
                    {Buttons.X},
                    {Buttons.Start},
                    {Buttons.Back},
                    {Buttons.RightShoulder},
                    {Buttons.LeftShoulder},
                    {Buttons.RightTrigger},
                    {Buttons.LeftTrigger}
                };

                foreach (var button in buttonList)
                {
                    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
                        ExitMainMenu= true;
                }
            }
EN

回答 5

Game Development用户

回答已采纳

发布于 2013-08-05 05:05:41

这应该能胜任这份工作。在每个更新循环的末尾,保存previousGamePadState的状态。然后你就可以比较它们了。这是快速检测更改的方法。不需要循环。

GamePadState.PacketNumber

可以使用PacketNumber确定输入状态是否已更改。如果PacketNumber的值在对GetState的两个顺序调用之间保持不变,那么输入没有变化。

代码语言:javascript
运行
复制
public bool HasInputChanged(GamePadState previousGamePadState, bool ignoreThumbsticks)
{ 
    GamePadState currentState = GamePad.GetState( PlayerIndex.One );
    if ((currentState.IsConnected) && (currentState.PacketNumber != previousGamePadState.PacketNumber))
    {
        //ignore thumbstick movement
        if ((ignoreThumbsticks == true) && ((currentState.ThumbSticks.Left.Length() != previousGamePadState.ThumbSticks.Left.Length() )&&(currentState.ThumbSticks.Right.Length() != previousGamePadState.ThumbSticks.Right.Length()) ))
            return false;
        return true
    }
    return false;
}

编辑:更改为方法。它不能保证按原样工作,但应该能正常工作。另外,因为这真的可以检测到输入的变化,所以如果用户发布按钮,它也会被看到。我还添加了if来检测大拇指的移动,所以你至少可以忽略这些。

希望这能帮到你。告诉我,如果它不适合你的需要,我相信我们能解决这个问题。

如何:检测控制器按钮是否已按下此框架 GamePadState.PacketNumber性质

票数 11
EN

Game Development用户

发布于 2013-08-05 04:32:02

您可以手动构造空的GamePadState,然后使用当前真实的检查它是否相等,您可以通过呼叫GamePad.GetState获取它

代码语言:javascript
运行
复制
playerInput = GamePad.GetState(PlayerIndex.One);  
emptyInput = new GamePadState(Vector2.Zero, Vector2.Zero, 0, 0);
if (playerInput != emptyInput){

    // yay!!!!, a button push!
    // 
    // P.S., remember to allow any PlayerIndex to take control of the the game 
    // from the main menu.  It sucks when you pick up controller2 and it doesn't work.

}
票数 2
EN

Game Development用户

发布于 2013-08-05 03:44:49

如果您不介意使用反射,您可以使用类似这样的东西(甚至可能是这样):

代码语言:javascript
运行
复制
        var properties = typeof(GamePadButtons).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var property in properties)
        {
            var value = property.GetValue(GamePad.GetState(PlayerIndex.One).Buttons);
            if (value is ButtonState && (ButtonState)value == ButtonState.Pressed)
                ExitMainMenu = true;
        }
票数 1
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/60248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档