Files
tma-back/room.go
2026-01-21 18:49:12 +03:00

70 lines
964 B
Go

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()
}
}