Enable movement ; Fix locomotive frames

This commit is contained in:
Lennart Buhl 2016-02-07 17:43:56 +01:00
parent 62d4c7771a
commit 0b1e623357
8 changed files with 88 additions and 79 deletions

View File

@ -28,6 +28,7 @@ type goslClient struct {
id int id int
w int w int
h int h int
off int
} }
/* GLOBAL SERVER STATE */ /* GLOBAL SERVER STATE */
@ -37,7 +38,11 @@ var (
ServerPort int ServerPort int
TotalWidth int = 0 TotalWidth int = 0
clients map[int]goslClient = make(map[int]goslClient) clients map[int]goslClient = make(map[int]goslClient)
clientKeys []int = make([]int, 100) clientKeys []int = make([]int, 0)
// big server canvas
canvas [][]rune
canvasX int
frameCounter int = 0
) )
func handleConn(conn *net.TCPConn) { func handleConn(conn *net.TCPConn) {
@ -46,22 +51,40 @@ func handleConn(conn *net.TCPConn) {
dec := gob.NewDecoder(conn) dec := gob.NewDecoder(conn)
dec.Decode(&hs) // decode handshake dec.Decode(&hs) // decode handshake
log.Println("Got client! ID:", hs.ID, "dimensions:", hs.W, hs.H) log.Println("Got client! ID:", hs.ID, "dimensions:", hs.W, hs.H)
// memorize client in server state
clientKeys = append(clientKeys, hs.ID) clientKeys = append(clientKeys, hs.ID)
sort.Ints(clientKeys) sort.Ints(clientKeys)
clients[hs.ID] = goslClient{con: conn, id: hs.ID, w: hs.W, h: hs.H} clients[hs.ID] = goslClient{con: conn, id: hs.ID, w: hs.W, h: hs.H}
TotalWidth += hs.W TotalWidth += hs.W
// conn.Close() // reset server
resetServer()
}
func resetServer() {
// adjust canvas width
canvasX = 0
for _, k := range clientKeys {
_, client := k, clients[k]
canvasX += client.w
}
canvasX += level.Width()
// adjust client offsets
off := 0
for _, k := range clientKeys {
_, client := k, clients[k]
client.off = off
off += client.w
}
} }
func serveClients() { func serveClients() {
level = data.LoadLevel(LevelFile) level = data.LoadLevel(LevelFile)
log.Println("canvas X:", canvasX()) frameCounter = 0
fCounter := 0
for { // while true for { // while true
for _, k := range clientKeys { for _, k := range clientKeys {
id, client := k, clients[k] id, client := k, clients[k]
if id > 0 { if id > 0 {
oFrame := level.GetFrame(0, client.w, fCounter) oFrame := level.GetFrame(0+frameCounter, client.w, frameCounter)
enc := gob.NewEncoder(client.con) enc := gob.NewEncoder(client.con)
err := enc.Encode(oFrame) err := enc.Encode(oFrame)
if err != nil { if err != nil {
@ -79,13 +102,13 @@ func serveClients() {
//log.Println("ID:", id, "Client:", client) //log.Println("ID:", id, "Client:", client)
} }
} }
fCounter++ frameCounter++
time.Sleep(time.Second / time.Duration(level.FPS)) time.Sleep(time.Second / time.Duration(level.FPS))
} }
} }
func runServer(cmd *cobra.Command, args []string) { func runServer(cmd *cobra.Command, args []string) {
log.Println("running server on port", ServerPort) log.Println("Running server on port", ServerPort)
listener, err := net.ListenTCP("tcp", &net.TCPAddr{Port: ServerPort}) listener, err := net.ListenTCP("tcp", &net.TCPAddr{Port: ServerPort})
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@ -110,13 +133,3 @@ func init() {
cmdServer.Flags().StringVarP(&LevelFile, "level", "l", "default.lvl", "Use specific levelfile") cmdServer.Flags().StringVarP(&LevelFile, "level", "l", "default.lvl", "Use specific levelfile")
cmdServer.Flags().IntVarP(&ServerPort, "port", "p", 8090, "Run server on this port") cmdServer.Flags().IntVarP(&ServerPort, "port", "p", 8090, "Run server on this port")
} }
func canvasX() (x int) {
x = 0
for _, k := range clientKeys {
_, client := k, clients[k]
x += client.w
}
x += level.Width()
return
}

View File

@ -47,11 +47,11 @@ type Level struct {
//} //}
func LoadLevel(filename string) *Level { func LoadLevel(filename string) *Level {
log.Println("Loading lvl ", filename) log.Println("Loading lvl", filename)
ret := &Level{} ret := &Level{}
file, err := os.Open(filename) file, err := os.Open(filename)
if err != nil { if err != nil {
log.Println("Error reading lvl: ", err) log.Println("Error reading lvl:", err)
return nil return nil
} }
dec := gob.NewDecoder(file) dec := gob.NewDecoder(file)
@ -73,13 +73,9 @@ func (lvl *Level) Height() int {
} }
func (lvl *Level) Width() (max int) { func (lvl *Level) Width() (max int) {
max = 0
for _, lay := range lvl.Layers { for _, lay := range lvl.Layers {
// lay is of type map[int]([][]rune)
for _, fra := range lay.Frames { for _, fra := range lay.Frames {
// fra is of type [][]rune
for _, fra2 := range fra { for _, fra2 := range fra {
// fra2 is of type []rune
if len(fra2) > max { if len(fra2) > max {
max = len(fra2) max = len(fra2)
} }
@ -89,8 +85,7 @@ func (lvl *Level) Width() (max int) {
return return
} }
func (lvl *Level) GetFrame(off, w, frame int) (ret *Frame) { func (lvl *Level) GetFrame(off, w, frameNo int) (ret *Frame) {
//log.Println(ret)
h := lvl.Height() h := lvl.Height()
ret = &Frame{ ret = &Frame{
@ -98,13 +93,14 @@ func (lvl *Level) GetFrame(off, w, frame int) (ret *Frame) {
H: h, H: h,
} }
for _, l := range lvl.Layers { for _, layer := range lvl.Layers {
if l.Z == 0 { if layer.Z == 0 {
for i := 0; i < h; i++ { for row := 0; row < h; row++ {
ret.Data = append(ret.Data, []rune{}) ret.Data = append(ret.Data, []rune{})
f := (frame % len(l.Frames)) + 1 f := (frameNo % len(layer.Frames)) + 1
if i <= len(l.Frames[f]) { if row <= len(layer.Frames[f]) {
ret.Data[i] = append(ret.Data[i], l.Frames[f][i]...) //log.Println(len(layer.Frames[f][row]))
ret.Data[row] = append(ret.Data[row], (layer.Frames[f][row][off:])...)
} }
} }
} }