Space
space 游戏中常见的空间设计,例如房间、地图等
目录导航
列出了该 package 下所有的函数及类型定义,可通过目录导航进行快捷跳转 ❤️
展开 / 折叠目录导航
包级函数定义
| 函数名称 | 描述 |
|---|---|
| NewRoomManager | 创建房间管理器 RoomManager 的实例 |
| NewRoomControllerOptions | 创建房间控制器选项 |
类型定义
| 类型 | 名称 | 描述 |
|---|---|---|
STRUCT |
RoomController | 对房间进行操作的控制器,由 RoomManager 接管后返回 |
STRUCT |
RoomManager | 房间管理器是用于对房间进行管理的基本单元,通过该实例可以对房间进行增删改查等操作 |
STRUCT |
RoomAssumeControlEventHandle | 暂无描述... |
STRUCT |
RoomControllerOptions | 暂无描述... |
详情信息
func NewRoomManager[EntityID comparable, RoomID comparable, Entity generic.IdR[EntityID], Room generic.IdR[RoomID]]() *RoomManager[EntityID, RoomID, Entity, Room]
创建房间管理器 RoomManager 的实例
示例代码:
func ExampleNewRoomManager() {
var rm = space.NewRoomManager[string, int64, *Player, *Room]()
fmt.Println(rm == nil)
}
func NewRoomControllerOptions[EntityID comparable, RoomID comparable, Entity generic.IdR[EntityID], Room generic.IdR[RoomID]]() *RoomControllerOptions[EntityID, RoomID, Entity, Room]
创建房间控制器选项
RoomController STRUCT
对房间进行操作的控制器,由 RoomManager 接管后返回
type RoomController[EntityID comparable, RoomID comparable, Entity generic.IdR[EntityID], Room generic.IdR[RoomID]] struct {
manager *RoomManager[EntityID, RoomID, Entity, Room]
options *RoomControllerOptions[EntityID, RoomID, Entity, Room]
room Room
entities map[EntityID]Entity
entitiesRWMutex sync.RWMutex
vacancy []int
seat []*EntityID
owner *EntityID
}
func (*RoomController) HasOwner() bool
判断是否有房主
func (*RoomController) IsOwner(entityId EntityID) bool
判断是否为房主
func (*RoomController) GetOwner() Entity
获取房主
func (*RoomController) GetOwnerID() EntityID
获取房主 ID
func (*RoomController) GetOwnerExist() ( Entity, bool)
获取房间,并返回房主是否存在的状态
func (*RoomController) SetOwner(entityId EntityID)
设置房主
func (*RoomController) DelOwner()
删除房主,将房间设置为无主的状态
func (*RoomController) JoinSeat(entityId EntityID, seat ...int) error
设置特定对象加入座位,当具体的座位不存在的时候,将会自动分配座位
- 当目标座位存在玩家或未添加到房间中的时候,将会返回错误
func (*RoomController) LeaveSeat(entityId EntityID)
离开座位
func (*RoomController) GetSeat(entityId EntityID) int
获取座位
func (*RoomController) GetFirstNotEmptySeat() int
获取第一个非空座位号,如果没有非空座位,将返回 UnknownSeat
func (*RoomController) GetFirstEmptySeatEntity() (entity Entity)
获取第一个空座位上的实体,如果没有空座位,将返回空实体
func (*RoomController) GetRandomEntity() (entity Entity)
获取随机实体,如果房间中没有实体,将返回空实体
func (*RoomController) GetNotEmptySeat() []int
获取非空座位
func (*RoomController) GetEmptySeat() []int
获取空座位
- 空座位需要在有对象离开座位后才可能出现
func (*RoomController) HasSeat(entityId EntityID) bool
判断是否有座位
func (*RoomController) GetSeatEntityCount() int
获取座位上的实体数量
func (*RoomController) GetSeatEntities() map[EntityID]Entity
获取座位上的实体
func (*RoomController) GetSeatEntitiesByOrdered() []Entity
有序的获取座位上的实体
func (*RoomController) GetSeatEntitiesByOrderedAndContainsEmpty() []Entity
获取有序的座位上的实体,包含空座位
func (*RoomController) GetSeatEntity(seat int) (entity Entity)
获取座位上的实体
func (*RoomController) ContainEntity(id EntityID) bool
房间内是否包含实体
func (*RoomController) GetRoom() Room
获取原始房间实例,该实例为被接管的房间的原始实例
func (*RoomController) GetEntities() map[EntityID]Entity
获取所有实体
func (*RoomController) HasEntity(id EntityID) bool
判断是否有实体
func (*RoomController) GetEntity(id EntityID) Entity
获取实体
func (*RoomController) GetEntityExist(id EntityID) ( Entity, bool)
获取实体,并返回实体是否存在的状态
func (*RoomController) GetEntityIDs() []EntityID
获取所有实体ID
func (*RoomController) GetEntityCount() int
获取实体数量
func (*RoomController) ChangePassword(password *string)
修改房间密码
- 当房间密码为 nil 时,将会取消密码
func (*RoomController) AddEntity(entity Entity) error
添加实体,如果房间存在密码,应使用 AddEntityByPassword 函数进行添加,否则将始终返回 ErrRoomPasswordNotMatch 错误
- 当房间已满时,将会返回 ErrRoomFull 错误
func (*RoomController) AddEntityByPassword(entity Entity, password string) error
通过房间密码添加实体到该房间中
- 当未设置房间密码时,password 参数将会被忽略
- 当房间密码不匹配时,将会返回 ErrRoomPasswordNotMatch 错误
- 当房间已满时,将会返回 ErrRoomFull 错误
func (*RoomController) RemoveEntity(id EntityID)
移除实体
- 当实体被移除时如果实体在座位上,将会自动离开座位
- 如果实体为房主,将会根据 RoomControllerOptions.WithOwnerInherit 函数的设置进行继承
func (*RoomController) RemoveAllEntities()
移除该房间中的所有实体
- 当实体被移除时如果实体在座位上,将会自动离开座位
- 如果实体为房主,将会根据 RoomControllerOptions.WithOwnerInherit 函数的设置进行继承
func (*RoomController) Destroy()
销毁房间,房间会从 RoomManager 中移除,同时所有房间的实体、座位等数据都会被清空
- 该函数与 RoomManager.DestroyRoom 相同,RoomManager.DestroyRoom 函数为该函数的快捷方式
func (*RoomController) GetRoomManager() *RoomManager[EntityID, RoomID, Entity, Room]
获取该房间控制器所属的房间管理器
func (*RoomController) GetRoomID() RoomID
获取房间 ID
func (*RoomController) Broadcast(handler func ( Entity), conditions ...func ( Entity) bool)
广播,该函数会将所有房间中满足 conditions 的对象传入 handler 中进行处理
RoomManager STRUCT
房间管理器是用于对房间进行管理的基本单元,通过该实例可以对房间进行增删改查等操作
- 该实例是线程安全的
type RoomManager[EntityID comparable, RoomID comparable, Entity generic.IdR[EntityID], Room generic.IdR[RoomID]] struct {
*roomManagerEvents[EntityID, RoomID, Entity, Room]
roomsRWMutex sync.RWMutex
rooms map[RoomID]*RoomController[EntityID, RoomID, Entity, Room]
}
func (*RoomManager) AssumeControl(room Room, options ...*RoomControllerOptions[EntityID, RoomID, Entity, Room]) *RoomController[EntityID, RoomID, Entity, Room]
将房间控制权交由 RoomManager 接管,返回 RoomController 实例
- 当任何房间需要被 RoomManager 管理时,都应该调用该方法获取到 RoomController 实例后进行操作
- 房间被接管后需要在释放房间控制权时调用 RoomController.Destroy 方法,否则将会导致 RoomManager 一直持有房间资源
示例代码:
func ExampleRoomManager_AssumeControl() {
var rm = space.NewRoomManager[string, int64, *Player, *Room]()
var room = &Room{Id: 1}
var controller = rm.AssumeControl(room)
if err := controller.AddEntity(&Player{Id: "1"}); err != nil {
panic(err)
}
fmt.Println(controller.GetEntityCount())
}
func (*RoomManager) DestroyRoom(id RoomID)
销毁房间,该函数为 RoomController.Destroy 的快捷方式
func (*RoomManager) GetRoom(id RoomID) *RoomController[EntityID, RoomID, Entity, Room]
通过房间 ID 获取对应房间的控制器 RoomController,当房间不存在时将返回 nil
func (*RoomManager) GetRooms() map[RoomID]*RoomController[EntityID, RoomID, Entity, Room]
获取包含所有房间 ID 到对应控制器 RoomController 的映射
- 返回值的 map 为拷贝对象,可安全的对其进行增删等操作
func (*RoomManager) GetRoomCount() int
获取房间管理器接管的房间数量
func (*RoomManager) GetRoomIDs() []RoomID
获取房间管理器接管的所有房间 ID
func (*RoomManager) HasEntity(entityId EntityID) bool
判断特定对象是否在任一房间中,当对象不在任一房间中时将返回 false
func (*RoomManager) GetEntityRooms(entityId EntityID) map[RoomID]*RoomController[EntityID, RoomID, Entity, Room]
获取特定对象所在的房间,返回值为房间 ID 到对应控制器 RoomController 的映射
- 由于一个对象可能在多个房间中,因此返回值为 map 类型
func (*RoomManager) Broadcast(handler func ( Entity), conditions ...func ( Entity) bool)
向所有房间对象广播消息,该方法将会遍历所有房间控制器并调用 RoomController.Broadcast 方法
RoomAssumeControlEventHandle STRUCT
type RoomAssumeControlEventHandle[EntityID comparable, RoomID comparable, Entity generic.IdR[EntityID], Room generic.IdR[RoomID]] func(controller *RoomController[EntityID, RoomID, Entity, Room])
RoomControllerOptions STRUCT
type RoomControllerOptions[EntityID comparable, RoomID comparable, Entity generic.IdR[EntityID], Room generic.IdR[RoomID]] struct {
maxEntityCount *int
password *string
ownerInherit bool
ownerInheritHandler func(controller *RoomController[EntityID, RoomID, Entity, Room]) *EntityID
}
func (*RoomControllerOptions) WithOwnerInherit(inherit bool, inheritHandler ...func (controller *RoomController[EntityID, RoomID, Entity, Room]) *EntityID) *RoomControllerOptions[EntityID, RoomID, Entity, Room]
设置房间所有者是否继承,默认为 false
- inherit: 是否继承,当未设置 inheritHandler 且 inherit 为 true 时,将会按照随机或根据座位号顺序继承房间所有者
- inheritHandler: 继承处理函数,当 inherit 为 true 时,该函数将会被调用,传入当前房间中的所有实体,返回值为新的房间所有者
func (*RoomControllerOptions) WithMaxEntityCount(maxEntityCount int) *RoomControllerOptions[EntityID, RoomID, Entity, Room]
设置房间最大实体数量
func (*RoomControllerOptions) WithPassword(password string) *RoomControllerOptions[EntityID, RoomID, Entity, Room]
设置房间密码