70 lines
964 B
Go
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()
|
|
}
|
|
}
|