{"id":20059942,"url":"https://github.com/ewaldhorn/bouncies","last_synced_at":"2025-05-05T15:32:07.461Z","repository":{"id":256546298,"uuid":"855711257","full_name":"ewaldhorn/bouncies","owner":"ewaldhorn","description":"A simple game written in Go and Ebitengine","archived":false,"fork":false,"pushed_at":"2024-10-27T19:25:07.000Z","size":23048,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-27T23:54:05.078Z","etag":null,"topics":["ebiten","ebitengine","game","game-development","go","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ewaldhorn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-11T10:39:42.000Z","updated_at":"2024-10-27T19:25:11.000Z","dependencies_parsed_at":"2024-10-27T21:20:30.299Z","dependency_job_id":null,"html_url":"https://github.com/ewaldhorn/bouncies","commit_stats":null,"previous_names":["ewaldhorn/bouncies"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ewaldhorn%2Fbouncies","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ewaldhorn%2Fbouncies/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ewaldhorn%2Fbouncies/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ewaldhorn%2Fbouncies/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ewaldhorn","download_url":"https://codeload.github.com/ewaldhorn/bouncies/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224452789,"owners_count":17313668,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ebiten","ebitengine","game","game-development","go","golang"],"created_at":"2024-11-13T13:11:15.363Z","updated_at":"2025-05-05T15:32:07.455Z","avatar_url":"https://github.com/ewaldhorn.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bouncies\n\nA simple game experiment written in Go and Ebitengine.\n\nThis project can possibly be used as a reference to get you started with Go game development,\nespecially if you are interested in using the fantastic Ebitengine game engine.\n\nIMPORTANT:  This is still very much WIP...  I'll be expanding it over the next\nfew weeks, schedule permitting. This is probably going to form the basis of one of my talks\nin the future...\n\n## Demo\n\nYou can play a live demo at \u003chttps://ewaldhorn.github.io/bouncies/\u003e.\n\nThis works best on a computer, though there's support planned for tablets eventually.\n\n![Screen Shot](./screenshot.png \"Screenshot\")\n\nThere's an improved game at \u003chttps://nofuss.co.za/toys/harvesteriii/\u003e for anyone interested in\nsomething a bit different.\n\n## What\n\nThe number one question I've received after some of my talks (list here: \u003chttps://nofuss.co.za/about/\u003e)\nfrom fellow or aspiring Go developers is:  \"Can I write a game with Go?\".\n\nYup. Absolutely! Go is a general-purpose language and can most definitely be used\nto write games.  A special bonus is the brilliant Ebitengine project that provides\nGo with a fantastic 2D game engine that works across multiple platforms.\n\n## Why\n\nBut why do any game development at all? It's not just fun, because game development\ncan challenge you in different ways. Especially when you have to do a bunch of work\nreally quickly to keep the framerate up! Games deal with concurrency, event sequencing,\nconstant data updates and user input, to name but a few things.\n\nI often use game development to learn new strategies and techniques, because the\nfeedback is instant and visual.  This makes it easier to experiment and see the\neffect of what I'm doing and turns dry theory into something fun and practical.\n\n### Playing\n\nThe idea is to out-bounce your enemy with your Bouncers. You and the enemy both\nhave a base from where bouncers will spawn over time. A base can store up to six\nbouncers, ready to be deployed.  Bases have shields which are depleted by enemy\nbouncers hitting it and replenished by friendly bouncers. Shields also regenerate\nover time.\n\n### Platforms\n\nEbitengine supports a variety of platforms, and for this game, I am mainly using\nWASM as my target platform.  Testing is often done as a desktop app and I then\nalso test via the browser in the WASM form.\n\nThe default `task test` command runs the game as a desktop app. It's really handy\nto have different options available.\n\n### Technologies\n\nI used a variety of technologies to make this all happen:\n\n| Tech         | Where                        | Why                                |\n| ------------ | ---------------------------- | ---------------------------------- |\n| Go           | \u003chttps://go.dev/\u003e            | Development language of choice     |\n| Ebitengine   | \u003chttps://ebitengine.org/\u003e    | Great 2D engine, with WASM support |\n| Task         | \u003chttps://taskfile.dev/\u003e      | Build tool of choice               |\n| GoLangCILint | \u003chttps://golangci-lint.run/\u003e | Go linter for code cleanup         |\n\n### Tasks\n\nFor convenience, I have a Task file. This helps save me from having to remember commands. Instead, Task does that for me!\n\nRun `task` to see a list of available tasks. Some are:\n\n| Task            | Action taken                                                                    |\n| --------------- | ------------------------------------------------------------------------------- |\n| buildproduction | Builds a production WASM binary, minus debug information                        |\n| buildwasm       | Builds the WASM project                                                         |\n| clean           | Removes the './bin/' folder                                                     |\n| coverreport     | Generates the test coverage report                                              |\n| default         | Lists available tasks                                                           |\n| lint            | Runs the 'golangci-lint' tool on the source code                                |\n| play            | Runs the desktop project, handy for quick local testing                         |\n| run             | Runs the files in the ./bin/ folder as-is, no build steps envoked. On port 9000 |\n| runwasm         | Runs the project in WASM on port 9000                                           |\n| setupexecjs     | Copies the wasm_exec.js and html files to the './bin/' folder                   |\n| test            | Runs the project tests                                                          |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fewaldhorn%2Fbouncies","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fewaldhorn%2Fbouncies","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fewaldhorn%2Fbouncies/lists"}