new server
This commit is contained in:
69
room.go
Normal file
69
room.go
Normal file
@@ -0,0 +1,69 @@
|
||||
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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user