push für lennart :p

This commit is contained in:
tkarrass 2016-02-08 15:29:43 +01:00
parent 4cdad776e1
commit 679aaeebaa
3 changed files with 55 additions and 16 deletions

View File

@ -23,6 +23,8 @@ gosl.json for configuration (Port/Address, Level)
// Run: // Run:
} }
const ClientOffset = 10
type goslClient struct { type goslClient struct {
con *net.TCPConn con *net.TCPConn
id int id int
@ -37,10 +39,10 @@ var (
level *data.Level level *data.Level
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, 0) clientKeys []int = make([]int, 0)
// big server canvas // big server canvas
canvas [][]rune //canvas [][]rune
canvasX int canvasX int
frameCounter int = 0 frameCounter int = 0
) )
@ -54,7 +56,7 @@ func handleConn(conn *net.TCPConn) {
// memorize client in server state // 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
// reset server // reset server
resetServer() resetServer()
@ -62,19 +64,18 @@ func handleConn(conn *net.TCPConn) {
func resetServer() { func resetServer() {
// adjust canvas width // adjust canvas width
canvasX = 0 canvasX = -1 * ClientOffset
for _, k := range clientKeys { for _, k := range clientKeys {
_, client := k, clients[k] _, client := k, clients[k]
canvasX += client.w canvasX += client.w + ClientOffset
} }
canvasX += level.Width() canvasX += level.Width()
// adjust client offsets // adjust client offsets
off := 0 off := 0
for _, k := range clientKeys { for _, k := range clientKeys {
_, client := k, clients[k] clients[k].off = off
client.off = off off += clients[k].w
off += client.w off += ClientOffset
off += 10
} }
} }
@ -86,7 +87,7 @@ func serveClients() {
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(client.off, client.w, frameCounter) oFrame := level.GetFrame(client.off, client.w, canvasX, 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 {
@ -100,8 +101,10 @@ func serveClients() {
idInKeys := sort.SearchInts(clientKeys, client.id) idInKeys := sort.SearchInts(clientKeys, client.id)
clientKeys = append(clientKeys[:idInKeys], clientKeys[idInKeys+1:]...) clientKeys = append(clientKeys[:idInKeys], clientKeys[idInKeys+1:]...)
//log.Println("AFTER remove: clients:", clients, " clientKeys:", clientKeys) //log.Println("AFTER remove: clients:", clients, " clientKeys:", clientKeys)
resetServer()
} }
//log.Println("ID:", id, "Client:", client) //log.Println("ID:", id, "Client:", client)
} }
} }
frameCounter++ frameCounter++

View File

@ -17,7 +17,7 @@ const (
DIR_W // W 4 5 6 E DIR_W // W 4 5 6 E
DIR_NONE // 1 2 3 DIR_NONE // 1 2 3
DIR_E // SW S SE DIR_E // SW S SE
DIR_NW DIR_NW // only 4,5,6 supported
DIR_N DIR_N
DIR_NE DIR_NE
) )
@ -74,7 +74,19 @@ func (lvl *Level) Height() int {
return max return max
} }
// this is a func also ;) func (l *Layer) Width() (max int) {
max = 0
for _, frame := range l.Frames {
for _, row := range frame {
if len(row) > max {
max = len(row)
}
}
}
return
}
// Funzt so nicht: Layer liegen nicht zwingend übereinander
func (lvl *Level) Width() (max int) { func (lvl *Level) Width() (max int) {
for _, lay := range lvl.Layers { for _, lay := range lvl.Layers {
for _, fra := range lay.Frames { for _, fra := range lay.Frames {
@ -89,15 +101,18 @@ func (lvl *Level) Width() (max int) {
} }
//testcomment //testcomment
func (lvl *Level) GetFrame(off, w, frameNo int) (ret *Frame) { func (lvl *Level) GetFrame(o, w, maxW, frameNo int) (ret *Frame) {
h := lvl.Height() h := lvl.Height()
ret = &Frame{ ret = &Frame{
W: w, W: w,
H: h, H: h,
} }
// generate an array by initializing a slice and …
var mdata = make([]rune, w*h) var mdata = make([]rune, w*h)
for y := 0; y < h; y++ { for y := 0; y < h; y++ {
// … let the resulting Frame data point into it:
ret.Data = append(ret.Data, mdata[y*w:(y+1)*w]) ret.Data = append(ret.Data, mdata[y*w:(y+1)*w])
} }
@ -105,8 +120,29 @@ func (lvl *Level) GetFrame(off, w, frameNo int) (ret *Frame) {
if layer.Z == 0 { if layer.Z == 0 {
for row := 0; row < h; row++ { for row := 0; row < h; row++ {
//ret.Data = append(ret.Data, []rune{}) //ret.Data = append(ret.Data, []rune{})
// which frame of the layer to use
f := (frameNo % len(layer.Frames)) + 1 f := (frameNo % len(layer.Frames)) + 1
off := 0
switch layer.D {
case 4:
off = -(frameNo * layer.S) + o
case 6:
off = (frameNo * layer.S) + o
}
for off < 0 {
off += layer.Width()
}
off %= layer.Width()
if row <= len(layer.Frames[f]) { if row <= len(layer.Frames[f]) {
r := layer.Frames[f][row][:]
for col := 0; col < w; col++ {
ro := (off + col) % layer.Width()
if (ro) < len(r) && string(r[ro]) != layer.T {
ret.Data[row][col] = r[ro]
}
}
//for col := 0 //for col := 0
//log.Println(len(layer.Frames[f][row])) //log.Println(len(layer.Frames[f][row]))
//ret.Data[row] = append(ret.Data[row], (layer.Frames[f][row][off%w:])...) //ret.Data[row] = append(ret.Data[row], (layer.Frames[f][row][off%w:])...)

View File

@ -5,7 +5,7 @@
"locomotive": { "locomotive": {
"Z-Index": 0, "Z-Index": 0,
"Direction": 6, "Direction": 6,
"Speed": 2, "Speed": 1,
"Repeat": false, "Repeat": false,
"Transparent": "•" "Transparent": "•"
} }