package main import ( "time" ) type Room struct { Players map[string]*Player Input chan InputMessage } func NewRoom() *Room { return &Room{ Players: make(map[string]*Player), Input: make(chan InputMessage, 128), } } func (r *Room) update() { for { select { case input := <-r.Input: p := r.Players[input.PlayerID] if p != nil { p.DX = input.DX p.DY = input.DY } default: goto DONE } } DONE: for _, p := range r.Players { p.X += p.DX * 4 p.Y += p.DY * 4 } } func (r *Room) broadcast() { state := map[string]map[string]float64{} for id, p := range r.Players { state[id] = map[string]float64{ "x": p.X, "y": p.Y, } } msg := StateMessage{ Type: "state", Payload: map[string]any{ "players": state, }, } for _, p := range r.Players { p.Conn.WriteJSON(msg) } } func (r *Room) Run() { ticker := time.NewTicker(time.Second / 30) for range ticker.C { r.update() r.broadcast() } }