This commit is contained in:
Smile Rex
2026-01-21 19:14:05 +03:00
parent 280d9801d6
commit 9033264a15
5 changed files with 59 additions and 24 deletions

24
room.go
View File

@@ -1,12 +1,14 @@
package main
import (
"sync"
"time"
)
type Room struct {
Players map[string]*Player
Input chan InputMessage
mu sync.Mutex
}
func NewRoom() *Room {
@@ -17,36 +19,46 @@ func NewRoom() *Room {
}
func (r *Room) update() {
// 1⃣ обрабатываем input
for {
select {
case input := <-r.Input:
r.mu.Lock()
p := r.Players[input.PlayerID]
if p != nil {
p.DX = input.DX
p.DY = input.DY
}
r.mu.Unlock()
default:
goto DONE
}
}
DONE:
// 2⃣ двигаем игроков
r.mu.Lock()
for _, p := range r.Players {
p.X += p.DX * 4
p.Y += p.DY * 4
}
r.mu.Unlock()
}
func (r *Room) broadcast() {
state := map[string]map[string]float64{}
r.mu.Lock()
state := make(map[string]map[string]any, len(r.Players))
for id, p := range r.Players {
state[id] = map[string]float64{
"x": p.X,
"y": p.Y,
state[id] = map[string]any{
"x": p.X,
"y": p.Y,
"name": p.Username,
}
}
r.mu.Unlock()
msg := StateMessage{
Type: "state",
Payload: map[string]any{
@@ -54,13 +66,15 @@ func (r *Room) broadcast() {
},
}
// отправляем БЕЗ mutex — важно
for _, p := range r.Players {
p.Conn.WriteJSON(msg)
_ = p.Conn.WriteJSON(msg)
}
}
func (r *Room) Run() {
ticker := time.NewTicker(time.Second / 30)
defer ticker.Stop()
for range ticker.C {
r.update()