【发布时间】:2015-05-18 18:25:49
【问题描述】:
今天在使用 XNA 时,我注意到使用 [Flags] 的枚举类型之一没有 None = 0 值:
[Flags]
public enum Buttons
{
DPadUp = 1,
DPadDown = 2,
DPadLeft = 4,
DPadRight = 8,
Start = 16,
Back = 32,
LeftStick = 64,
RightStick = 128,
LeftShoulder = 256,
RightShoulder = 512,
BigButton = 2048,
A = 4096,
B = 8192,
X = 16384,
Y = 32768,
LeftThumbstickLeft = 2097152,
RightTrigger = 4194304,
LeftTrigger = 8388608,
RightThumbstickUp = 16777216,
RightThumbstickDown = 33554432,
RightThumbstickRight = 67108864,
RightThumbstickLeft = 134217728,
LeftThumbstickUp = 268435456,
LeftThumbstickDown = 536870912,
LeftThumbstickRight = 1073741824,
}
根据 MSDN 关于proper use of the [Flags] attribute:
将标志枚举的零值命名为
None。对于标志枚举,该值必须始终表示所有标志都已清除。
如果我想指示一个没有按下按钮的值,使用值 0 并将其强制转换为 Buttons 会违背枚举类型的意图吗?根据设计指南,它应该有这个值,但它没有。
【问题讨论】:
-
枚举用于 GamePadState.IsButtonUp/Down() 方法。用这些方法询问是否没有按钮是没有意义的。所以包含 None 是没有意义的。您无法更改类型,它被烘焙到 XNA 中,但由于 0 始终是枚举的有效值,您始终可以使用 default(Buttons)。
-
我认为是这样的。我不喜欢针对每种输入类型如何以不同方式处理按钮轮询(鼠标按钮甚至没有自己的枚举类型,这与键盘和游戏手柄不同)。我当前的项目正在围绕不同类型的输入创建一个通用包装类,例如保存当前和以前的
KeyboardState,以便我可以轻松地轮询一个键或按钮是刚刚按下还是释放。因此,我可以让客户端轮询我创建的 IsPressed() 方法或订阅事件,因此这是使 GamePadEventArgs 包含 Buttons 值的结果。
标签: c# enum-flags