游戏编程精粹学习

在《游戏编程精粹1》里的1.10处讲解了位数组的应用,原文意把位操作变为类似数组的形式,从而更加直观。

(注意C#中已经内置这种数据结构,叫做BitArray)

不过我联想到是否可以设计一个位锁的概念。

我遇到过这样一个问题,游戏中有一些模块的参数必须在所有使用者都结束后才可以被释放。

例如时间系统的暂停,当你在进行某些特殊任务时需要调用时间暂停,而在这个特殊任务的过程中播放了过场动画也会调用暂停。

所以当他们都结束使用了,暂停这个参数才会变为false。

类似的情况还有AI的开启和关闭等等。

下面是支持32个使用者的位锁代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Hont
{
    public class BitLock
    {
        const int LOCKED_MAX_VALUE = 32;

        int mBitSlot;

        public bool IsLocked { get { return mBitSlot != 0; } }


        public BitLock()
        {
        }

        public bool IsUnassignLock(int handle)
        {
            return (mBitSlot & handle) == 0;
        }

        /// <summary>
        /// 分配一个锁,并返回锁的句柄。如果返回-1则返回失败。
        /// </summary>
        public int AssignLock()
        {
            for (int i = 1; i <= LOCKED_MAX_VALUE; i++)
            {
                if ((mBitSlot & 1 << i) == 0)
                {
                    mBitSlot |= 1 << i;

                    return i;
                }
            }

            return -1;
        }

        /// <summary>
        /// 通过句柄放回一个锁。
        /// </summary>
        public void UnassignLock(int handle)
        {
            mBitSlot = mBitSlot & (~(1 << handle));
        }
    }
}
原文地址:https://www.cnblogs.com/hont/p/8661768.html