From b3363a7fd7bb39dd983e475c2bb486f25bc0a3b6 Mon Sep 17 00:00:00 2001 From: Daniel Esteban Date: Fri, 17 Apr 2026 18:43:42 +0200 Subject: [PATCH] almost everything working for nicebadge - missing logo image - cmd to generate logo image --- accel3d.go | 78 ++----------------------------- accel3d_gopherbadge.go | 78 +++++++++++++++++++++++++++++++ adventure.go | 103 ++++++++++++++++++++++++++--------------- badge.go | 7 ++- defs_default.go | 10 +++- defs_gopherbadge.go | 10 +++- defs_nicebadge.go | 19 ++++---- defs_pybadge.go | 10 +++- game_colors.go | 11 +++-- gameoflife.go | 24 +++++----- go.mod | 5 +- go.sum | 4 +- info.go | 1 - leds.go | 4 +- main.go | 3 +- snake.go | 95 ++++++++++++++++++++----------------- 16 files changed, 268 insertions(+), 194 deletions(-) create mode 100644 accel3d_gopherbadge.go diff --git a/accel3d.go b/accel3d.go index ae05f8b..6c1355d 100644 --- a/accel3d.go +++ b/accel3d.go @@ -1,78 +1,6 @@ -//go:build gopher_badge -// +build gopher_badge +//go:build !gopher_badge && !pybadge +// +build !gopher_badge,!pybadge package main -import ( - "time" - - "tinygo.org/x/tinydraw" - "tinygo.org/x/tinyfont" - "tinygo.org/x/tinyfont/freesans" -) - -func Accel3D() { - display.FillScreen(colorWhite) - tinydraw.Rectangle(&display, 50, 16, 260, 16, colorBlack) - tinydraw.Rectangle(&display, 50, 56, 260, 16, colorBlack) - tinydraw.Rectangle(&display, 50, 96, 260, 16, colorBlack) - - tinyfont.WriteLine(&display, &freesans.Regular12pt7b, 20, 180, "MOVE the Gopher to see", colorBlack) - tinyfont.WriteLine(&display, &freesans.Regular12pt7b, 32, 200, "the accelerometer in", colorBlack) - tinyfont.WriteLine(&display, &freesans.Regular12pt7b, 90, 220, "action.", colorBlack) - - tinyfont.WriteLine(&display, &freesans.Regular24pt7b, 4, 40, "X:", colorBlack) - tinyfont.WriteLine(&display, &freesans.Regular24pt7b, 4, 80, "Y:", colorBlack) - tinyfont.WriteLine(&display, &freesans.Regular24pt7b, 4, 120, "Z:", colorBlack) - - x, y, z := accel.ReadRawAcceleration() - for { - if !btnA.Get() || !btnB.Get() { - break - } - - x, y, z = accel.ReadRawAcceleration() - x = x / 250 - y = y / 250 - z = z / 250 - if x > 128 { - x = 128 - } - if y > 128 { - y = 128 - } - if z > 128 { - z = 128 - } - if x < -128 { - x = -128 - } - if y < -128 { - y = -128 - } - if z < -128 { - z = -128 - } - display.FillRectangle(51, 22, 258, 6, colorWhite) - display.FillRectangle(51, 62, 258, 6, colorWhite) - display.FillRectangle(51, 102, 258, 6, colorWhite) - if x < 0 { - display.FillRectangle(179+x, 22, -x, 6, colorRed) - } else { - display.FillRectangle(179, 22, x, 6, colorRed) - } - if y < 0 { - display.FillRectangle(179+y, 62, -y, 6, colorGreen) - } else { - display.FillRectangle(179, 62, y, 6, colorGreen) - } - if z < 0 { - display.FillRectangle(179+z, 102, -z, 6, colorBlue) - } else { - display.FillRectangle(179, 102, z, 6, colorBlue) - } - - println("X:", x, "Y:", y, "Z:", z) - time.Sleep(50 * time.Millisecond) - } -} +func Accel3D() {} diff --git a/accel3d_gopherbadge.go b/accel3d_gopherbadge.go new file mode 100644 index 0000000..ae05f8b --- /dev/null +++ b/accel3d_gopherbadge.go @@ -0,0 +1,78 @@ +//go:build gopher_badge +// +build gopher_badge + +package main + +import ( + "time" + + "tinygo.org/x/tinydraw" + "tinygo.org/x/tinyfont" + "tinygo.org/x/tinyfont/freesans" +) + +func Accel3D() { + display.FillScreen(colorWhite) + tinydraw.Rectangle(&display, 50, 16, 260, 16, colorBlack) + tinydraw.Rectangle(&display, 50, 56, 260, 16, colorBlack) + tinydraw.Rectangle(&display, 50, 96, 260, 16, colorBlack) + + tinyfont.WriteLine(&display, &freesans.Regular12pt7b, 20, 180, "MOVE the Gopher to see", colorBlack) + tinyfont.WriteLine(&display, &freesans.Regular12pt7b, 32, 200, "the accelerometer in", colorBlack) + tinyfont.WriteLine(&display, &freesans.Regular12pt7b, 90, 220, "action.", colorBlack) + + tinyfont.WriteLine(&display, &freesans.Regular24pt7b, 4, 40, "X:", colorBlack) + tinyfont.WriteLine(&display, &freesans.Regular24pt7b, 4, 80, "Y:", colorBlack) + tinyfont.WriteLine(&display, &freesans.Regular24pt7b, 4, 120, "Z:", colorBlack) + + x, y, z := accel.ReadRawAcceleration() + for { + if !btnA.Get() || !btnB.Get() { + break + } + + x, y, z = accel.ReadRawAcceleration() + x = x / 250 + y = y / 250 + z = z / 250 + if x > 128 { + x = 128 + } + if y > 128 { + y = 128 + } + if z > 128 { + z = 128 + } + if x < -128 { + x = -128 + } + if y < -128 { + y = -128 + } + if z < -128 { + z = -128 + } + display.FillRectangle(51, 22, 258, 6, colorWhite) + display.FillRectangle(51, 62, 258, 6, colorWhite) + display.FillRectangle(51, 102, 258, 6, colorWhite) + if x < 0 { + display.FillRectangle(179+x, 22, -x, 6, colorRed) + } else { + display.FillRectangle(179, 22, x, 6, colorRed) + } + if y < 0 { + display.FillRectangle(179+y, 62, -y, 6, colorGreen) + } else { + display.FillRectangle(179, 62, y, 6, colorGreen) + } + if z < 0 { + display.FillRectangle(179+z, 102, -z, 6, colorBlue) + } else { + display.FillRectangle(179, 102, z, 6, colorBlue) + } + + println("X:", x, "Y:", y, "Z:", z) + time.Sleep(50 * time.Millisecond) + } +} diff --git a/adventure.go b/adventure.go index 0665031..bbe8e62 100644 --- a/adventure.go +++ b/adventure.go @@ -13,6 +13,11 @@ import ( qrcode "github.com/skip2/go-qrcode" ) +var ( + advOptY = int16(24) + advOptHeight = int16(10) +) + func adventure() { quit := false s := 0 @@ -23,9 +28,14 @@ func adventure() { talk := false opinion := 0 selected := int16(0) - //released := true + + if displayWidth <= 240 { + advOptY = 54 + advOptHeight = 20 + } + for { - println(s) + println("SCENE", s) scene(s) selected = 0 score += s @@ -71,23 +81,21 @@ func adventure() { return } - tinydraw.FilledCircle(&display, 10, displayHeight-28+10*selected, 3, colorWhite) - //released = true + tinydraw.FilledCircle(&display, 10, displayHeight-advOptY-4+advOptHeight*selected, 3, colorWhite) for { + getInput() - /*if released && !btnUp.Get() && selected > 0 { - tinydraw.FilledCircle(&display, 10, displayHeight-28+10*selected, 3, colorBlack) + if selected > 0 && ((!buttonsOldState[buttonLeft] && buttonsState[buttonLeft]) || + (!buttonsOldState[buttonUp] && buttonsState[buttonUp])) { + tinydraw.FilledCircle(&display, 10, displayHeight-4-advOptY+advOptHeight*selected, 3, colorBlack) selected-- - tinydraw.FilledCircle(&display, 10, displayHeight-28+10*selected, 3, colorWhite) - } - - if released && !btnDown.Get() && selected < 2 { - tinydraw.FilledCircle(&display, 10, displayHeight-28+10*selected, 3, colorBlack) + tinydraw.FilledCircle(&display, 10, displayHeight-4-advOptY+advOptHeight*selected, 3, colorWhite) + } else if selected < 2 && ((!buttonsOldState[buttonRight] && buttonsState[buttonRight]) || + (!buttonsOldState[buttonDown] && buttonsState[buttonDown])) { + tinydraw.FilledCircle(&display, 10, displayHeight-4-advOptY+advOptHeight*selected, 3, colorBlack) selected++ - tinydraw.FilledCircle(&display, 10, displayHeight-28+10*selected, 3, colorWhite) - } - - if released && !btnA.Get() { + tinydraw.FilledCircle(&display, 10, displayHeight-4-advOptY+advOptHeight*selected, 3, colorWhite) + } else if !buttonsOldState[buttonA] && buttonsState[buttonA] { if selected == 0 { s = sceneData[s].sceneA if s == 1 { @@ -113,19 +121,12 @@ func adventure() { } break } + } else if goBack() { + quit = true + break } - if btnA.Get() && btnUp.Get() && btnDown.Get() { - released = true - } else { - released = false - } - - if !btnB.Get() { - return - }*/ time.Sleep(200 * time.Millisecond) - } if quit { break @@ -136,33 +137,59 @@ func adventure() { func scene(s int) { display.FillScreen(colorWhite) - ss := splitBefore(sceneData[s].description) + ss := splitBefore(sceneData[s].description, 0) for i := int16(0); i < int16(len(ss)); i++ { - tinyfont.WriteLine(&display, &freemono.Regular9pt7b, 6, 6+i*16, ss[i], colorBlack) + if displayWidth <= 240 { + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 6, 16+i*10, ss[i], colorBlack) + } else { + tinyfont.WriteLine(&display, &freemono.Regular9pt7b, 6, 16+i*16, ss[i], colorBlack) + } } - display.FillRectangle(0, displayHeight-33, displayWidth, 33, colorBlack) - tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-24, sceneData[s].optionA, colorWhite) - tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-14, sceneData[s].optionB, colorWhite) - tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-4, sceneData[s].optionC, colorWhite) + display.FillRectangle(0, displayHeight-advOptY-9, displayWidth, advOptY+9, colorBlack) - tinydraw.Circle(&display, 10, displayHeight-28, 4, colorWhite) - tinydraw.Circle(&display, 10, displayHeight-18, 4, colorWhite) - tinydraw.Circle(&display, 10, displayHeight-8, 4, colorWhite) + // OPTION A + ss = splitBefore(sceneData[s].optionA, 3) + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-advOptY, ss[0], colorWhite) + if len(ss) > 1 { + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-advOptY+10, ss[1], colorWhite) + } + + // OPTION B + ss = splitBefore(sceneData[s].optionB, 3) + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-advOptY+advOptHeight, ss[0], colorWhite) + if len(ss) > 1 { + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-advOptY+advOptHeight+10, ss[1], colorWhite) + } + + // OPTION C + ss = splitBefore(sceneData[s].optionC, 3) + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-advOptY+advOptHeight*2, ss[0], colorWhite) + if len(ss) > 1 { + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 20, displayHeight-advOptY+advOptHeight*2+10, ss[1], colorWhite) + } + + tinydraw.Circle(&display, 10, displayHeight-advOptY-4, 4, colorWhite) + tinydraw.Circle(&display, 10, displayHeight-advOptY+advOptHeight-4, 4, colorWhite) + tinydraw.Circle(&display, 10, displayHeight-advOptY+(advOptHeight)*2-4, 4, colorWhite) display.Display() } -func splitBefore(str string) []string { +func splitBefore(str string, offset int) []string { l := len(str) a := 0 - s := make([]string, 1) + s := make([]string, 0) + lineW := 28 - offset + if displayWidth <= 240 { + lineW = 40 - offset + } for { - if l <= 28 { + if l <= lineW { s = append(s, str[a:a+l]) break } else { - for i := 28; i > 0; i-- { + for i := lineW; i > 0; i-- { if string(str[a+i]) == " " { s = append(s, str[a:a+i]) a = a + i + 1 diff --git a/badge.go b/badge.go index 6ebad79..e827fa5 100644 --- a/badge.go +++ b/badge.go @@ -48,8 +48,11 @@ func Badge() { break } case 1: - //logopurpleHardware() - selectedScreen++ + if hardwareName == "GOPHERBADGE" { + logopurpleHardware() + } else { + selectedScreen++ + } if quit { break } diff --git a/defs_default.go b/defs_default.go index 6717fe0..d363f5c 100644 --- a/defs_default.go +++ b/defs_default.go @@ -7,9 +7,11 @@ package main // This file is not compiled when using a specific target const ( - hardware_name = "DEFAULT" + hardwareName = "DEFAULT" displayWidth = 320 displayHeight = 240 + + hasAccel = false ) const ( @@ -24,3 +26,9 @@ const ( menuItemSpace = 20 menuCircleR = 6 ) + +// snake +const ( + snakeWidthBLOCKS = 32 + snakeHeightBLOCKS = 24 +) \ No newline at end of file diff --git a/defs_gopherbadge.go b/defs_gopherbadge.go index b3190bf..4a398bf 100644 --- a/defs_gopherbadge.go +++ b/defs_gopherbadge.go @@ -13,9 +13,11 @@ import ( ) const ( - hardware_name = "GOPHERBADGE" + hardwareName = "GOPHERBADGE" displayWidth = 320 displayHeight = 240 + + hasAccel = true ) // UI layout constants for gopherbadge (320x240) @@ -38,6 +40,12 @@ const ( buttonBack = buttonB ) +// snake +const ( + snakeWidthBLOCKS = 32 + snakeHeightBLOCKS = 24 +) + var menuOptions = []int8{ modeBadge, modeSchedule, diff --git a/defs_nicebadge.go b/defs_nicebadge.go index 8a94697..ae8e7ff 100644 --- a/defs_nicebadge.go +++ b/defs_nicebadge.go @@ -13,9 +13,11 @@ import ( ) const ( - hardware_name = "NICEBADGE" + hardwareName = "NICEBADGE" displayWidth = 240 displayHeight = 135 + + hasAccel = false ) // UI layout constants for nicebadge (240x135) @@ -25,7 +27,7 @@ const ( topBandHeight = 20 bottomBandHeight = 10 helloY = 20 - myNameIsY = 20 + myNameIsY = 21 gophersY = 110 gophersX = 48 @@ -38,6 +40,12 @@ const ( buttonBack = buttonB ) +// snake +const ( + snakeWidthBLOCKS = 24 + snakeHeightBLOCKS = 13 +) + var menuOptions = []int8{ modeBadge, modeSchedule, @@ -97,14 +105,11 @@ func initHardware() { neo := machine.P1_11 neo.Configure(machine.PinConfig{Mode: machine.PinOutput}) - leds = ws2812.New(neo) + leds = ws2812.NewWS2812(neo) bzrPin = machine.P0_31 bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) - //pwm := machine.PWM0 - //speaker, _ := tone.New(pwm, bzrPin) - machine.InitADC() ax = machine.ADC{Pin: machine.P0_02} ay = machine.ADC{Pin: machine.P0_29} @@ -142,5 +147,3 @@ func getInput() { buttonsState[buttonDown] = (ay.Get() < 12000) buttonsState[buttonUp] = (ay.Get() > 52000) } - -func Accel3D() {} diff --git a/defs_pybadge.go b/defs_pybadge.go index e3f8ad8..8e1f3c1 100644 --- a/defs_pybadge.go +++ b/defs_pybadge.go @@ -13,9 +13,11 @@ import ( ) const ( - hardware_name = "GOBADGE" + hardwareName = "GOBADGE" displayWidth = 160 displayHeight = 128 + + hasAccel = true ) // UI layout constants for pybadge/gobadge (160x128) @@ -38,6 +40,12 @@ const ( buttonBack = buttonSelect ) +// snake +const ( + snakeWidthBLOCKS = 16 + snakeHeightBLOCKS = 12 +) + var menuOptions = []int8{ modeBadge, modeSchedule, diff --git a/game_colors.go b/game_colors.go index 502de52..9a1b62e 100644 --- a/game_colors.go +++ b/game_colors.go @@ -47,6 +47,9 @@ func ColorGame() { display.FillRectangle(p1x-gameColorsSpeed, p1y-gameColorsSpeed, gameColorsCellSize, gameColorsCellSize, colorPurple) display.FillRectangle(p2x-gameColorsSpeed, p2y-gameColorsSpeed, gameColorsCellSize, gameColorsCellSize, colorOrange) + gw := (gameColorsWidth * gameColorsCellSize) - gameColorsSpeed + gh := (gameColorsHeight * gameColorsCellSize) - gameColorsSpeed + for { display.FillRectangle(p1x-gameColorsSpeed, p1y-gameColorsSpeed, gameColorsCellSize, gameColorsCellSize, colorOrange) display.FillRectangle(p2x-gameColorsSpeed, p2y-gameColorsSpeed, gameColorsCellSize, gameColorsCellSize, colorPurple) @@ -56,16 +59,16 @@ func ColorGame() { p2x += v2x p2y += v2y - if (p1x < gameColorsSpeed && v1x < 0) || (p1x > (displayWidth-gameColorsSpeed) && v1x > 0) { + if (p1x < gameColorsSpeed && v1x < 0) || (p1x > gw && v1x > 0) { v1x = -v1x } - if (p2x < gameColorsSpeed && v2x < 0) || (p2x > (displayWidth-gameColorsSpeed) && v2x > 0) { + if (p2x < gameColorsSpeed && v2x < 0) || (p2x > gw && v2x > 0) { v2x = -v2x } - if (p1y < gameColorsSpeed && v1y < 0) || (p1y > (displayHeight-gameColorsSpeed) && v1y > 0) { + if (p1y < gameColorsSpeed && v1y < 0) || (p1y > gh && v1y > 0) { v1y = -v1y } - if (p2y < gameColorsSpeed && v2y < 0) || (p2y > (displayHeight-gameColorsSpeed) && v2y > 0) { + if (p2y < gameColorsSpeed && v2y < 0) || (p2y > gh && v2y > 0) { v2y = -v2y } diff --git a/gameoflife.go b/gameoflife.go index 94defc8..cb48efe 100644 --- a/gameoflife.go +++ b/gameoflife.go @@ -9,7 +9,7 @@ import ( const ( population = 20 - cellSize int16 = 6 + cellSize int16 = 5 gameWidth uint32 = uint32(displayWidth / cellSize) gameHeight uint32 = uint32(displayHeight / cellSize) ) @@ -20,24 +20,25 @@ var ( universe *game.Universe cellBuf = []color.RGBA{ - colorWhite, colorWhite, colorWhite, colorWhite, colorWhite, colorWhite, - colorWhite, colorWhite, colorBlack, colorBlack, colorWhite, colorWhite, - colorWhite, colorBlack, colorBlack, colorBlack, colorBlack, colorWhite, - colorWhite, colorBlack, colorBlack, colorBlack, colorBlack, colorWhite, - colorWhite, colorWhite, colorBlack, colorBlack, colorWhite, colorWhite, - colorWhite, colorWhite, colorWhite, colorWhite, colorWhite, colorWhite, + colorWhite, colorWhite, colorBlack, colorWhite, colorWhite, + colorWhite, colorBlack, colorBlack, colorBlack, colorWhite, + colorBlack, colorBlack, colorBlack, colorBlack, colorBlack, + colorWhite, colorBlack, colorBlack, colorBlack, colorWhite, + colorWhite, colorWhite, colorBlack, colorWhite, colorWhite, } ) func GameOfLife() { display.FillScreen(colorWhite) - gamebuffer = make([]byte, gameHeight*gameWidth) universe = game.NewUniverse(gameHeight, gameWidth) universe.Randomize(population) universe.Read(gamebuffer) - x, y, z := accel.ReadRawAcceleration() + x, y, z := int16(0), int16(0), int16(0) + if hasAccel { + x, y, z = accel.ReadRawAcceleration() + } speed := 10 for { @@ -49,7 +50,9 @@ func GameOfLife() { getInput() - x, y, z = accel.ReadRawAcceleration() + if hasAccel { + x, y, z = accel.ReadRawAcceleration() + } if x < (-31000) || x > 31000 || y < (-31000) || y > 31000 || z < (-31000) || z > 31000 || (!buttonsOldState[buttonA] && buttonsState[buttonA]) { universe.Reset() @@ -78,7 +81,6 @@ func drawGrid() { for rows = 0; rows < gameHeight; rows++ { for cols = 0; cols < gameWidth; cols++ { idx := universe.GetIndex(rows, cols) - switch { case universe.Cell(idx) == gamebuffer[idx]: // no change, so skip diff --git a/go.mod b/go.mod index 0536619..e3f7941 100644 --- a/go.mod +++ b/go.mod @@ -10,9 +10,6 @@ require ( tinygo.org/x/tinyfont v0.6.0 ) -require ( - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/tinygo-org/pio v0.3.0 // indirect -) +require github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect replace tinygo.org/x/drivers => /home/conejo/go/src/tinygo.org/x/drivers diff --git a/go.sum b/go.sum index a935b93..3ffa614 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= -github.com/tinygo-org/pio v0.3.0 h1:opEnOtw58KGB4RJD3/n/Rd0/djYGX3DeJiXLI6y/yDI= -github.com/tinygo-org/pio v0.3.0/go.mod h1:wf6c6lKZp+pQOzKKcpzchmRuhiMc27ABRuo7KVnaMFU= +tinygo.org/x/drivers v0.34.0 h1:lw8ePJeUSn9oICKBvQXHC9TIE+J00OfXfkGTrpXM9Iw= +tinygo.org/x/drivers v0.34.0/go.mod h1:ZdErNrApSABdVXjA1RejD67R8SNRI6RKVfYgQDZtKtk= tinygo.org/x/tinydraw v0.4.0 h1:U9V0mHz8/jPShKjlh199vCfq1ARFyUOD1b+FfqIwV8c= tinygo.org/x/tinydraw v0.4.0/go.mod h1:WCV/EMljTv8w04iAxjv+fRD6/4ffx0afATYeJlN90Yo= tinygo.org/x/tinyfont v0.6.0 h1:GibXDSFz6xrWnEDkDRo6vsbOyRw0MVj/eza3zNHMSHs= diff --git a/info.go b/info.go index 20dbfe5..fa77f42 100644 --- a/info.go +++ b/info.go @@ -62,7 +62,6 @@ func Info() { tinyfont.WriteLine(&display, &freesans.Bold9pt7b, (displayWidth-int16(w32))/2, qrSize+45, "for more information", colorWhite) } - quit := false for { time.Sleep(100 * time.Millisecond) getInput() diff --git a/leds.go b/leds.go index b0d6a0a..58e00a5 100644 --- a/leds.go +++ b/leds.go @@ -21,12 +21,12 @@ func Leds() { break } i += 2 - time.Sleep(50 * time.Millisecond) } + time.Sleep(50 * time.Millisecond) for l := 0; l < numLEDs; l++ { - ledColors[l] = colorBlack + ledColors[l] = colorBlackLED } leds.WriteColors(ledColors) time.Sleep(50 * time.Millisecond) diff --git a/main.go b/main.go index b9e532e..f06cc7e 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,7 @@ var ( colorPurple = color.RGBA{153, 51, 255, 255} colorWhite = color.RGBA{255, 255, 255, 255} colorBlack = color.RGBA{0, 0, 0, 255} + colorBlackLED = color.RGBA{0, 0, 0, 0} colorText = color.RGBA{160, 160, 160, 255} colorOrange = color.RGBA{255, 153, 51, 255} ) @@ -86,7 +87,7 @@ func main() { initHardware() display.FillScreen(colorBlack) setCustomData() - + adventure() Info() for { diff --git a/snake.go b/snake.go index fe0e20d..7f62239 100644 --- a/snake.go +++ b/snake.go @@ -27,11 +27,6 @@ const ( SnakeRight ) -const ( - displayWidthBLOCKS = 32 - displayHeightBLOCKS = 24 -) - var ( // Those variable are there for a more easy reading of the apple shape. re = colorRed // red @@ -54,7 +49,7 @@ var ( ) type Snake struct { - body [768][2]int16 + body [snakeWidthBLOCKS * snakeHeightBLOCKS][2]int16 length int16 direction int16 } @@ -73,7 +68,7 @@ var scoreStr string func NewSnakeGame() *SnakeGame { return &SnakeGame{ snake: Snake{ - body: [768][2]int16{ + body: [snakeWidthBLOCKS * snakeHeightBLOCKS][2]int16{ {0, 3}, {0, 2}, {0, 1}, @@ -126,39 +121,53 @@ func (g *SnakeGame) Over() { func (g *SnakeGame) splash() { display.FillScreen(bk) - logo := ` - ___ ___ ___ - / /\ / /\ / /\ - / /::\ / /::| / /::\ - /__/:/\:\ / /:|:| / /:/\:\ - _\_ \:\ \:\ / /:/|:|__ / /::\ \:\ + if displayWidth < 300 { + logoSmall := ` + ____ _ _ _ _ _____ +/ ___|| \| | /_\ | |/ / __| +\___ \| \ |/ _ \| ' < | _| +|___/ |_|\_/_/ \_\_|\_\___|` + for i, line := range strings.Split(strings.TrimSuffix(logoSmall, "\n"), "\n") { + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 6, int16(14+i*11), line+"\n", gr) + } + tinyfont.WriteLine(&display, &freesans.Regular12pt7b, 10, 95, "Press A to start", colorRed) + if g.score > 0 { + scoreStr = strconv.Itoa(g.score) + tinyfont.WriteLine(&display, &freesans.Regular12pt7b, 20, 126, "SCORE: "+scoreStr, colorText) + } + } else { + logo := ` + ___ ___ ___ + / /\ / /\ / /\ + / /::\ / /::| / /::\ + /__/:/\:\ / /:|:| / /:/\:\ + _\_ \:\ \:\ / /:/|:|__ / /::\ \:\ /__/\ \:\ \:\ /__/:/ |:| /\ /__/:/\:\_\:\ \ \:\ \:\_\/ \__\/ |:|/:/ \__\/ \:\/:/ - \ \:\_\:\ | |:/:/ \__\::/ - \ \:\/:/ |__|::/ / /:/ - \ \::/ /__/:/ /__/:/ - \__\/ \__\/ \__\/ - ___ ___ - / /\ / /\ - / /:/ / /::\ - / /:/ / /:/\:\ - / /::\____ / /::\ \:\ + \ \:\_\:\ | |:/:/ \__\::/ + \ \:\/:/ |__|::/ / /:/ + \ \::/ /__/:/ /__/:/ + \__\/ \__\/ \__\/ + ___ ___ + / /\ / /\ + / /:/ / /::\ + / /:/ / /:/\:\ + / /::\____ / /::\ \:\ /__/:/\:::::\ /__/:/\:\ \:\ \__\/~|:|~~~~ \ \:\ \:\_\/ - | |:| \ \:\ \:\ - | |:| \ \:\_\/ - |__|:| \ \:\ - \__\| \__\/ + | |:| \ \:\ \:\ + | |:| \ \:\_\/ + |__|:| \ \:\ + \__\| \__\/ ` - for i, line := range strings.Split(strings.TrimSuffix(logo, "\n"), "\n") { - tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 0, int16(-6+i*11), line+"\n", gr) - } - - tinyfont.WriteLine(&display, &freesans.Regular18pt7b, 30, 130, "Press A to start", colorRed) - - if g.score > 0 { - scoreStr = strconv.Itoa(g.score) - tinyfont.WriteLineRotated(&display, &freesans.Regular12pt7b, 300, 200, "SCORE: "+scoreStr, colorText, tinyfont.ROTATION_270) + for i, line := range strings.Split(strings.TrimSuffix(logo, "\n"), "\n") { + tinyfont.WriteLine(&display, &proggy.TinySZ8pt7b, 0, int16(-6+i*11), line+"\n", gr) + } + tinyfont.WriteLine(&display, &freesans.Regular18pt7b, 30, 130, "Press A to start", colorRed) + if g.score > 0 { + scoreStr = strconv.Itoa(g.score) + tinyfont.WriteLineRotated(&display, &freesans.Regular12pt7b, 300, 200, "SCORE: "+scoreStr, colorText, tinyfont.ROTATION_270) + } } } @@ -184,11 +193,11 @@ func (g *SnakeGame) collisionWithSnake(x, y int16) bool { } func (g *SnakeGame) createApple() { - g.appleX = int16(rand.Int31n(displayWidthBLOCKS)) - g.appleY = int16(rand.Int31n(displayHeightBLOCKS)) + g.appleX = int16(rand.Int31n(snakeWidthBLOCKS)) + g.appleY = int16(rand.Int31n(snakeHeightBLOCKS)) for g.collisionWithSnake(g.appleX, g.appleY) { - g.appleX = int16(rand.Int31n(displayWidthBLOCKS)) - g.appleY = int16(rand.Int31n(displayHeightBLOCKS)) + g.appleX = int16(rand.Int31n(snakeWidthBLOCKS)) + g.appleY = int16(rand.Int31n(snakeHeightBLOCKS)) } g.drawApple(g.appleX, g.appleY) } @@ -211,17 +220,17 @@ func (g *SnakeGame) moveSnake() { x++ break } - if x >= displayWidthBLOCKS { + if x >= snakeWidthBLOCKS { x = 0 } if x < 0 { - x = displayWidthBLOCKS - 1 + x = snakeWidthBLOCKS - 1 } - if y >= displayHeightBLOCKS { + if y >= snakeHeightBLOCKS { y = 0 } if y < 0 { - y = displayHeightBLOCKS - 1 + y = snakeHeightBLOCKS - 1 } if g.collisionWithSnake(x, y) {