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
w int
h int
off int
}
/* GLOBAL SERVER STATE */
@ -37,7 +38,11 @@ var (
ServerPort int
TotalWidth int = 0
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) {
@ -46,22 +51,40 @@ func handleConn(conn *net.TCPConn) {
dec := gob.NewDecoder(conn)
dec.Decode(&hs) // decode handshake
log.Println("Got client! ID:", hs.ID, "dimensions:", hs.W, hs.H)
// memorize client in server state
clientKeys = append(clientKeys, hs.ID)
sort.Ints(clientKeys)
clients[hs.ID] = goslClient{con: conn, id: hs.ID, w: hs.W, h: hs.H}
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() {
level = data.LoadLevel(LevelFile)
log.Println("canvas X:", canvasX())
fCounter := 0
frameCounter = 0
for { // while true
for _, k := range clientKeys {
id, client := k, clients[k]
if id > 0 {
oFrame := level.GetFrame(0, client.w, fCounter)
oFrame := level.GetFrame(0+frameCounter, client.w, frameCounter)
enc := gob.NewEncoder(client.con)
err := enc.Encode(oFrame)
if err != nil {
@ -79,13 +102,13 @@ func serveClients() {
//log.Println("ID:", id, "Client:", client)
}
}
fCounter++
frameCounter++
time.Sleep(time.Second / time.Duration(level.FPS))
}
}
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})
if err != nil {
log.Fatal(err)
@ -110,13 +133,3 @@ func init() {
cmdServer.Flags().StringVarP(&LevelFile, "level", "l", "default.lvl", "Use specific levelfile")
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 {
log.Println("Loading lvl ", filename)
log.Println("Loading lvl", filename)
ret := &Level{}
file, err := os.Open(filename)
if err != nil {
log.Println("Error reading lvl: ", err)
log.Println("Error reading lvl:", err)
return nil
}
dec := gob.NewDecoder(file)
@ -73,13 +73,9 @@ func (lvl *Level) Height() int {
}
func (lvl *Level) Width() (max int) {
max = 0
for _, lay := range lvl.Layers {
// lay is of type map[int]([][]rune)
for _, fra := range lay.Frames {
// fra is of type [][]rune
for _, fra2 := range fra {
// fra2 is of type []rune
if len(fra2) > max {
max = len(fra2)
}
@ -89,8 +85,7 @@ func (lvl *Level) Width() (max int) {
return
}
func (lvl *Level) GetFrame(off, w, frame int) (ret *Frame) {
//log.Println(ret)
func (lvl *Level) GetFrame(off, w, frameNo int) (ret *Frame) {
h := lvl.Height()
ret = &Frame{
@ -98,13 +93,14 @@ func (lvl *Level) GetFrame(off, w, frame int) (ret *Frame) {
H: h,
}
for _, l := range lvl.Layers {
if l.Z == 0 {
for i := 0; i < h; i++ {
for _, layer := range lvl.Layers {
if layer.Z == 0 {
for row := 0; row < h; row++ {
ret.Data = append(ret.Data, []rune{})
f := (frame % len(l.Frames)) + 1
if i <= len(l.Frames[f]) {
ret.Data[i] = append(ret.Data[i], l.Frames[f][i]...)
f := (frameNo % len(layer.Frames)) + 1
if row <= len(layer.Frames[f]) {
//log.Println(len(layer.Frames[f][row]))
ret.Data[row] = append(ret.Data[row], (layer.Frames[f][row][off:])...)
}
}
}