0

我对 PlayerIndex 以及如何使用它有疑问。

问题是第二个控制器(controllingPlayer2)有时需要为“null”(例如,对于一个玩家模式),但 GetState 不能接受 null 变量。

我有一个像这样的课程(对于我的游戏屏幕):

    public GameScreen(PlayerIndex? controllingPlayer, PlayerIndex? controllingPlayer2)
    {
        this.ControllingPlayer = controllingPlayer;
        this.ControllingPlayer2 = controllingPlayer2;
    }

    public override void HandleInput()
    {
        // Move the character UP - Problem appears at the GetState Here wanting a PlayerIndex not a null?
        if (GamePad.GetState(ControllingPlayer).IsButtonDown(controls.BUp))
        {
            P1movementY--;
        }

        // Move the second character UP - Problem appears at the GetState Here wanting a PlayerIndex not a null?

        if (GamePad.GetState(ControllingPlayer).IsButtonDown(controls.BUp))
        {
            P2movementY--;
        }
4

3 回答 3

1

如果提前阻塞,请与 && 一起使用以短路

    if (ControllingPlayer2 != null && GamePad.GetState(ControllingPlayer2).IsButtonDown(controls.BUp))
    {
        P2movementY--;
    }
于 2012-05-30T16:47:46.107 回答
1

简短的回答,检查是否(ControllingPlayer!= null),然后使用 ControllingPlayer.Value。

更长的形式,C# 中的问号语法允许您将值类型传递为 null,对于该类型,null 不是可分配的值。它是 Nullable<PlayerIndex> 的简写,它有几个属性,例如 HasValue:bool 和 Value:PlayerIndex。它与类型的非 Nullable 版本并不完全相同。

于 2012-05-30T16:50:24.010 回答
1

这应该可以解决问题,您可以在此处查看 Nullable 的工作原理。

public override void HandleInput()
{
    if (ControllingPlayer.HasValue && GamePad.GetState(ControllingPlayer.Value).IsButtonDown(controls.BUp))
    {
        P1movementY--;
    }

    if (ControllingPlayer2.HasValue && GamePad.GetState(ControllingPlayer2.Value).IsButtonDown(controls.BUp))
    {
        P2movementY--;
    }
}
于 2012-05-30T17:01:00.747 回答