From 553c93b5d89ba93054740989c15b4af7b8f5def9 Mon Sep 17 00:00:00 2001 From: Loic Nageleisen Date: Sun, 27 Apr 2014 19:28:36 +0200 Subject: [PATCH] Resolution independence, more sprites. --- ld48-29.go | 88 +++++++++++++++++++++++++++++------------------- log.mdown | 20 +++++++++++ spritesheet.png | Bin 7705 -> 8829 bytes 3 files changed, 73 insertions(+), 35 deletions(-) diff --git a/ld48-29.go b/ld48-29.go index d8dc4c9..a2c6b59 100644 --- a/ld48-29.go +++ b/ld48-29.go @@ -238,6 +238,9 @@ var mouseX float64 var mouseY float64 var mouseVisible bool +var ww int +var wh int + func renderer(done chan int, input chan int) { runtime.LockOSThread() @@ -250,7 +253,10 @@ func renderer(done chan int, input chan int) { glfw.WindowHint(glfw.Resizable, 0) - window, err := glfw.CreateWindow(640, 480, "LD48-29", nil, nil) + ww = 640*2 + wh = 480*2 + + window, err := glfw.CreateWindow(ww, wh, "LD48-29", nil, nil) if err != nil { log.Panic(err) } @@ -262,8 +268,10 @@ func renderer(done chan int, input chan int) { } onMouseClosure := func (window *glfw.Window, x float64, y float64) { - mouseX, mouseY = x, 480 - y - mouseVisible = mouseX < 640 && mouseX >= 0 && mouseY < 480 && mouseY >= 0 + rx := float64(ww) / (vx2 - vx1) + ry := float64(wh) / (vy2 - vy1) + mouseX, mouseY = x/rx - vx1, vy2 - (y/ry - vy1) + mouseVisible = mouseX < vx2 && mouseX >= 0 && mouseY < vy2 && mouseY >= 0 } window.SetKeyCallback(onKeyClosure) @@ -309,12 +317,16 @@ func setup() (textures map[string]gl.Texture, lists map[string]uint) { textures["sprites"] = spriteSheet lists["test"] = makeSprite(0, 0, 2, 2) - lists["cursor"] = makeSprite(4, 0, 1, 1) - lists["cloud"] = makeSprite(0, 2, 3, 2) + lists["cursor"] = makeSprite(3, 2, 1, 1) + lists["cloud1"] = makeSprite(0, 2, 3, 2) + lists["cloud2"] = makeSprite(0, 4, 2, 2) + lists["cloud3"] = makeSprite(2, 4, 2, 2) lists["stonewall"] = makeSprite(2, 0, 1, 1) lists["stonewallright"] = makeSprite(3, 0, 1, 1) lists["stonewalltopright"] = makeSprite(3, 1, 1, 1) lists["stonewalltop"] = makeSprite(2, 1, 1, 1) + lists["stonewallleft"] = makeSprite(4, 0, 1, 1) + lists["stonewalltopleft"] = makeSprite(4, 1, 1, 1) return } @@ -325,18 +337,30 @@ func destroy(textures map[string]gl.Texture) { } } +var vx1 float64 +var vy1 float64 +var vx2 float64 +var vy2 float64 + func render(textures map[string]gl.Texture, lists map[string]uint) { // start afresh gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // set viewport - width := float32(640.0) - height := float32(480.0) + width := float32(ww) + height := float32(wh) density := 2 // times 2 because HiDPI gl.Viewport(0, 0, int(width)*density, int(height)*density) + + vw := 320 + vh := 240 + + // set projection gl.MatrixMode(gl.PROJECTION) gl.LoadIdentity() - gl.Ortho(0, float64(width), 0, float64(height), -1.0, 1.0) + vx1, vy1 = 0, 0 + vx2, vy2 = float64(vw), float64(vh) + gl.Ortho(vx1, vx2, vy1, vy2, -1.0, 1.0) gl.MatrixMode(gl.MODELVIEW); gl.LoadIdentity() @@ -346,49 +370,43 @@ func render(textures map[string]gl.Texture, lists map[string]uint) { gl.Lightfv(gl.LIGHT0, gl.AMBIENT, ambient) gl.Enable(gl.LIGHT0) - - // clouds + // time source t := float64(time.Now().UnixNano()) / math.Pow(10, 9) + // clouds + fy := 2 * math.Pi * t / 60 - _, f := math.Modf(3*t/1000) - drawSprite(textures["sprites"], math.Mod(f*640, 640), 400+8*math.Sin(fy/1.3), 0, 3.0, lists["cloud"]) - - _, f = math.Modf(33*t/1000) - drawSprite(textures["sprites"], math.Mod(f*640+35, 640), 300+4*math.Sin(fy+3), 0, 2.0, lists["cloud"]) - - _, f = math.Modf(31*t/1000) - drawSprite(textures["sprites"], math.Mod(f*640+142, 640), 340+3*math.Sin(fy/3+1), 0, 2.5, lists["cloud"]) - - _, f = math.Modf(17*t/1000) - drawSprite(textures["sprites"], math.Mod(f*640+213, 640), 450+7*math.Sin(fy/1.5+2), 0, 1.0, lists["cloud"]) - - _, f = math.Modf(11*t/1000) - drawSprite(textures["sprites"], math.Mod(f*640+317, 640), 400+5*math.Sin(fy/2+1.1), 0, 1.5, lists["cloud"]) - - _, f = math.Modf(27*t/1000) - drawSprite(textures["sprites"], math.Mod(f*640+332, 640), 380+3*math.Sin(fy/4+3.1), 0, 1.5, lists["cloud"]) - - _, f = math.Modf(13*t/1000) - drawSprite(textures["sprites"], math.Mod(f*640+417, 640), 420+5*math.Sin(fy/2.2+2.5), 0, 1.0, lists["cloud"]) + drawSprite(textures["sprites"], 200, 200+8*math.Sin(fy/1.3), 0, 2.0, lists["cloud1"]) // wall tiles - for j := 0; j < 11; j++ { + for j := 0; j < 9; j++ { drawTile(textures["sprites"], 3, j, lists["stonewallright"]) } - drawTile(textures["sprites"], 3, 11, lists["stonewalltopright"]) + drawTile(textures["sprites"], 3, 9, lists["stonewalltopright"]) for i := 0; i < 3; i++ { - for j:= 0; j < 11; j++ { + for j:= 0; j < 9; j++ { drawTile(textures["sprites"], i, j, lists["stonewall"]) } - drawTile(textures["sprites"], i, 11, lists["stonewalltop"]) + drawTile(textures["sprites"], i, 9, lists["stonewalltop"]) + } + + for j := 0; j < 6; j++ { + drawTile(textures["sprites"], 19 - 2, j, lists["stonewallleft"]) + } + drawTile(textures["sprites"], 19 - 2, 6, lists["stonewalltopleft"]) + + for i := 0; i < 2; i++ { + for j:= 0; j < 6; j++ { + drawTile(textures["sprites"], 19 - i, j, lists["stonewall"]) + } + drawTile(textures["sprites"], 19 - i, 6, lists["stonewalltop"]) } // water - for i := 0; i < 640 / 16; i++ { + for i := 0; i < 320 / 16; i++ { for j := 0; j < 3; j++ { wt := 0.0 if j == 2 { diff --git a/log.mdown b/log.mdown index 72bd4b2..c0768db 100644 --- a/log.mdown +++ b/log.mdown @@ -131,3 +131,23 @@ All time is CEST This is vaguely starting to ressemble a form of game. ![](screenshots/5.png) + +- 14:19 + + Now I have a sea moving. Time for a break. + +- 14:59 + + Back to jamming + +- 15:50 + + Tiling water instead of hardcoded quads. + +- 16:02 + + Sprite tiling functions. + +- 19:25 + + Window size independence. More clouds, better tiles. Second platform. diff --git a/spritesheet.png b/spritesheet.png index 8e73ac21695aa8918afb45e499a1173b3a0991a4..b9d162ec529703848e7855a8e9fe2ab159f57dfa 100644 GIT binary patch delta 5236 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 G&;$UamO!@v