room.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package game
  2. import (
  3. "sync"
  4. "time"
  5. "github.com/wonderivan/logger"
  6. )
  7. type Room struct {
  8. //房间ID,目前没啥用,就是方便打印查看
  9. ID int
  10. //入房钥匙
  11. EnterKey string
  12. //玩家列表
  13. PlayerList []*Player
  14. }
  15. var staticRoomMapLocker sync.RWMutex
  16. var staticRoomMap = make(map[string]*Room)
  17. //进入房间
  18. func EnterRoom(player *Player, enterKey string) {
  19. staticRoomMapLocker.Lock()
  20. defer staticRoomMapLocker.Unlock()
  21. needCreateRoom := false
  22. room := staticRoomMap[enterKey]
  23. if room == nil {
  24. needCreateRoom = true
  25. } else if room != nil {
  26. needCreateRoom = room.IsFullMembers()
  27. }
  28. if needCreateRoom {
  29. room = &Room{ID: GetUuidInt("Room"), EnterKey: enterKey, PlayerList: []*Player{player, nil}}
  30. go room.AutoCheck()
  31. staticRoomMap[enterKey] = room
  32. logger.Info("roomID:", room.ID, "Create", "EnterKey:", room.EnterKey)
  33. player.OnEnterRoom(room)
  34. } else {
  35. room.PlayerList[1] = player
  36. player.OnEnterRoom(room)
  37. room.OnRoomReadyComplete()
  38. }
  39. }
  40. //开启检测-主要为了自动销毁
  41. func (room *Room) AutoCheck() {
  42. defer room.CloseAllPlayers()
  43. defer func() {
  44. staticRoomMapLocker.Lock()
  45. if staticRoomMap[room.EnterKey] == room {
  46. delete(staticRoomMap, room.EnterKey)
  47. }
  48. staticRoomMapLocker.Unlock()
  49. logger.Info("roomID:", room.ID, "Destroy")
  50. }()
  51. loopInterval := 2
  52. waitTime := 0
  53. for {
  54. time.Sleep(time.Duration(loopInterval) * time.Second)
  55. if room.IsFullMembers() {
  56. if !room.IsAllMembersValid() {
  57. break
  58. }
  59. } else {
  60. waitTime += loopInterval
  61. if waitTime >= 30 {
  62. break
  63. }
  64. }
  65. }
  66. }
  67. //判断房间的人数是否已满
  68. func (room *Room) IsFullMembers() bool {
  69. for _, p := range room.PlayerList {
  70. if p == nil {
  71. return false
  72. }
  73. }
  74. return true
  75. }
  76. //判断房间内是由所有玩家都有效
  77. func (room *Room) IsAllMembersValid() bool {
  78. for _, p := range room.PlayerList {
  79. if !p.IsValid {
  80. return false
  81. }
  82. }
  83. return true
  84. }
  85. //关闭所有玩家连接
  86. func (room *Room) CloseAllPlayers() {
  87. for _, p := range room.PlayerList {
  88. if p != nil {
  89. p.Conn.Close()
  90. }
  91. }
  92. }
  93. //广播到其他人
  94. func (room *Room) BroadcastToOthers(player *Player, func_ string, args ...interface{}) {
  95. for _, p := range room.PlayerList {
  96. if p != nil && p != player {
  97. SendPackFunction(p.Conn, func_, args...)
  98. }
  99. }
  100. }
  101. //广播到全部人
  102. func (room *Room) BroadcastToAll(func_ string, args ...interface{}) {
  103. for _, p := range room.PlayerList {
  104. if p != nil {
  105. SendPackFunction(p.Conn, func_, args...)
  106. }
  107. }
  108. }
  109. //向客户端发送的请求
  110. //房间准备完毕,即房间内的玩家都准备好了,接到该通知就可以开始游戏啦
  111. func (room *Room) OnRoomReadyComplete() {
  112. for playerIndexInRoom, p := range room.PlayerList {
  113. SendPackFunction(p.Conn, "OnRoomReadyComplete", playerIndexInRoom)
  114. }
  115. logger.Info("roomID:", room.ID, "OnRoomReadyComplete")
  116. }