gpt4 book ai didi

c# - 在枚举中明确定义标志组合

转载 作者:可可西里 更新时间:2023-11-01 07:55:18 25 4
gpt4 key购买 nike

我正在考虑实现一个定义游戏对象状态的枚举,我想知道我是否可以直接在枚举的定义中使用标志,而不是将对象的状态定义为标志的集合,这并不容易,状态机中使用的状态的预定义全局名称。

例如,假设有 5 种状态:PreActivation(已创建但未开始;即 future wave 中的敌人)、Active(当前正在使用;即屏幕上的敌人正在攻击您)、Paused(不再活跃,但可能会重新激活;即如果玩家使用时间卡住能力,则为敌人),DeActivated(已完成使用但仍在游戏世界中的对象;即死后遗体的敌人,如毁灭战士 1 和 2 ) 和 ToRemove(预定要从游戏中移除的对象;即在您清除一个级别并移动到下一个级别后的敌人)。

我想做的是定义枚举,以便各州拥有所有适用的标志;例如,一个 DeActivated 敌人: 1. 之前已被激活,并且 2. 当前未激活。我目前的想法是做这样的事情:

public enum ObjectState
{
// The first section are the flags
BeenActivated = 0b0000001, // Previously activated
CurrentlyActive = 0b0000010, // Currently activated
IsSuspended = 0b0000100, // It may be reactivated
ShouldRemove = 0b0001000, // It should be removed
// These are the states
PreActivation = 0b0000100, // Mot currently active, nor has it ever been active, but it will get activated
Active = 0b0000011, // Currently active, and it's been active
Paused = 0b0000101, // Not currently active, but it's been active before
DeActivated = 0b0000001, // Not currently active, but it's been active before, and it shouldn't get reactivated, but don't remove yet
ToRemove = 0b0001001 // Not currently active, but it's been active before, and it shouldn't get reactivated, it should be removed
}

据我所知,这应该可以正常工作,但我有几个主要问题:

  1. 这会带来什么问题吗?
  2. 这是不好的做法吗?
  3. 这是不好的做法吗?而且,如果是的话;
    • A.有什么问题吗?
    • B.我应该怎么做?我只是让对象的状态成为这些标志的集合,但我想要一个特定状态的简写枚举,因为这允许特定实例的复杂性和需要时的简单性。有没有更容易接受的方法来实现这一点?

如果这是重复或我违反了其他规则,我很抱歉,但我今天刚创建了一个帐户;这是我的第一篇文章。另外,我不确定你在搜索时会怎么调用它,而且我没有从这里或谷歌上得到任何类似的结果。

最佳答案

你可以这样做。这是标志枚举的重点。如果 enum 打算用作标志,请使用 [Flags] 属性对其进行标记。

我建议将现有标志与按位或 (|) 结合起来。它更具可读性且不易出错。

[Flags]
public enum ObjectState
{
// Flags
BeenActivated = 0b0000001, // Previously activated
CurrentlyActive = 0b0000010, // Currently activated
IsSuspended = 0b0000100, // It may be reactivated
ShouldRemove = 0b0001000, // It should be removed

// States as combination of flags.
PreActivationState = IsSuspended, // Mot currently active, nor has it ever been active, but it will get activated
ActiveState = BeenActivated | CurrentlyActive, // Currently active, and it's been active
PausedState = BeenActivated | IsSuspended, // Not currently active, but it's been active before
DeActivatedState = BeenActivated, // Not currently active, but it's been active before, and it shouldn't get reactivated, but don't remove yet
ToRemoveState = BeenActivated | ShouldRemove // Not currently active, but it's been active before, and it shouldn't get reactivated, it should be removed
}

我还为各州添加了“州”后缀,以更好地将它们与旗帜区分开来。或者反过来,为标志添加“Flags”后缀。

关于c# - 在枚举中明确定义标志组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50438898/

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